diff options
author | Harald Musum <musum@oath.com> | 2017-09-21 13:44:35 +0200 |
---|---|---|
committer | Harald Musum <musum@oath.com> | 2017-09-21 13:44:35 +0200 |
commit | e292e0940cce9b5b1eb4481fd92d57fb3fc44908 (patch) | |
tree | 55427c1259f64a5ae887e8b2f07c3ad1434cd718 /configserver | |
parent | 675b3bb296033fda08c9bb90536f243675738019 (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')
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); |