diff options
11 files changed, 58 insertions, 24 deletions
diff --git a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java index 521e72ae580..4bf61ff12d8 100644 --- a/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java +++ b/config-model-api/src/main/java/com/yahoo/config/model/api/ModelContext.java @@ -55,6 +55,7 @@ public interface ModelContext { default URI loadBalancerAddress() { return URI.create("http://localhost"); } + default boolean disableFileDistributor() { return false; } } } diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java index 74512e70ebe..7a1fab8dbd0 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModelFactory.java @@ -138,7 +138,8 @@ public class VespaModelFactory implements ModelFactory { .rotations(modelContext.properties().rotations()) .zone(zone) .now(clock.instant()) - .wantedNodeVespaVersion(modelContext.wantedNodeVespaVersion()); + .wantedNodeVespaVersion(modelContext.wantedNodeVespaVersion()) + .disableFiledistributor(modelContext.properties().disableFileDistributor()); modelContext.previousModel().ifPresent(builder::previousModel); return builder.build(); } diff --git a/config-model/src/test/java/com/yahoo/vespa/model/admin/AdminTestCase.java b/config-model/src/test/java/com/yahoo/vespa/model/admin/AdminTestCase.java index 946624a1cdb..d8bf40ac2d8 100644 --- a/config-model/src/test/java/com/yahoo/vespa/model/admin/AdminTestCase.java +++ b/config-model/src/test/java/com/yahoo/vespa/model/admin/AdminTestCase.java @@ -307,4 +307,24 @@ public class AdminTestCase { assertThat(sentinelConfig.service(2).name(), is("logd")); // No filedistributor service } + + @Test + public void testDisableFileDistributorForAllApps() { + DeployState state = new DeployState.Builder() + .disableFiledistributor(true) + .properties( + new DeployProperties.Builder(). + zone(new Zone(Environment.dev, RegionName.from("baz"))). + applicationId(new ApplicationId.Builder(). + tenant("quux"). + applicationName("foo").instanceName("bim").build()).build()).build(); + TestRoot root = new TestDriver().buildModel(state); + String localhost = HostName.getLocalhost(); + SentinelConfig sentinelConfig = root.getConfig(SentinelConfig.class, "hosts/" + localhost); + assertThat(sentinelConfig.service().size(), is(3)); + assertThat(sentinelConfig.service(0).name(), is("logserver")); + assertThat(sentinelConfig.service(1).name(), is("slobrok")); + assertThat(sentinelConfig.service(2).name(), is("logd")); + } + } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java index c0c9c309576..4502cc7e223 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/ModelContextImpl.java @@ -130,8 +130,8 @@ public class ModelContextImpl implements ModelContext { public Version wantedNodeVespaVersion() { return wantedNodeVespaVersion; } /** - * @author lulf - */ + * @author Ulf Lilleengen + */ public static class Properties implements ModelContext.Properties { private final ApplicationId applicationId; @@ -141,6 +141,7 @@ public class ModelContextImpl implements ModelContext { private final boolean hostedVespa; private final Zone zone; private final Set<Rotation> rotations; + private final boolean disableFileDistributor; public Properties(ApplicationId applicationId, boolean multitenant, @@ -148,7 +149,8 @@ public class ModelContextImpl implements ModelContext { HostName loadBalancerName, boolean hostedVespa, Zone zone, - Set<Rotation> rotations) { + Set<Rotation> rotations, + boolean disableFileDistributor) { this.applicationId = applicationId; this.multitenant = multitenant; this.configServerSpecs = configServerSpecs; @@ -156,6 +158,7 @@ public class ModelContextImpl implements ModelContext { this.hostedVespa = hostedVespa; this.zone = zone; this.rotations = rotations; + this.disableFileDistributor = disableFileDistributor; } @Override @@ -189,9 +192,10 @@ public class ModelContextImpl implements ModelContext { } @Override - public Set<Rotation> rotations() { - return rotations; - } + public Set<Rotation> rotations() { return rotations; } + + @Override + public boolean disableFileDistributor() { return disableFileDistributor; } } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java index 48732814919..ea8405f6b65 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/modelfactory/ModelsBuilder.java @@ -185,7 +185,8 @@ public abstract class ModelsBuilder<MODELRESULT extends ModelResult> { HostName.from(configserverConfig.loadBalancerAddress()), configserverConfig.hostedVespa(), zone, - rotations); + rotations, + configserverConfig.disableFiledistributor()); } /** diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java index 531085883c4..70db406bd53 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java @@ -155,7 +155,8 @@ public class SessionPreparer { HostName.from(configserverConfig.loadBalancerAddress()), configserverConfig.hostedVespa(), zone, - rotationsSet); + rotationsSet, + configserverConfig.disableFiledistributor()); this.preparedModelsBuilder = new PreparedModelsBuilder(modelFactoryRegistry, permanentApplicationPackage, configDefinitionRepo, diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenants.java b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenants.java index d2cf17a38d4..5fb62a68e3e 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenants.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenants.java @@ -96,18 +96,17 @@ public class Tenants implements ConnectionStateListener, PathChildrenCacheListen } /** - * New instance containing the given tenants. This will not create Zookeeper watches. For testing only + * New instance containing the given tenants. Creates no system tenants and noZookeeper watches. For testing only. * @param globalComponentRegistry a {@link com.yahoo.vespa.config.server.GlobalComponentRegistry} instance * @param tenants a collection of {@link Tenant}s */ + // TODO: Get rid of the second argument and let callers use addTenant() instead public Tenants(GlobalComponentRegistry globalComponentRegistry, Collection<Tenant> tenants) { this.globalComponentRegistry = globalComponentRegistry; this.curator = globalComponentRegistry.getCurator(); metricUpdater = globalComponentRegistry.getMetrics().getOrCreateMetricUpdater(Collections.emptyMap()); this.tenantListeners.add(globalComponentRegistry.getTenantListener()); curator.create(tenantsPath); - createSystemTenants(globalComponentRegistry.getConfigserverConfig()); - createTenants(); this.directoryCache = curator.createDirectoryCache(tenantsPath.getAbsolute(), false, false, pathChildrenExecutor); this.tenants.putAll(addTenants(tenants)); } @@ -120,13 +119,13 @@ public class Tenants implements ConnectionStateListener, PathChildrenCacheListen // Pre-condition: tenants path needs to exist in zk private LinkedHashMap<TenantName, Tenant> addTenants(Collection<Tenant> newTenants) { - LinkedHashMap<TenantName, Tenant> sessionTenants = new LinkedHashMap<>(); + LinkedHashMap<TenantName, Tenant> tenants = new LinkedHashMap<>(); for (Tenant t : newTenants) { - sessionTenants.put(t.getName(), t); + tenants.put(t.getName(), t); } - log.log(LogLevel.DEBUG, "Tenants at startup: " + sessionTenants); - metricUpdater.setTenants(tenants.size()); - return sessionTenants; + log.log(LogLevel.DEBUG, "Tenants at startup: " + tenants); + metricUpdater.setTenants(this.tenants.size()); + return tenants; } public synchronized void addTenant(TenantName tenantName) throws Exception { @@ -191,7 +190,7 @@ public class Tenants implements ConnectionStateListener, PathChildrenCacheListen try { Tenant tenant = TenantBuilder.create(globalComponentRegistry, tenantName).build(); notifyNewTenant(tenant); - tenants.put(tenantName, tenant); + tenants.putIfAbsent(tenantName, tenant); } catch (Exception e) { log.log(LogLevel.WARNING, "Error loading tenant '" + tenantName + "', skipping.", e); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java index aed0a6a9750..e4c336a55f1 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ModelContextImplTest.java @@ -48,7 +48,8 @@ public class ModelContextImplTest { null, false, Zone.defaultZone(), - rotations), + rotations, + false), Optional.empty(), new Version(6), new Version(6)); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java index d9a0db7e811..63f0f5f26b7 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java @@ -23,6 +23,7 @@ import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.AllocatedHosts; import com.yahoo.config.provision.ProvisionLogger; import com.yahoo.config.provision.Provisioner; +import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Version; import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.config.server.ApplicationRepository; @@ -57,6 +58,8 @@ import java.util.Optional; */ public class DeployTester { + private static final TenantName tenantName = TenantName.from("deploytester"); + private final Clock clock; private final Tenants tenants; private final File testApp; @@ -95,6 +98,7 @@ public class DeployTester { try { this.testApp = new File(appPath); this.tenants = new Tenants(componentRegistry, Collections.emptySet()); + tenants.addTenant(tenantName); } catch (Exception e) { throw new IllegalArgumentException(e); @@ -103,7 +107,7 @@ public class DeployTester { } public Tenant tenant() { - return tenants.defaultTenant(); + return tenants.getTenant(tenantName); } /** Create a model factory for the version of this source*/ diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/RedeployTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/RedeployTest.java index 76734aadae7..50e8c711330 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/RedeployTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/RedeployTest.java @@ -7,7 +7,6 @@ import com.yahoo.config.model.api.ModelFactory; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.InstanceName; -import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Version; import com.yahoo.test.ManualClock; import com.yahoo.vespa.config.server.session.LocalSession; @@ -60,7 +59,7 @@ public class RedeployTest { modelFactories.add(DeployTester.createModelFactory(Clock.systemUTC())); modelFactories.add(DeployTester.createFailingModelFactory(Version.fromIntValues(1, 0, 0))); DeployTester tester = new DeployTester("ignored/app/path", modelFactories); - ApplicationId id = ApplicationId.from(TenantName.from("default"), + ApplicationId id = ApplicationId.from(tester.tenant().getName(), ApplicationName.from("default"), InstanceName.from("default")); assertFalse(tester.redeployFromLocalActive(id).isPresent()); diff --git a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReceiver.java b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReceiver.java index 3999389d2c7..d8016416e0a 100644 --- a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReceiver.java +++ b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReceiver.java @@ -15,6 +15,7 @@ import java.io.File; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.file.Files; +import java.nio.file.Path; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; @@ -107,10 +108,12 @@ public class FileReceiver { File fileReferenceDir = new File(downloadDirectory, fileReference.value()); try { + File tempFile = new File(Files.createTempDirectory("downloaded").toFile(), filename); + Files.write(tempFile.toPath(), content); Files.createDirectories(fileReferenceDir.toPath()); File file = new File(fileReferenceDir, filename); - log.log(LogLevel.INFO, "Writing data to " + file.getAbsolutePath()); - Files.write(file.toPath(), content); + Files.move(tempFile.toPath(), file.toPath()); + log.log(LogLevel.INFO, "Data written to " + file.getAbsolutePath()); downloader.completedDownloading(fileReference, file); } catch (IOException e) { log.log(LogLevel.ERROR, "Failed writing file: " + e.getMessage()); |