aboutsummaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorHarald Musum <musum@oath.com>2017-09-21 13:44:35 +0200
committerHarald Musum <musum@oath.com>2017-09-21 13:44:35 +0200
commite292e0940cce9b5b1eb4481fd92d57fb3fc44908 (patch)
tree55427c1259f64a5ae887e8b2f07c3ad1434cd718 /configserver
parent675b3bb296033fda08c9bb90536f243675738019 (diff)
Add proper test of prugin of old inactive sessions
* Add support for injecting a clock to make it possible to test time-related scenarios * Add test
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java27
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/GlobalComponentRegistry.java2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistry.java4
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSessionRepo.java23
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionFactoryImpl.java15
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantBuilder.java21
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java8
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/TestComponentRegistry.java19
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java41
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/deploy/RedeployTest.java57
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java14
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java15
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java14
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java16
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java15
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TestTenantBuilder.java2
16 files changed, 183 insertions, 110 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
index 61458d871ac..f49c32b061a 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
@@ -26,6 +26,7 @@ import com.yahoo.vespa.config.server.application.LogServerLogGrabber;
import com.yahoo.vespa.config.server.application.TenantApplications;
import com.yahoo.vespa.config.server.configchange.ConfigChangeActions;
import com.yahoo.vespa.config.server.deploy.Deployment;
+import com.yahoo.vespa.config.server.http.SimpleHttpFetcher;
import com.yahoo.vespa.config.server.provision.HostProvisionerProvider;
import com.yahoo.vespa.config.server.session.LocalSession;
import com.yahoo.vespa.config.server.session.LocalSessionRepo;
@@ -81,13 +82,35 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
ApplicationConvergenceChecker applicationConvergenceChecker,
HttpProxy httpProxy,
ConfigserverConfig configserverConfig) {
+ this(tenants, hostProvisionerProvider.getHostProvisioner(), curator, logServerLogGrabber,
+ applicationConvergenceChecker, httpProxy, configserverConfig, Clock.systemUTC());
+ }
+
+ // For testing
+ public ApplicationRepository(Tenants tenants,
+ Provisioner hostProvisioner,
+ Curator curator,
+ Clock clock) {
+ this(tenants, Optional.of(hostProvisioner), curator, new LogServerLogGrabber(),
+ new ApplicationConvergenceChecker(), new HttpProxy(new SimpleHttpFetcher()),
+ new ConfigserverConfig(new ConfigserverConfig.Builder()), clock);
+ }
+
+ private ApplicationRepository(Tenants tenants,
+ Optional<Provisioner> hostProvisioner,
+ Curator curator,
+ LogServerLogGrabber logServerLogGrabber,
+ ApplicationConvergenceChecker applicationConvergenceChecker,
+ HttpProxy httpProxy,
+ ConfigserverConfig configserverConfig,
+ Clock clock) {
this.tenants = tenants;
- this.hostProvisioner = hostProvisionerProvider.getHostProvisioner();
+ this.hostProvisioner = hostProvisioner;
this.curator = curator;
this.logServerLogGrabber = logServerLogGrabber;
this.convergeChecker = applicationConvergenceChecker;
this.httpProxy = httpProxy;
- this.clock = Clock.systemUTC();
+ this.clock = clock;
this.configserverConfig = configserverConfig;
this.environment = Environment.from(configserverConfig.environment());
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/GlobalComponentRegistry.java b/configserver/src/main/java/com/yahoo/vespa/config/server/GlobalComponentRegistry.java
index 4f26cfa265b..b6e8f013fd1 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/GlobalComponentRegistry.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/GlobalComponentRegistry.java
@@ -14,6 +14,7 @@ import com.yahoo.vespa.config.server.tenant.TenantListener;
import com.yahoo.vespa.config.server.zookeeper.ConfigCurator;
import com.yahoo.vespa.curator.Curator;
+import java.time.Clock;
import java.util.Optional;
/**
@@ -38,5 +39,6 @@ public interface GlobalComponentRegistry {
ModelFactoryRegistry getModelFactoryRegistry();
Optional<Provisioner> getHostProvisioner();
Zone getZone();
+ Clock getClock();
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistry.java b/configserver/src/main/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistry.java
index fa5224732f6..d0b830aceaa 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistry.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistry.java
@@ -17,6 +17,7 @@ import com.yahoo.vespa.config.server.tenant.TenantListener;
import com.yahoo.vespa.config.server.zookeeper.ConfigCurator;
import com.yahoo.vespa.curator.Curator;
+import java.time.Clock;
import java.util.Optional;
/**
@@ -108,4 +109,7 @@ public class InjectedGlobalComponentRegistry implements GlobalComponentRegistry
public Zone getZone() {
return zone;
}
+
+ @Override
+ public Clock getClock() {return Clock.systemUTC();}
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSessionRepo.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSessionRepo.java
index daa6cefad1f..d2270ddddfd 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSessionRepo.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSessionRepo.java
@@ -35,6 +35,18 @@ public class LocalSessionRepo extends SessionRepo<LocalSession> {
loadSessions(tenantFileSystemDirs.path(), loader);
}
+ // Constructor public only for testing
+ public LocalSessionRepo(TenantApplications applicationRepo, Clock clock) {
+ this(applicationRepo, clock, TimeUnit.DAYS.toMillis(1));
+ }
+
+ // Constructor public only for testing
+ public LocalSessionRepo(TenantApplications applicationRepo, Clock clock, long sessionLifetime) {
+ this.applicationRepo = applicationRepo;
+ this.sessionLifetime = sessionLifetime;
+ this.clock = clock;
+ }
+
private void loadSessions(File applicationsDir, LocalSessionLoader loader) {
File[] applications = applicationsDir.listFiles(sessionApplicationsFilter);
if (applications == null) {
@@ -63,17 +75,6 @@ public class LocalSessionRepo extends SessionRepo<LocalSession> {
return null;
}
- // Constructor only for testing
- public LocalSessionRepo(TenantApplications applicationRepo, Clock clock, long sessionLifetime) {
- this.applicationRepo = applicationRepo;
- this.sessionLifetime = sessionLifetime;
- this.clock = clock;
- }
-
- public LocalSessionRepo(TenantApplications applicationRepo) {
- this(applicationRepo, Clock.systemUTC(), TimeUnit.DAYS.toMillis(1));
- }
-
@Override
public synchronized void addSession(LocalSession session) {
purgeOldSessions();
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionFactoryImpl.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionFactoryImpl.java
index c2655d1a1b3..1d5025f2e61 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionFactoryImpl.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionFactoryImpl.java
@@ -22,6 +22,7 @@ import com.yahoo.vespa.config.server.zookeeper.ConfigCurator;
import com.yahoo.vespa.curator.Curator;
import java.io.File;
+import java.time.Clock;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
@@ -52,12 +53,15 @@ public class SessionFactoryImpl implements SessionFactory, LocalSessionLoader {
private final TenantName tenant;
private final String serverId;
private final Optional<NodeFlavors> nodeFlavors;
+ private final Clock clock;
public SessionFactoryImpl(GlobalComponentRegistry globalComponentRegistry,
SessionCounter sessionCounter,
Path sessionsPath,
TenantApplications applicationRepo,
- TenantFileSystemDirs tenantFileSystemDirs, HostValidator<ApplicationId> hostRegistry, TenantName tenant) {
+ TenantFileSystemDirs tenantFileSystemDirs,
+ HostValidator<ApplicationId> hostRegistry,
+ TenantName tenant) {
this.hostRegistry = hostRegistry;
this.tenant = tenant;
this.sessionPreparer = globalComponentRegistry.getSessionPreparer();
@@ -71,6 +75,7 @@ public class SessionFactoryImpl implements SessionFactory, LocalSessionLoader {
this.defRepo = globalComponentRegistry.getConfigDefinitionRepo();
this.serverId = globalComponentRegistry.getConfigserverConfig().serverId();
this.nodeFlavors = globalComponentRegistry.getZone().nodeFlavors();
+ this.clock = globalComponentRegistry.getClock();
}
@Override
@@ -100,9 +105,11 @@ public class SessionFactoryImpl implements SessionFactory, LocalSessionLoader {
private LocalSession createSessionFromApplication(ApplicationPackage applicationPackage,
long sessionId,
- SessionZooKeeperClient sessionZKClient, TimeoutBudget timeoutBudget) {
+ SessionZooKeeperClient sessionZKClient,
+ TimeoutBudget timeoutBudget,
+ Clock clock) {
log.log(LogLevel.DEBUG, Tenants.logPre(tenant) + "Creating session " + sessionId + " in ZooKeeper");
- sessionZKClient.createNewSession(System.currentTimeMillis(), TimeUnit.MILLISECONDS);
+ sessionZKClient.createNewSession(clock.instant().toEpochMilli(), TimeUnit.MILLISECONDS);
log.log(LogLevel.DEBUG, Tenants.logPre(tenant) + "Creating upload waiter for session " + sessionId);
Curator.CompletionWaiter waiter = sessionZKClient.getUploadWaiter();
log.log(LogLevel.DEBUG, Tenants.logPre(tenant) + "Done creating upload waiter for session " + sessionId);
@@ -145,7 +152,7 @@ public class SessionFactoryImpl implements SessionFactory, LocalSessionLoader {
IOUtils.copyDirectory(applicationFile, userApplicationDir);
ApplicationPackage applicationPackage = createApplication(applicationFile, userApplicationDir, applicationName, sessionId, currentlyActiveSession);
applicationPackage.writeMetaData();
- return createSessionFromApplication(applicationPackage, sessionId, sessionZooKeeperClient, timeoutBudget);
+ return createSessionFromApplication(applicationPackage, sessionId, sessionZooKeeperClient, timeoutBudget, clock);
} catch (Exception e) {
throw new RuntimeException("Error creating session " + sessionIdPath, e);
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantBuilder.java b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantBuilder.java
index f4a5e941ac2..ed4339e9914 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantBuilder.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/TenantBuilder.java
@@ -46,7 +46,6 @@ public class TenantBuilder {
private RemoteSessionFactory remoteSessionFactory;
private TenantFileSystemDirs tenantFileSystemDirs;
private HostValidator<ApplicationId> hostValidator;
- private Clock clock = Clock.systemUTC();
private TenantBuilder(GlobalComponentRegistry componentRegistry, TenantName tenant, Path zkPath) {
this.componentRegistry = componentRegistry;
@@ -89,11 +88,6 @@ public class TenantBuilder {
return this;
}
- public TenantBuilder withClock(Clock clock) {
- this.clock = clock;
- return this;
- }
-
/**
* Create a real tenant from the properties given by this builder.
*
@@ -103,7 +97,7 @@ public class TenantBuilder {
public Tenant build() throws Exception {
createTenantRequestHandler();
createApplicationRepo();
- createRemoteSessionFactory(clock);
+ createRemoteSessionFactory(componentRegistry.getClock());
createRemoteSessionRepo();
createSessionCounter();
createServerDbDirs();
@@ -123,13 +117,15 @@ public class TenantBuilder {
private void createLocalSessionRepo() {
if (localSessionRepo == null) {
- localSessionRepo = new LocalSessionRepo(tenantFileSystemDirs, localSessionLoader, applicationRepo, Clock.systemUTC(), componentRegistry.getConfigserverConfig().sessionLifetime());
+ localSessionRepo = new LocalSessionRepo(tenantFileSystemDirs, localSessionLoader, applicationRepo,
+ componentRegistry.getClock(), componentRegistry.getConfigserverConfig().sessionLifetime());
}
}
private void createSessionFactory() {
if (sessionFactory == null || localSessionLoader == null) {
- SessionFactoryImpl impl = new SessionFactoryImpl(componentRegistry, sessionCounter, sessionsPath, applicationRepo, tenantFileSystemDirs, hostValidator, tenant);
+ SessionFactoryImpl impl = new SessionFactoryImpl(componentRegistry, sessionCounter, sessionsPath,
+ applicationRepo, tenantFileSystemDirs, hostValidator, tenant);
if (sessionFactory == null) {
sessionFactory = impl;
}
@@ -194,7 +190,12 @@ public class TenantBuilder {
private void createServerDbDirs() {
if (tenantFileSystemDirs == null) {
- tenantFileSystemDirs = new TenantFileSystemDirs(new File(Defaults.getDefaults().underVespaHome(componentRegistry.getServerDB().getConfigserverConfig().configServerDBDir())), tenant);
+ tenantFileSystemDirs = new TenantFileSystemDirs(new File(
+ Defaults.getDefaults().underVespaHome(componentRegistry
+ .getServerDB()
+ .getConfigserverConfig()
+ .configServerDBDir())),
+ tenant);
}
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java
index 49085971609..36de7d0221a 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ConfigServerBootstrapTest.java
@@ -29,6 +29,7 @@ import org.junit.rules.TemporaryFolder;
import java.io.File;
import java.io.FileReader;
+import java.time.Clock;
import java.util.ArrayList;
import java.util.Optional;
@@ -56,12 +57,9 @@ public class ConfigServerBootstrapTest extends TestWithTenant {
tenants.writeTenantPath(tenant2);
applicationRepository = new ApplicationRepository(tenants,
- HostProvisionerProvider.withProvisioner(new SessionHandlerTest.MockProvisioner()),
+ new SessionHandlerTest.MockProvisioner(),
curator,
- new LogServerLogGrabber(),
- new ApplicationConvergenceChecker(),
- new HttpProxy(new SimpleHttpFetcher()),
- new ConfigserverConfig(new ConfigserverConfig.Builder()));
+ Clock.systemUTC());
}
@Test
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/TestComponentRegistry.java b/configserver/src/test/java/com/yahoo/vespa/config/server/TestComponentRegistry.java
index e98236d8a69..816618c3d28 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/TestComponentRegistry.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/TestComponentRegistry.java
@@ -23,6 +23,7 @@ import com.yahoo.vespa.curator.mock.MockCurator;
import com.yahoo.vespa.config.server.zookeeper.ConfigCurator;
import com.yahoo.vespa.model.VespaModelFactory;
+import java.time.Clock;
import java.util.Collections;
import java.util.Optional;
@@ -49,6 +50,7 @@ public class TestComponentRegistry implements GlobalComponentRegistry {
private final FileDistributionFactory fileDistributionFactory;
private final ModelFactoryRegistry modelFactoryRegistry;
private final Optional<Provisioner> hostProvisioner;
+ private final Clock clock;
private TestComponentRegistry(Curator curator, ConfigCurator configCurator, Metrics metrics,
ModelFactoryRegistry modelFactoryRegistry,
@@ -62,7 +64,8 @@ public class TestComponentRegistry implements GlobalComponentRegistry {
Optional<Provisioner> hostProvisioner,
ConfigDefinitionRepo defRepo,
ReloadListener reloadListener,
- TenantListener tenantListener) {
+ TenantListener tenantListener,
+ Clock clock) {
this.curator = curator;
this.configCurator = configCurator;
this.metrics = metrics;
@@ -78,6 +81,7 @@ public class TestComponentRegistry implements GlobalComponentRegistry {
this.modelFactoryRegistry = modelFactoryRegistry;
this.hostProvisioner = hostProvisioner;
this.sessionPreparer = sessionPreparer;
+ this.clock = clock;
}
public static class Builder {
@@ -96,7 +100,7 @@ public class TestComponentRegistry implements GlobalComponentRegistry {
private Optional<FileDistributionFactory> fileDistributionFactory = Optional.empty();
private ModelFactoryRegistry modelFactoryRegistry = new ModelFactoryRegistry(Collections.singletonList(new VespaModelFactory(new NullConfigModelRegistry())));
private Optional<Provisioner> hostProvisioner = Optional.empty();
-
+ private Clock clock = Clock.systemUTC();
public Builder configServerConfig(ConfigserverConfig configserverConfig) {
this.configserverConfig = configserverConfig;
@@ -133,6 +137,11 @@ public class TestComponentRegistry implements GlobalComponentRegistry {
return this;
}
+ public Builder clock(Clock clock) {
+ this.clock = clock;
+ return this;
+ }
+
public TestComponentRegistry build() {
final PermanentApplicationPackage permApp = this.permanentApplicationPackage
.orElse(new PermanentApplicationPackage(configserverConfig));
@@ -152,7 +161,8 @@ public class TestComponentRegistry implements GlobalComponentRegistry {
new SuperModelGenerationCounter(curator),
new ConfigServerDB(configserverConfig),
hostRegistries, configserverConfig, sessionPreparer,
- hostProvisioner, defRepo, reloadListener, tenantListener);
+ hostProvisioner, defRepo, reloadListener,
+ tenantListener, clock);
}
}
@@ -194,4 +204,7 @@ public class TestComponentRegistry implements GlobalComponentRegistry {
}
public FileDistributionFactory getFileDistributionFactory() { return fileDistributionFactory; }
+
+ @Override
+ public Clock getClock() { return clock;}
}
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 5fea15a7b10..8a60a439943 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
@@ -28,13 +28,8 @@ import com.yahoo.transaction.NestedTransaction;
import com.yahoo.vespa.config.server.ApplicationRepository;
import com.yahoo.vespa.config.server.TestComponentRegistry;
import com.yahoo.vespa.config.server.TimeoutBudget;
-import com.yahoo.vespa.config.server.application.ApplicationConvergenceChecker;
-import com.yahoo.vespa.config.server.application.HttpProxy;
-import com.yahoo.vespa.config.server.application.LogServerLogGrabber;
-import com.yahoo.vespa.config.server.http.SimpleHttpFetcher;
import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry;
import com.yahoo.vespa.config.server.monitoring.Metrics;
-import com.yahoo.vespa.config.server.provision.HostProvisionerProvider;
import com.yahoo.vespa.config.server.session.LocalSession;
import com.yahoo.vespa.config.server.session.PrepareParams;
import com.yahoo.vespa.config.server.session.SilentDeployLogger;
@@ -63,6 +58,7 @@ import java.util.Optional;
public class DeployTester {
private final Curator curator;
+ private final Clock clock;
private final Tenants tenants;
private final File testApp;
@@ -75,19 +71,34 @@ public class DeployTester {
public DeployTester(String appPath, List<ModelFactory> modelFactories) {
this(appPath, modelFactories, new ConfigserverConfig(new ConfigserverConfig.Builder()
.configServerDBDir(Files.createTempDir()
- .getAbsolutePath())));
+ .getAbsolutePath())),
+ Clock.systemUTC());
}
public DeployTester(String appPath, ConfigserverConfig configserverConfig) {
this(appPath,
Collections.singletonList(createModelFactory(Clock.systemUTC())),
- configserverConfig);
+ configserverConfig,
+ Clock.systemUTC());
+ }
+
+ public DeployTester(String appPath, ConfigserverConfig configserverConfig, Clock clock) {
+ this(appPath,
+ Collections.singletonList(createModelFactory(clock)),
+ configserverConfig,
+ clock);
}
public DeployTester(String appPath, List<ModelFactory> modelFactories, ConfigserverConfig configserverConfig) {
+ this(appPath, modelFactories, configserverConfig, Clock.systemUTC());
+ }
+
+ public DeployTester(String appPath, List<ModelFactory> modelFactories, ConfigserverConfig configserverConfig, Clock clock) {
Metrics metrics = Metrics.createTestMetrics();
this.curator = new MockCurator();
- TestComponentRegistry componentRegistry = createComponentRegistry(curator, metrics, modelFactories, configserverConfig);
+ this.clock = clock;
+ TestComponentRegistry componentRegistry = createComponentRegistry(curator, metrics, modelFactories,
+ configserverConfig, clock);
try {
this.testApp = new File(appPath);
this.tenants = new Tenants(componentRegistry, metrics);
@@ -155,13 +166,9 @@ public class DeployTester {
public Optional<com.yahoo.config.provision.Deployment> redeployFromLocalActive(ApplicationId id) {
ApplicationRepository applicationRepository = new ApplicationRepository(tenants,
- HostProvisionerProvider.withProvisioner(createHostProvisioner()),
+ createHostProvisioner(),
curator,
- new LogServerLogGrabber(),
- new ApplicationConvergenceChecker(),
- new HttpProxy(new SimpleHttpFetcher()),
- new ConfigserverConfig(new ConfigserverConfig.Builder()));
-
+ clock);
return applicationRepository.deployFromLocalActive(id, Duration.ofSeconds(60));
}
@@ -171,7 +178,8 @@ public class DeployTester {
private TestComponentRegistry createComponentRegistry(Curator curator, Metrics metrics,
List<ModelFactory> modelFactories,
- ConfigserverConfig configserverConfig) {
+ ConfigserverConfig configserverConfig,
+ Clock clock) {
TestComponentRegistry.Builder builder = new TestComponentRegistry.Builder();
if (configserverConfig.hostedVespa()) {
@@ -181,7 +189,8 @@ public class DeployTester {
builder.configServerConfig(configserverConfig)
.curator(curator)
.modelFactoryRegistry(new ModelFactoryRegistry(modelFactories))
- .metrics(metrics);
+ .metrics(metrics)
+ .clock(clock);
return builder.build();
}
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 49e40321321..f2112249fa4 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
@@ -1,23 +1,33 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.server.deploy;
+import com.google.common.io.Files;
+import com.yahoo.cloud.config.ConfigserverConfig;
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;
+import com.yahoo.vespa.config.server.session.Session;
import org.junit.Test;
import java.io.IOException;
import java.time.Clock;
+import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
/**
@@ -55,5 +65,50 @@ public class RedeployTest {
InstanceName.from("default"));
assertFalse(tester.redeployFromLocalActive(id).isPresent());
}
-
+
+ @Test
+ public void testRedeployWillPurgeOldNonActiveDeployments() {
+ ManualClock clock = new ManualClock(Instant.now());
+ ConfigserverConfig configserverConfig = new ConfigserverConfig(new ConfigserverConfig.Builder()
+ .configServerDBDir(Files.createTempDir()
+ .getAbsolutePath())
+ .sessionLifetime(60));
+ DeployTester tester = new DeployTester("src/test/apps/app", configserverConfig, clock);
+ tester.deployApp("myapp", Instant.now()); // session 2 (numbering starts at 2)
+
+ clock.advance(Duration.ofSeconds(10));
+ Optional<com.yahoo.config.provision.Deployment> deployment2 = tester.redeployFromLocalActive();
+
+ assertTrue(deployment2.isPresent());
+ deployment2.get().activate(); // session 3
+ long activeSessionId = tester.tenant().getLocalSessionRepo().getActiveSession(tester.applicationId()).getSessionId();
+
+ clock.advance(Duration.ofSeconds(10));
+ Optional<com.yahoo.config.provision.Deployment> deployment3 = tester.redeployFromLocalActive();
+ assertTrue(deployment3.isPresent());
+ deployment3.get().prepare(); // session 4 (not activated)
+
+ try { Thread.sleep(1000);} catch (InterruptedException e) { /* Ignored */ }
+
+ LocalSession deployment3session = ((Deployment) deployment3.get()).session();
+ assertNotEquals(activeSessionId, deployment3session);
+ // No change to active session id
+ assertEquals(activeSessionId, tester.tenant().getLocalSessionRepo().getActiveSession(tester.applicationId()).getSessionId());
+ assertEquals(3, tester.tenant().getLocalSessionRepo().listSessions().size());
+
+ clock.advance(Duration.ofHours(1)); // longer than session lifetime
+
+ // Need another deployment to get old sessions purged
+ Optional<com.yahoo.config.provision.Deployment> deployment4 = tester.redeployFromLocalActive();
+ assertTrue(deployment4.isPresent());
+ deployment4.get().activate(); // session 5
+
+ // Both session 2 (deactivated) and session 4 (never activated) should have been removed
+ final Collection<LocalSession> sessions = tester.tenant().getLocalSessionRepo().listSessions();
+ assertEquals(2, sessions.size());
+ final Set<Long> sessionIds = sessions.stream().map(Session::getSessionId).collect(Collectors.toSet());
+ assertTrue(sessionIds.contains(3L));
+ assertTrue(sessionIds.contains(5L));
+ }
+
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java
index c3ac7c65266..43e974270a0 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java
@@ -1,7 +1,6 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.server.http.v2;
-import com.yahoo.cloud.config.ConfigserverConfig;
import com.yahoo.config.model.application.provider.FilesApplicationPackage;
import com.yahoo.config.provision.TenantName;
import com.yahoo.config.provision.Zone;
@@ -11,12 +10,7 @@ import com.yahoo.container.logging.AccessLog;
import com.yahoo.jdisc.Response;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.vespa.config.server.ApplicationRepository;
-import com.yahoo.vespa.config.server.application.ApplicationConvergenceChecker;
-import com.yahoo.vespa.config.server.application.HttpProxy;
-import com.yahoo.vespa.config.server.application.LogServerLogGrabber;
import com.yahoo.vespa.config.server.http.ContentHandlerTestBase;
-import com.yahoo.vespa.config.server.http.SimpleHttpFetcher;
-import com.yahoo.vespa.config.server.provision.HostProvisionerProvider;
import com.yahoo.vespa.config.server.session.Session;
import com.yahoo.vespa.curator.mock.MockCurator;
import org.junit.Before;
@@ -24,6 +18,7 @@ import org.junit.Test;
import java.io.File;
import java.io.IOException;
+import java.time.Clock;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertNotNull;
@@ -62,12 +57,9 @@ public class ApplicationContentHandlerTest extends ContentHandlerTestBase {
AccessLog.voidAccessLog(),
Zone.defaultZone(),
new ApplicationRepository(testTenantBuilder.createTenants(),
- HostProvisionerProvider.empty(),
+ new MockProvisioner(),
new MockCurator(),
- new LogServerLogGrabber(),
- new ApplicationConvergenceChecker(),
- new HttpProxy(new SimpleHttpFetcher()),
- new ConfigserverConfig(new ConfigserverConfig.Builder())));
+ Clock.systemUTC()));
pathPrefix = createPath(idTenant1, Zone.defaultZone());
baseUrl = baseServer + pathPrefix;
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java
index 8644948706b..34ef29b443f 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java
@@ -1,7 +1,6 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.server.http.v2;
-import com.yahoo.cloud.config.ConfigserverConfig;
import com.yahoo.config.application.api.ApplicationMetaData;
import com.yahoo.config.application.api.ApplicationPackage;
import com.yahoo.config.model.NullConfigModelRegistry;
@@ -26,9 +25,6 @@ import com.yahoo.vespa.config.server.ApplicationRepository;
import com.yahoo.vespa.config.server.PathProvider;
import com.yahoo.vespa.config.server.SuperModelGenerationCounter;
import com.yahoo.vespa.config.server.TestComponentRegistry;
-import com.yahoo.vespa.config.server.application.ApplicationConvergenceChecker;
-import com.yahoo.vespa.config.server.application.HttpProxy;
-import com.yahoo.vespa.config.server.application.LogServerLogGrabber;
import com.yahoo.vespa.config.server.application.MemoryTenantApplications;
import com.yahoo.vespa.config.server.application.TenantApplications;
import com.yahoo.vespa.config.server.deploy.TenantFileSystemDirs;
@@ -38,9 +34,7 @@ import com.yahoo.vespa.config.server.http.HandlerTest;
import com.yahoo.vespa.config.server.http.HttpErrorResponse;
import com.yahoo.vespa.config.server.http.SessionHandler;
import com.yahoo.vespa.config.server.http.SessionHandlerTest;
-import com.yahoo.vespa.config.server.http.SimpleHttpFetcher;
import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry;
-import com.yahoo.vespa.config.server.provision.HostProvisionerProvider;
import com.yahoo.vespa.config.server.session.LocalSession;
import com.yahoo.vespa.config.server.session.LocalSessionRepo;
import com.yahoo.vespa.config.server.session.MockSessionZKClient;
@@ -99,7 +93,7 @@ public class SessionActiveHandlerTest extends SessionHandlerTest {
applicationRepo = new MemoryTenantApplications();
curator = new MockCurator();
configCurator = ConfigCurator.create(curator);
- localRepo = new LocalSessionRepo(applicationRepo);
+ localRepo = new LocalSessionRepo(applicationRepo, Clock.systemUTC());
pathPrefix = "/application/v2/tenant/" + tenant + "/session/";
pathProvider = new PathProvider(Path.createRoot());
hostProvisioner = new MockProvisioner();
@@ -384,12 +378,9 @@ public class SessionActiveHandlerTest extends SessionHandlerTest {
testTenantBuilder.createTenants(),
Zone.defaultZone(),
new ApplicationRepository(testTenantBuilder.createTenants(),
- HostProvisionerProvider.withProvisioner(hostProvisioner),
+ hostProvisioner,
curator,
- new LogServerLogGrabber(),
- new ApplicationConvergenceChecker(),
- new HttpProxy(new SimpleHttpFetcher()),
- new ConfigserverConfig(new ConfigserverConfig.Builder())));
+ Clock.systemUTC()));
}
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java
index 16e7aad6d17..26a35b1e195 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java
@@ -2,7 +2,6 @@
package com.yahoo.vespa.config.server.http.v2;
import com.google.common.io.Files;
-import com.yahoo.cloud.config.ConfigserverConfig;
import com.yahoo.config.model.application.provider.FilesApplicationPackage;
import com.yahoo.config.provision.TenantName;
import com.yahoo.container.jdisc.HttpResponse;
@@ -11,13 +10,8 @@ import com.yahoo.jdisc.Response;
import com.yahoo.jdisc.http.HttpRequest;
import com.yahoo.text.Utf8;
import com.yahoo.vespa.config.server.ApplicationRepository;
-import com.yahoo.vespa.config.server.application.ApplicationConvergenceChecker;
-import com.yahoo.vespa.config.server.application.HttpProxy;
-import com.yahoo.vespa.config.server.application.LogServerLogGrabber;
import com.yahoo.vespa.config.server.http.ContentHandlerTestBase;
import com.yahoo.vespa.config.server.http.SessionHandlerTest;
-import com.yahoo.vespa.config.server.http.SimpleHttpFetcher;
-import com.yahoo.vespa.config.server.provision.HostProvisionerProvider;
import com.yahoo.vespa.curator.mock.MockCurator;
import org.apache.commons.io.FileUtils;
import org.junit.Before;
@@ -28,6 +22,7 @@ import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.time.Clock;
import java.util.concurrent.Executor;
import static org.hamcrest.core.Is.is;
@@ -175,11 +170,8 @@ public class SessionContentHandlerTest extends ContentHandlerTestBase {
}
}, AccessLog.voidAccessLog(), testTenantBuilder.createTenants(),
new ApplicationRepository(testTenantBuilder.createTenants(),
- HostProvisionerProvider.withProvisioner(new SessionHandlerTest.MockProvisioner()),
+ new SessionHandlerTest.MockProvisioner(),
new MockCurator(),
- new LogServerLogGrabber(),
- new ApplicationConvergenceChecker(),
- new HttpProxy(new SimpleHttpFetcher()),
- new ConfigserverConfig(new ConfigserverConfig.Builder())));
+ Clock.systemUTC()));
}
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java
index 5dc337bf99e..7914b4e0ddb 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java
@@ -9,17 +9,12 @@ import com.yahoo.container.jdisc.HttpResponse;
import com.yahoo.container.logging.AccessLog;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.vespa.config.server.ApplicationRepository;
-import com.yahoo.vespa.config.server.application.ApplicationConvergenceChecker;
-import com.yahoo.vespa.config.server.application.HttpProxy;
-import com.yahoo.vespa.config.server.application.LogServerLogGrabber;
import com.yahoo.vespa.config.server.application.MemoryTenantApplications;
import com.yahoo.vespa.config.server.application.TenantApplications;
import com.yahoo.vespa.config.server.http.CompressedApplicationInputStreamTest;
import com.yahoo.vespa.config.server.http.HandlerTest;
import com.yahoo.vespa.config.server.http.HttpErrorResponse;
import com.yahoo.vespa.config.server.http.SessionHandlerTest;
-import com.yahoo.vespa.config.server.http.SimpleHttpFetcher;
-import com.yahoo.vespa.config.server.provision.HostProvisionerProvider;
import com.yahoo.vespa.config.server.session.*;
import com.yahoo.vespa.config.server.tenant.Tenants;
import com.yahoo.vespa.curator.mock.MockCurator;
@@ -28,10 +23,10 @@ import org.junit.Ignore;
import org.junit.Test;
import java.io.*;
+import java.time.Clock;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
-import java.util.concurrent.Executor;
import static com.yahoo.jdisc.Response.Status.*;
import static org.hamcrest.core.Is.is;
@@ -64,7 +59,7 @@ public class SessionCreateHandlerTest extends SessionHandlerTest {
@Before
public void setupRepo() throws Exception {
applicationRepo = new MemoryTenantApplications();
- localSessionRepo = new LocalSessionRepo(applicationRepo);
+ localSessionRepo = new LocalSessionRepo(applicationRepo, Clock.systemUTC());
pathPrefix = "/application/v2/tenant/" + tenant + "/session/";
createdMessage = " for tenant '" + tenant + "' created.\"";
tenantMessage = ",\"tenant\":\"test\"";
@@ -242,12 +237,9 @@ public class SessionCreateHandlerTest extends SessionHandlerTest {
final ConfigserverConfig configserverConfig = new ConfigserverConfig(new ConfigserverConfig.Builder());
return new SessionCreateHandler(Runnable::run, AccessLog.voidAccessLog(), tenants, configserverConfig,
new ApplicationRepository(testTenantBuilder.createTenants(),
- HostProvisionerProvider.withProvisioner(new SessionHandlerTest.MockProvisioner()),
+ new SessionHandlerTest.MockProvisioner(),
new MockCurator(),
- new LogServerLogGrabber(),
- new ApplicationConvergenceChecker(),
- new HttpProxy(new SimpleHttpFetcher()),
- configserverConfig));
+ Clock.systemUTC()));
}
public HttpRequest post() throws FileNotFoundException {
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java
index 3172a396eb0..a03940ca95c 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java
@@ -22,10 +22,7 @@ import com.yahoo.transaction.Transaction;
import com.yahoo.vespa.config.server.ApplicationRepository;
import com.yahoo.vespa.config.server.PathProvider;
import com.yahoo.vespa.config.server.TestComponentRegistry;
-import com.yahoo.vespa.config.server.application.ApplicationConvergenceChecker;
import com.yahoo.vespa.config.server.application.ApplicationSet;
-import com.yahoo.vespa.config.server.application.HttpProxy;
-import com.yahoo.vespa.config.server.application.LogServerLogGrabber;
import com.yahoo.vespa.config.server.host.HostRegistry;
import com.yahoo.vespa.config.server.application.TenantApplications;
import com.yahoo.vespa.config.server.application.MemoryTenantApplications;
@@ -33,7 +30,6 @@ import com.yahoo.vespa.config.server.configchange.ConfigChangeActions;
import com.yahoo.vespa.config.server.configchange.MockRefeedAction;
import com.yahoo.vespa.config.server.configchange.MockRestartAction;
import com.yahoo.vespa.config.server.http.*;
-import com.yahoo.vespa.config.server.provision.HostProvisionerProvider;
import com.yahoo.vespa.config.server.session.*;
import com.yahoo.vespa.curator.Curator;
import com.yahoo.vespa.curator.mock.MockCurator;
@@ -81,7 +77,7 @@ public class SessionPrepareHandlerTest extends SessionHandlerTest {
public void setupRepo() throws Exception {
applicationRepo = new MemoryTenantApplications();
curator = new MockCurator();
- localRepo = new LocalSessionRepo(applicationRepo);
+ localRepo = new LocalSessionRepo(applicationRepo, Clock.systemUTC());
pathPrefix = "/application/v2/tenant/" + tenant + "/session/";
preparedMessage = " for tenant '" + tenant + "' prepared.\"";
tenantMessage = ",\"tenant\":\"" + tenant + "\"";
@@ -243,7 +239,7 @@ public class SessionPrepareHandlerTest extends SessionHandlerTest {
public void require_that_preparing_with_multiple_tenants_work() throws Exception {
// Need different repos for 'default' tenant as opposed to the 'test' tenant
TenantApplications applicationRepoDefault = new MemoryTenantApplications();
- LocalSessionRepo localRepoDefault = new LocalSessionRepo(applicationRepoDefault);
+ LocalSessionRepo localRepoDefault = new LocalSessionRepo(applicationRepoDefault, Clock.systemUTC());
final TenantName tenantName = TenantName.defaultName();
addTenant(tenantName, localRepoDefault, new RemoteSessionRepo(), new MockSessionFactory());
addTestTenant();
@@ -379,12 +375,9 @@ public class SessionPrepareHandlerTest extends SessionHandlerTest {
final ConfigserverConfig configserverConfig = new ConfigserverConfig(new ConfigserverConfig.Builder());
return new SessionPrepareHandler(Runnable::run, AccessLog.voidAccessLog(), builder.createTenants(), configserverConfig,
new ApplicationRepository(builder.createTenants(),
- HostProvisionerProvider.withProvisioner(new MockProvisioner()),
+ new MockProvisioner(),
curator,
- new LogServerLogGrabber(),
- new ApplicationConvergenceChecker(),
- new HttpProxy(new SimpleHttpFetcher()),
- configserverConfig));
+ Clock.systemUTC()));
}
private TestTenantBuilder addTenant(TenantName tenantName,
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TestTenantBuilder.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TestTenantBuilder.java
index 3e3d31bbcc0..4f7fc6d271d 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TestTenantBuilder.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TestTenantBuilder.java
@@ -35,7 +35,7 @@ public class TestTenantBuilder {
MemoryTenantApplications applicationRepo = new MemoryTenantApplications();
TenantBuilder builder = TenantBuilder.create(componentRegistry, tenantName, Path.createRoot().append(tenantName.value()))
.withSessionFactory(new SessionCreateHandlerTest.MockSessionFactory())
- .withLocalSessionRepo(new LocalSessionRepo(applicationRepo))
+ .withLocalSessionRepo(new LocalSessionRepo(applicationRepo, componentRegistry.getClock()))
.withRemoteSessionRepo(new RemoteSessionRepo())
.withApplicationRepo(applicationRepo);
tenantMap.put(tenantName, builder);