diff options
author | Harald Musum <musum@verizonmedia.com> | 2020-10-02 08:11:04 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-10-02 08:11:04 +0200 |
commit | 8ddab0e00447e6f69733d490bec47b16626315e4 (patch) | |
tree | 3d6e56981197aa8b59ccd069c1d20d6e9718c8aa | |
parent | a55a4e1d042b297d90c317b3591e5a25fd10c4fd (diff) |
Revert "Cleanup some config server code "
8 files changed, 55 insertions, 45 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 5bbe9c967cf..902553e9610 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 @@ -285,14 +285,13 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye bootstrapping.set(false); } - public PrepareResult prepare(long sessionId, PrepareParams prepareParams) { + public PrepareResult prepare(Tenant tenant, long sessionId, PrepareParams prepareParams) { DeployHandlerLogger logger = DeployHandlerLogger.forPrepareParams(prepareParams); - Deployment deployment = prepare(sessionId, prepareParams, logger); + Deployment deployment = prepare(tenant, sessionId, prepareParams, logger); return new PrepareResult(sessionId, deployment.configChangeActions(), logger); } - private Deployment prepare(long sessionId, PrepareParams prepareParams, DeployHandlerLogger logger) { - Tenant tenant = getTenant(prepareParams.getApplicationId()); + private Deployment prepare(Tenant tenant, long sessionId, PrepareParams prepareParams, DeployLogger logger) { validateThatLocalSessionIsNotActive(tenant, sessionId); LocalSession session = getLocalSession(tenant, sessionId); ApplicationId applicationId = prepareParams.getApplicationId(); @@ -326,7 +325,8 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye public PrepareResult deploy(File applicationPackage, PrepareParams prepareParams, DeployHandlerLogger logger) { ApplicationId applicationId = prepareParams.getApplicationId(); long sessionId = createSession(applicationId, prepareParams.getTimeoutBudget(), applicationPackage); - Deployment deployment = prepare(sessionId, prepareParams, logger); + Tenant tenant = getTenant(applicationId); + Deployment deployment = prepare(tenant, sessionId, prepareParams, logger); deployment.activate(); return new PrepareResult(sessionId, deployment.configChangeActions(), logger); @@ -653,10 +653,11 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye } public List<Version> getAllVersions(ApplicationId applicationId) { - Optional<ApplicationSet> applicationSet = getActiveApplicationSet(applicationId); - return applicationSet.isEmpty() - ? List.of() - : applicationSet.get().getAllVersions(applicationId); + Optional<ApplicationSet> applicationSet = getCurrentActiveApplicationSet(getTenant(applicationId), applicationId); + if (applicationSet.isEmpty()) + return List.of(); + else + return applicationSet.get().getAllVersions(applicationId); } // ---------------- Convergence ---------------------------------------------------------------- @@ -794,9 +795,14 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye } public long createSession(ApplicationId applicationId, TimeoutBudget timeoutBudget, File applicationDirectory) { - SessionRepository sessionRepository = getTenant(applicationId).getSessionRepository(); - LocalSession session = sessionRepository.createSession(applicationDirectory, applicationId, timeoutBudget); - sessionRepository.addLocalSession(session); + Tenant tenant = getTenant(applicationId); + tenant.getApplicationRepo().createApplication(applicationId); + Optional<Long> activeSessionId = tenant.getApplicationRepo().activeSessionOf(applicationId); + LocalSession session = tenant.getSessionRepository().createSession(applicationDirectory, + applicationId, + timeoutBudget, + activeSessionId); + tenant.getSessionRepository().addLocalSession(session); return session.getSessionId(); } @@ -924,8 +930,17 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye return session; } - public Optional<ApplicationSet> getActiveApplicationSet(ApplicationId appId) { - return getTenant(appId).getSessionRepository().getActiveApplicationSet(appId); + public Optional<ApplicationSet> getCurrentActiveApplicationSet(Tenant tenant, ApplicationId appId) { + Optional<ApplicationSet> currentActiveApplicationSet = Optional.empty(); + TenantApplications applicationRepo = tenant.getApplicationRepo(); + try { + long currentActiveSessionId = applicationRepo.requireActiveSessionOf(appId); + RemoteSession currentActiveSession = getRemoteSession(tenant, currentActiveSessionId); + currentActiveApplicationSet = Optional.ofNullable(currentActiveSession.ensureApplicationLoaded()); + } catch (IllegalArgumentException e) { + // Do nothing if we have no currently active session + } + return currentActiveApplicationSet; } private File decompressApplication(InputStream in, String contentType, File tempDir) { diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java index ed5f1b2d056..fc7bd70679a 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java @@ -11,6 +11,7 @@ import com.yahoo.config.provision.Provisioner; import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.ApplicationRepository.ActionTimer; import com.yahoo.vespa.config.server.TimeoutBudget; +import com.yahoo.vespa.config.server.application.ApplicationSet; import com.yahoo.vespa.config.server.configchange.ConfigChangeActions; import com.yahoo.vespa.config.server.configchange.RestartActions; import com.yahoo.vespa.config.server.http.InternalServerException; @@ -99,9 +100,9 @@ public class Deployment implements com.yahoo.config.provision.Deployment { ApplicationId applicationId = params.getApplicationId(); try (ActionTimer timer = applicationRepository.timerFor(applicationId, "deployment.prepareMillis")) { + Optional<ApplicationSet> activeApplicationSet = applicationRepository.getCurrentActiveApplicationSet(tenant, applicationId); this.configChangeActions = tenant.getSessionRepository().prepareLocalSession( - session, deployLogger, params, tenant.getPath(), clock.instant()); - + session, deployLogger, params, activeApplicationSet, tenant.getPath(), clock.instant()); this.prepared = true; } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java index 6fa2075807f..258af35be6f 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java @@ -34,12 +34,13 @@ public class SessionPrepareHandler extends SessionHandler { this.zookeeperBarrierTimeout = Duration.ofSeconds(configserverConfig.zookeeper().barrierTimeout()); } - @Override + @Override protected HttpResponse handlePUT(HttpRequest request) { + Tenant tenant = getExistingTenant(request); + TenantName tenantName = tenant.getName(); long sessionId = getSessionIdV2(request); - TenantName tenantName = getExistingTenant(request).getName(); PrepareParams prepareParams = PrepareParams.fromHttpRequest(request, tenantName, zookeeperBarrierTimeout); - PrepareResult result = applicationRepository.prepare(sessionId, prepareParams); + PrepareResult result = applicationRepository.prepare(tenant, sessionId, prepareParams); return new SessionPrepareResponse(result, tenantName, request); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSession.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSession.java index 9417a798d1f..7e410503907 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSession.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSession.java @@ -13,6 +13,7 @@ import com.yahoo.vespa.curator.Curator; import org.apache.zookeeper.KeeperException; import java.time.Clock; +import java.util.Optional; import java.util.Set; import java.util.logging.Level; import java.util.logging.Logger; @@ -57,13 +58,13 @@ public class RemoteSession extends Session { ApplicationPackage applicationPackage = sessionZooKeeperClient.loadApplicationPackage(); // Read hosts allocated on the config server instance which created this - SettableOptional<AllocatedHosts> allocatedHosts = new SettableOptional<>(applicationPackage.getAllocatedHosts()); + Optional<AllocatedHosts> allocatedHosts = applicationPackage.getAllocatedHosts(); return ApplicationSet.fromList(applicationLoader.buildModels(getApplicationId(), sessionZooKeeperClient.readDockerImageRepository(), sessionZooKeeperClient.readVespaVersion(), applicationPackage, - allocatedHosts, + new SettableOptional<>(allocatedHosts), clock.instant())); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java index 53230eec831..5e10b7dcc61 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java @@ -153,20 +153,21 @@ public class SessionRepository { public ConfigChangeActions prepareLocalSession(LocalSession session, DeployLogger logger, PrepareParams params, + Optional<ApplicationSet> currentActiveApplicationSet, Path tenantPath, Instant now) { applicationRepo.createApplication(params.getApplicationId()); // TODO jvenstad: This is wrong, but it has to be done now, since preparation can change the application ID of a session :( logger.log(Level.FINE, "Created application " + params.getApplicationId()); long sessionId = session.getSessionId(); SessionZooKeeperClient sessionZooKeeperClient = createSessionZooKeeperClient(sessionId); - Optional<ApplicationSet> activeApplicationSet = getActiveApplicationSet(params.getApplicationId()); + Curator.CompletionWaiter waiter = sessionZooKeeperClient.createPrepareWaiter(); ConfigChangeActions actions = sessionPreparer.prepare(applicationRepo.getHostValidator(), logger, params, - activeApplicationSet, tenantPath, now, + currentActiveApplicationSet, tenantPath, now, getSessionAppDir(sessionId), session.getApplicationPackage(), sessionZooKeeperClient) .getConfigChangeActions(); setPrepared(session); - sessionZooKeeperClient.createPrepareWaiter().awaitCompletion(params.getTimeoutBudget().timeLeft()); + waiter.awaitCompletion(params.getTimeoutBudget().timeLeft()); return actions; } @@ -435,9 +436,8 @@ public class SessionRepository { * @param timeoutBudget Timeout for creating session and waiting for other servers. * @return a new session */ - public LocalSession createSession(File applicationDirectory, ApplicationId applicationId, TimeoutBudget timeoutBudget) { - applicationRepo.createApplication(applicationId); - Optional<Long> activeSessionId = applicationRepo.activeSessionOf(applicationId); + public LocalSession createSession(File applicationDirectory, ApplicationId applicationId, + TimeoutBudget timeoutBudget, Optional<Long> activeSessionId) { return create(applicationDirectory, applicationId, activeSessionId, false, timeoutBudget); } @@ -560,18 +560,6 @@ public class SessionRepository { return applicationPackage; } - public Optional<ApplicationSet> getActiveApplicationSet(ApplicationId appId) { - Optional<ApplicationSet> currentActiveApplicationSet = Optional.empty(); - try { - long currentActiveSessionId = applicationRepo.requireActiveSessionOf(appId); - RemoteSession currentActiveSession = getRemoteSession(currentActiveSessionId); - currentActiveApplicationSet = Optional.ofNullable(currentActiveSession.ensureApplicationLoaded()); - } catch (IllegalArgumentException e) { - // Do nothing if we have no currently active session - } - return currentActiveApplicationSet; - } - private void copyApp(File sourceDir, File destinationDir) throws IOException { if (destinationDir.exists()) throw new RuntimeException("Destination dir " + destinationDir + " already exists"); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java index 7dc19491654..b2deaa22b2e 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java @@ -537,7 +537,7 @@ public class ApplicationRepositoryTest { long firstSession = result.sessionId(); long sessionId = applicationRepository.createSession(applicationId(), timeoutBudget, testAppJdiscOnly); - applicationRepository.prepare(sessionId, prepareParams()); + applicationRepository.prepare(applicationRepository.getTenant(applicationId()), sessionId, prepareParams()); exceptionRule.expect(RuntimeException.class); exceptionRule.expectMessage(containsString("Timeout exceeded when trying to activate 'test1.testapp'")); applicationRepository.activate(applicationRepository.getTenant(applicationId()), sessionId, new TimeoutBudget(clock, Duration.ofSeconds(0)), false); @@ -562,7 +562,7 @@ public class ApplicationRepositoryTest { PrepareResult result2 = deployApp(testAppJdiscOnly); result2.sessionId(); - applicationRepository.prepare(sessionId2, prepareParams()); + applicationRepository.prepare(applicationRepository.getTenant(applicationId()), sessionId2, prepareParams()); exceptionRule.expect(ActivationConflictException.class); exceptionRule.expectMessage(containsString("tenant:test1 app:testapp:default Cannot activate session 3 because the currently active session (4) has changed since session 3 was created (was 2 at creation time)")); applicationRepository.activate(applicationRepository.getTenant(applicationId()), sessionId2, timeoutBudget, false); @@ -575,7 +575,7 @@ public class ApplicationRepositoryTest { exceptionRule.expect(IllegalStateException.class); exceptionRule.expectMessage(containsString("Session is active: 2")); - applicationRepository.prepare(sessionId, prepareParams()); + applicationRepository.prepare(applicationRepository.getTenant(applicationId()), sessionId, prepareParams()); exceptionRule.expect(IllegalStateException.class); exceptionRule.expectMessage(containsString("tenant:test1 app:testapp:default Session 2 is already active")); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java index ddc880c344e..6b9abf5d7ba 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/HostHandlerTest.java @@ -17,6 +17,7 @@ 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.session.PrepareParams; +import com.yahoo.vespa.config.server.tenant.Tenant; import com.yahoo.vespa.config.server.tenant.TenantRepository; import org.junit.Before; import org.junit.Rule; @@ -71,7 +72,8 @@ public class HostHandlerTest { public void require_correct_tenant_and_application_for_hostname() throws Exception { ApplicationId applicationId = applicationId(); applicationRepository.deploy(testApp, new PrepareParams.Builder().applicationId(applicationId).build()); - String hostname = applicationRepository.getActiveApplicationSet(applicationId).get().getAllHosts().iterator().next(); + Tenant tenant = applicationRepository.getTenant(applicationId); + String hostname = applicationRepository.getCurrentActiveApplicationSet(tenant, applicationId).get().getAllHosts().iterator().next(); assertApplicationForHost(hostname, applicationId); } 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 732b815156f..511717acfc0 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 @@ -135,12 +135,14 @@ public class SessionActiveHandlerTest { ApplicationMetaData getMetaData() { return metaData; } void invoke() { + Tenant tenant = applicationRepository.getTenant(applicationId()); long sessionId = applicationRepository.createSession(applicationId(), new TimeoutBudget(componentRegistry.getClock(), Duration.ofSeconds(10)), testApp); - applicationRepository.prepare(sessionId, new PrepareParams.Builder().applicationId(applicationId()).build()); + applicationRepository.prepare(tenant, + sessionId, + new PrepareParams.Builder().applicationId(applicationId()).build()); actResponse = handler.handle(createTestRequest(pathPrefix, HttpRequest.Method.PUT, Cmd.ACTIVE, sessionId, subPath)); - Tenant tenant = applicationRepository.getTenant(applicationId()); LocalSession session = applicationRepository.getActiveLocalSession(tenant, applicationId()); metaData = session.getMetaData(); this.sessionId = sessionId; |