diff options
author | Harald Musum <musum@oath.com> | 2017-11-30 22:38:20 +0100 |
---|---|---|
committer | Harald Musum <musum@oath.com> | 2017-11-30 22:38:20 +0100 |
commit | 3394315a5af577a4e7ba888ff9de1028a386fa27 (patch) | |
tree | 6b4e62429848ae089e3d3eba7a96a7b1045bab7d /config-model | |
parent | 86777e222a600608f034739428ed42adb3d46a6e (diff) |
Do not setup a service for filedistributor when it is disabled
Some workarounds needed to still file distribution config even when such a
serice is not set up (can be simplified a lot when file distributor is removed
for good)
Diffstat (limited to 'config-model')
8 files changed, 155 insertions, 65 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java b/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java index d751e332ff3..c540a5f62d2 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/ConfigProxy.java @@ -16,6 +16,8 @@ package com.yahoo.vespa.model; */ public class ConfigProxy extends AbstractService { + public final static int BASEPORT = 19090; + /** * Creates a new ConfigProxy instance. * @@ -31,7 +33,7 @@ public class ConfigProxy extends AbstractService { /** * Returns the desired base port for this service. */ - public int getWantedPort() { return 19090; } + public int getWantedPort() { return BASEPORT; } /** * The desired base port is the only allowed base port. diff --git a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java index 2575cdb6237..d892d70e0de 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/admin/Admin.java @@ -14,6 +14,8 @@ import com.yahoo.vespa.model.admin.monitoring.MetricsConsumer; import com.yahoo.vespa.model.admin.monitoring.Monitoring; import com.yahoo.vespa.model.admin.monitoring.builder.Metrics; import com.yahoo.vespa.model.container.ContainerCluster; +import com.yahoo.vespa.model.filedistribution.DummyFileDistributionConfigProducer; +import com.yahoo.vespa.model.filedistribution.FileDistributionConfigProvider; import com.yahoo.vespa.model.filedistribution.FileDistributionConfigProducer; import com.yahoo.vespa.model.filedistribution.FileDistributor; import com.yahoo.vespa.model.filedistribution.FileDistributorService; @@ -213,11 +215,25 @@ public class Admin extends AbstractConfigProducer implements Serializable { fileDistributor.fileSourceHost() + "'. Hostsystem=" + getHostSystem()); } - FileDistributorService fds = new FileDistributorService(fileDistribution, host.getHost().getHostName(), - fileDistribution.getFileDistributor(), fileDistribution.getOptions(), host == deployHost); - fds.setHostResource(host); - fds.initService(); - fileDistribution.addFileDistributionService(host.getHost(), fds); + FileDistributionConfigProvider configProvider = + new FileDistributionConfigProvider(fileDistributor, + fileDistribution.getOptions(), + host == deployHost, + host.getHost()); + if (fileDistribution.getOptions().disableFiledistributor()) { + DummyFileDistributionConfigProducer dummyFileDistributionConfigProducer = + new DummyFileDistributionConfigProducer(fileDistribution, + host.getHost().getHostName(), + configProvider); + fileDistribution.addFileDistributionConfigProducer(host.getHost(), dummyFileDistributionConfigProducer); + } else { + FileDistributorService fds = new FileDistributorService(fileDistribution, + host.getHost().getHostName(), + configProvider); + fds.setHostResource(host); + fds.initService(); + fileDistribution.addFileDistributionConfigProducer(host.getHost(), fds); + } } private boolean deployHostIsMissing(HostResource deployHost) { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java b/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java index 8ccc0b3e011..5925ec978bb 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/Container.java @@ -330,7 +330,7 @@ public class Container extends AbstractService implements FileDistributionConfigProducer fileDistribution = getRoot().getFileDistributionConfigProducer(); if (fileDistribution != null) { - builder.configid(fileDistribution.getFileDistributorService(getHost()).getConfigId()); + builder.configid(fileDistribution.getConfigProducer(getHost()).getConfigId()); } return builder; } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/DummyFileDistributionConfigProducer.java b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/DummyFileDistributionConfigProducer.java new file mode 100644 index 00000000000..1b1e66594d1 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/DummyFileDistributionConfigProducer.java @@ -0,0 +1,42 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.model.filedistribution; + +import com.yahoo.cloud.config.filedistribution.FiledistributorConfig; +import com.yahoo.cloud.config.filedistribution.FiledistributorrpcConfig; +import com.yahoo.cloud.config.filedistribution.FilereferencesConfig; +import com.yahoo.config.model.producer.AbstractConfigProducer; + +/** + * @author hmusum + * <p> + * Dummy file distribution config producer, needed for serving file distribution config when there is no FiledistributorService. + */ +public class DummyFileDistributionConfigProducer extends AbstractConfigProducer implements + FiledistributorConfig.Producer, + FiledistributorrpcConfig.Producer, + FilereferencesConfig.Producer { + + private final FileDistributionConfigProvider configProvider; + + public DummyFileDistributionConfigProducer(AbstractConfigProducer parent, + String hostname, + FileDistributionConfigProvider configProvider) { + super(parent, hostname); + this.configProvider = configProvider; + } + + @Override + public void getConfig(FiledistributorConfig.Builder builder) { + configProvider.getConfig(builder); + } + + @Override + public void getConfig(FiledistributorrpcConfig.Builder builder) { + configProvider.getConfig(builder); + } + + @Override + public void getConfig(FilereferencesConfig.Builder builder) { + configProvider.getConfig(builder); + } +} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProducer.java b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProducer.java index 9e5e3074c5e..c863b180b21 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProducer.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProducer.java @@ -10,11 +10,13 @@ import java.util.IdentityHashMap; import java.util.Map; /** - * @author tonytv + * @author hmusum + * <p> + * File distribution config producer, delegates getting config to {@link DummyFileDistributionConfigProducer} (one per host) */ public class FileDistributionConfigProducer extends AbstractConfigProducer { - private final Map<Host, FileDistributorService> fileDistributorServices = new IdentityHashMap<>(); + private final Map<Host, AbstractConfigProducer> fileDistributionConfigProducers = new IdentityHashMap<>(); private final FileDistributor fileDistributor; private final FileDistributionOptions options; @@ -24,14 +26,6 @@ public class FileDistributionConfigProducer extends AbstractConfigProducer { this.options = options; } - public FileDistributorService getFileDistributorService(Host host) { - FileDistributorService service = fileDistributorServices.get(host); - if (service == null) { - throw new IllegalStateException("No file distribution service for host " + host); - } - return service; - } - public FileDistributor getFileDistributor() { return fileDistributor; } @@ -40,8 +34,8 @@ public class FileDistributionConfigProducer extends AbstractConfigProducer { return options; } - public void addFileDistributionService(Host host, FileDistributorService fds) { - fileDistributorServices.put(host, fds); + public void addFileDistributionConfigProducer(Host host, AbstractConfigProducer fileDistributionConfigProducer) { + fileDistributionConfigProducers.put(host, fileDistributionConfigProducer); } public static class Builder { @@ -58,4 +52,8 @@ public class FileDistributionConfigProducer extends AbstractConfigProducer { } } + public AbstractConfigProducer getConfigProducer(Host host) { + return fileDistributionConfigProducers.get(host); + } + } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProvider.java b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProvider.java new file mode 100644 index 00000000000..33cc581c3a8 --- /dev/null +++ b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributionConfigProvider.java @@ -0,0 +1,59 @@ +// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.model.filedistribution; + +import com.yahoo.cloud.config.filedistribution.FiledistributorConfig; +import com.yahoo.cloud.config.filedistribution.FiledistributorrpcConfig; +import com.yahoo.cloud.config.filedistribution.FilereferencesConfig; +import com.yahoo.config.FileReference; +import com.yahoo.config.model.api.FileDistribution; +import com.yahoo.vespa.model.ConfigProxy; +import com.yahoo.vespa.model.Host; +import com.yahoo.vespa.model.admin.FileDistributionOptions; + +import java.util.Collection; + +public class FileDistributionConfigProvider { + + private final FileDistributor fileDistributor; + private final FileDistributionOptions fileDistributionOptions; + private final boolean sendAllFiles; + private final Host host; + + public FileDistributionConfigProvider(FileDistributor fileDistributor, + FileDistributionOptions fileDistributionOptions, + boolean sendAllFiles, + Host host) { + this.fileDistributor = fileDistributor; + this.fileDistributionOptions = fileDistributionOptions; + this.sendAllFiles = sendAllFiles; + this.host = host; + } + + public void getConfig(FiledistributorConfig.Builder builder) { + fileDistributionOptions.getConfig(builder); + builder.torrentport(FileDistributorService.BASEPORT + 1); + builder.stateport(FileDistributorService.BASEPORT + 2); + builder.hostname(host.getHostName()); + builder.filedbpath(FileDistribution.getDefaultFileDBPath().toString()); + } + + public void getConfig(FiledistributorrpcConfig.Builder builder) { + // If disabled config proxy should act as file distributor, so use config proxy port + int port = (fileDistributionOptions.disableFiledistributor()) ? ConfigProxy.BASEPORT : FileDistributorService.BASEPORT; + builder.connectionspec("tcp/" + host.getHostName() + ":" + port); + } + + public void getConfig(FilereferencesConfig.Builder builder) { + for (FileReference reference : getFileReferences()) { + builder.filereferences(reference.value()); + } + } + + private Collection<FileReference> getFileReferences() { + if (sendAllFiles) { + return fileDistributor.allFilesToSend(); + } else { + return fileDistributor.filesToSendToHost(host); + } + } +} diff --git a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributorService.java b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributorService.java index 9129e951657..986334125d2 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributorService.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/filedistribution/FileDistributorService.java @@ -4,59 +4,36 @@ package com.yahoo.vespa.model.filedistribution; import com.yahoo.cloud.config.filedistribution.FiledistributorConfig; import com.yahoo.cloud.config.filedistribution.FiledistributorrpcConfig; import com.yahoo.cloud.config.filedistribution.FilereferencesConfig; -import com.yahoo.config.FileReference; - -import com.yahoo.config.model.api.FileDistribution; import com.yahoo.config.model.producer.AbstractConfigProducer; import com.yahoo.vespa.model.AbstractService; -import com.yahoo.vespa.model.admin.FileDistributionOptions; - -import java.util.Collection; /** * @author Tony Vaagenes + * + * Config is produced by {@link FileDistributionConfigProvider} */ public class FileDistributorService extends AbstractService implements FiledistributorConfig.Producer, FiledistributorrpcConfig.Producer, FilereferencesConfig.Producer { - private final static int BASEPORT = 19092; - private final FileDistributor fileDistributor; - private final FileDistributionOptions fileDistributionOptions; - private final boolean sendAllFiles; + final static int BASEPORT = 19092; - private Collection<FileReference> getFileReferences() { - if (sendAllFiles) { - return fileDistributor.allFilesToSend(); - } else { - return fileDistributor.filesToSendToHost(getHost()); - } - } + private final FileDistributionConfigProvider configProvider; - public FileDistributorService(AbstractConfigProducer parent, - String name, - FileDistributor fileDistributor, - FileDistributionOptions fileDistributionOptions, - boolean sendAllFiles) { - super(parent, name); + public FileDistributorService(AbstractConfigProducer parent, String hostname, FileDistributionConfigProvider configProvider) { + super(parent, hostname); + this.configProvider = configProvider; portsMeta.on(0).tag("rpc"); portsMeta.on(1).tag("torrent"); portsMeta.on(2).tag("http").tag("state"); setProp("clustertype", "filedistribution"); setProp("clustername", "admin"); - - this.fileDistributor = fileDistributor; - this.fileDistributionOptions = fileDistributionOptions; - this.sendAllFiles = sendAllFiles; } @Override public String getStartupCommand() { - // If disabled config proxy should act as file distributor, so don't start this service - return (fileDistributionOptions.disableFiledistributor()) - ? null - : "exec $ROOT/sbin/vespa-filedistributor" + " --configid " + getConfigId(); + return "exec $ROOT/sbin/vespa-filedistributor" + " --configid " + getConfigId(); } @Override @@ -69,6 +46,7 @@ public class FileDistributorService extends AbstractService implements return true; } + @Override public int getPortCount() { return 3; } @@ -80,24 +58,16 @@ public class FileDistributorService extends AbstractService implements @Override public void getConfig(FiledistributorConfig.Builder builder) { - fileDistributionOptions.getConfig(builder); - builder.torrentport(getRelativePort(1)); - builder.stateport(getRelativePort(2)); - builder.hostname(getHostName()); - builder.filedbpath(FileDistribution.getDefaultFileDBPath().toString()); + configProvider.getConfig(builder); } @Override public void getConfig(FiledistributorrpcConfig.Builder builder) { - // If disabled config proxy should act as file distributor, so use config proxy port - int port = (fileDistributionOptions.disableFiledistributor()) ? 19090 : getRelativePort(0); - builder.connectionspec("tcp/" + getHostName() + ":" + port); + configProvider.getConfig(builder); } @Override public void getConfig(FilereferencesConfig.Builder builder) { - for (FileReference reference : getFileReferences()) { - builder.filereferences(reference.value()); - } + configProvider.getConfig(builder); } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java index 941d1fe1ff3..819d5904c25 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/search/SearchNode.java @@ -19,6 +19,7 @@ import com.yahoo.vespa.model.admin.monitoring.Monitoring; import com.yahoo.vespa.model.application.validation.RestartConfigs; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; import com.yahoo.vespa.model.content.ContentNode; +import com.yahoo.vespa.model.filedistribution.DummyFileDistributionConfigProducer; import com.yahoo.vespa.model.filedistribution.FileDistributionConfigProducer; import com.yahoo.vespa.model.filedistribution.FileDistributorService; import org.w3c.dom.Element; @@ -228,10 +229,12 @@ public class SearchNode extends AbstractService implements public void getConfig(FiledistributorrpcConfig.Builder builder) { FileDistributionConfigProducer fileDistribution = getRoot().getFileDistributionConfigProducer(); if (fileDistribution != null) { - FileDistributorService fds = fileDistribution.getFileDistributorService(getHost()); - if (fds != null) { - fds.getConfig(builder); - } + AbstractConfigProducer configProducer = fileDistribution.getConfigProducer(getHost()); + // TODO: Hack, will be fixed when FileDistributorService is gone + if (configProducer instanceof DummyFileDistributionConfigProducer) + ((DummyFileDistributionConfigProducer) configProducer).getConfig(builder); + else + ((FileDistributorService) configProducer).getConfig(builder); } } |