diff options
10 files changed, 100 insertions, 126 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 2bc3310442d..33c9cc31128 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 @@ -215,7 +215,9 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye Slime deployLog = createDeployLog(); DeployLogger logger = new DeployHandlerLogger(deployLog.get().setArray("log"), prepareParams.isVerbose(), applicationId); try (ActionTimer timer = timerFor(applicationId, "deployment.prepareMillis")) { - ConfigChangeActions actions = session.prepare(logger, prepareParams, currentActiveApplicationSet, tenant.getPath(), now); + SessionRepository sessionRepository = tenant.getSessionRepository(); + ConfigChangeActions actions = sessionRepository.prepareLocalSession(session, logger, prepareParams, + currentActiveApplicationSet, tenant.getPath(), now); logConfigChangeActions(actions, logger); log.log(Level.INFO, TenantRepository.logPre(applicationId) + "Session " + sessionId + " prepared successfully. "); return new PrepareResult(sessionId, actions, deployLog); 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 d90a79795cf..b0d1305a434 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 @@ -15,6 +15,7 @@ import com.yahoo.vespa.config.server.ActivationConflictException; 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.http.InternalServerException; import com.yahoo.vespa.config.server.session.LocalSession; import com.yahoo.vespa.config.server.session.PrepareParams; @@ -118,7 +119,10 @@ public class Deployment implements com.yahoo.config.provision.Deployment { .isBootstrap(isBootstrap); dockerImageRepository.ifPresent(params::dockerImageRepository); athenzDomain.ifPresent(params::athenzDomain); - session.prepare(logger, params.build(), Optional.empty(), tenant.getPath(), clock.instant()); + // TODO: Why is activeApplicationSet empty here? + Optional<ApplicationSet> activeApplicationSet = Optional.empty(); + tenant.getSessionRepository().prepareLocalSession(session, logger, params.build(), activeApplicationSet, + tenant.getPath(), clock.instant()); this.prepared = true; } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java index b90f75906d7..b01ddb04d48 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java @@ -4,8 +4,6 @@ package com.yahoo.vespa.config.server.session; import com.yahoo.config.application.api.ApplicationFile; import com.yahoo.config.application.api.ApplicationMetaData; import com.yahoo.config.application.api.ApplicationPackage; -import com.yahoo.config.application.api.DeployLogger; -import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.TenantName; import com.yahoo.io.IOUtils; import com.yahoo.path.Path; @@ -13,16 +11,9 @@ import com.yahoo.transaction.AbstractTransaction; import com.yahoo.transaction.NestedTransaction; import com.yahoo.transaction.Transaction; import com.yahoo.vespa.config.server.TimeoutBudget; -import com.yahoo.vespa.config.server.application.ApplicationSet; import com.yahoo.vespa.config.server.application.TenantApplications; -import com.yahoo.vespa.config.server.configchange.ConfigChangeActions; -import com.yahoo.vespa.config.server.host.HostValidator; -import com.yahoo.vespa.curator.Curator; import java.io.File; -import java.time.Instant; -import java.util.Optional; -import java.util.logging.Level; /** * A LocalSession is a session that has been created locally on this configserver. A local session can be edited and @@ -37,40 +28,20 @@ public class LocalSession extends Session { protected final ApplicationPackage applicationPackage; private final TenantApplications applicationRepo; - private final SessionPreparer sessionPreparer; private final File serverDBSessionDir; - private final SessionZooKeeperClient sessionZooKeeperClient; /** - * Create a session. This involves loading the application, validating it and distributing it. + * Creates a session. This involves loading the application, validating it and distributing it. * * @param sessionId The session id for this session. */ - public LocalSession(TenantName tenant, long sessionId, SessionPreparer sessionPreparer, - ApplicationPackage applicationPackage, SessionZooKeeperClient sessionZooKeeperClient, - File serverDBSessionDir, TenantApplications applicationRepo) { + public LocalSession(TenantName tenant, long sessionId, ApplicationPackage applicationPackage, + SessionZooKeeperClient sessionZooKeeperClient, File serverDBSessionDir, + TenantApplications applicationRepo) { super(tenant, sessionId, sessionZooKeeperClient); this.serverDBSessionDir = serverDBSessionDir; this.applicationPackage = applicationPackage; - this.sessionZooKeeperClient = sessionZooKeeperClient; this.applicationRepo = applicationRepo; - this.sessionPreparer = sessionPreparer; - } - - public ConfigChangeActions prepare(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()); - Curator.CompletionWaiter waiter = zooKeeperClient.createPrepareWaiter(); - ConfigChangeActions actions = sessionPreparer.prepare(applicationRepo.getHostValidator(), logger, params, - currentActiveApplicationSet, tenantPath, now, - serverDBSessionDir, applicationPackage, sessionZooKeeperClient); - setPrepared(); - waiter.awaitCompletion(params.getTimeoutBudget().timeLeft()); - return actions; } public ApplicationFile getApplicationFile(Path relativePath, Mode mode) { @@ -80,22 +51,22 @@ public class LocalSession extends Session { return applicationPackage.getFile(relativePath); } - private void setPrepared() { + void setPrepared() { setStatus(Session.Status.PREPARE); } private Transaction createSetStatusTransaction(Status status) { - return zooKeeperClient.createWriteStatusTransaction(status); + return sessionZooKeeperClient.createWriteStatusTransaction(status); } private void setStatus(Session.Status newStatus) { - zooKeeperClient.writeStatus(newStatus); + sessionZooKeeperClient.writeStatus(newStatus); } public Transaction createActivateTransaction() { - zooKeeperClient.createActiveWaiter(); + sessionZooKeeperClient.createActiveWaiter(); Transaction transaction = createSetStatusTransaction(Status.ACTIVATE); - transaction.add(applicationRepo.createPutTransaction(zooKeeperClient.readApplicationId(), getSessionId()).operations()); + transaction.add(applicationRepo.createPutTransaction(sessionZooKeeperClient.readApplicationId(), getSessionId()).operations()); return transaction; } @@ -109,21 +80,21 @@ public class LocalSession extends Session { /** Add transactions to delete this session to the given nested transaction */ public void delete(NestedTransaction transaction) { - transaction.add(zooKeeperClient.deleteTransaction(), FileTransaction.class); + transaction.add(sessionZooKeeperClient.deleteTransaction(), FileTransaction.class); transaction.add(FileTransaction.from(FileOperations.delete(serverDBSessionDir.getAbsolutePath()))); } public void waitUntilActivated(TimeoutBudget timeoutBudget) { - zooKeeperClient.getActiveWaiter().awaitCompletion(timeoutBudget.timeLeft()); + sessionZooKeeperClient.getActiveWaiter().awaitCompletion(timeoutBudget.timeLeft()); } public enum Mode { READ, WRITE } - public ApplicationMetaData getMetaData() { - return applicationPackage.getMetaData(); - } + public ApplicationMetaData getMetaData() { return applicationPackage.getMetaData(); } + + public ApplicationPackage getApplicationPackage() { return applicationPackage; } // The rest of this class should be moved elsewhere ... 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 c1179a2dd17..763c77f2088 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 @@ -50,20 +50,20 @@ public class RemoteSession extends Session { } void loadPrepared() { - Curator.CompletionWaiter waiter = zooKeeperClient.getPrepareWaiter(); + Curator.CompletionWaiter waiter = sessionZooKeeperClient.getPrepareWaiter(); ensureApplicationLoaded(); notifyCompletion(waiter); } private ApplicationSet loadApplication() { - ApplicationPackage applicationPackage = zooKeeperClient.loadApplicationPackage(); + ApplicationPackage applicationPackage = sessionZooKeeperClient.loadApplicationPackage(); // Read hosts allocated on the config server instance which created this Optional<AllocatedHosts> allocatedHosts = applicationPackage.getAllocatedHosts(); - return ApplicationSet.fromList(applicationLoader.buildModels(zooKeeperClient.readApplicationId(), - zooKeeperClient.readDockerImageRepository(), - zooKeeperClient.readVespaVersion(), + return ApplicationSet.fromList(applicationLoader.buildModels(sessionZooKeeperClient.readApplicationId(), + sessionZooKeeperClient.readDockerImageRepository(), + sessionZooKeeperClient.readVespaVersion(), applicationPackage, new SettableOptional<>(allocatedHosts), clock.instant())); @@ -78,11 +78,11 @@ public class RemoteSession extends Session { } public Transaction createDeleteTransaction() { - return zooKeeperClient.createWriteStatusTransaction(Status.DELETE); + return sessionZooKeeperClient.createWriteStatusTransaction(Status.DELETE); } void makeActive(ReloadHandler reloadHandler) { - Curator.CompletionWaiter waiter = zooKeeperClient.getActiveWaiter(); + Curator.CompletionWaiter waiter = sessionZooKeeperClient.getActiveWaiter(); log.log(Level.FINE, () -> logPre() + "Getting session from repo: " + getSessionId()); ApplicationSet app = ensureApplicationLoaded(); log.log(Level.FINE, () -> logPre() + "Reloading config for " + getSessionId()); @@ -93,7 +93,7 @@ public class RemoteSession extends Session { } void confirmUpload() { - Curator.CompletionWaiter waiter = zooKeeperClient.getUploadWaiter(); + Curator.CompletionWaiter waiter = sessionZooKeeperClient.getUploadWaiter(); log.log(Level.FINE, "Notifying upload waiter for session " + getSessionId()); notifyCompletion(waiter); log.log(Level.FINE, "Done notifying upload for session " + getSessionId()); @@ -116,13 +116,13 @@ public class RemoteSession extends Session { } public void delete() { - Transaction transaction = zooKeeperClient.deleteTransaction(); + Transaction transaction = sessionZooKeeperClient.deleteTransaction(); transaction.commit(); transaction.close(); } public ApplicationMetaData getMetaData() { - return zooKeeperClient.loadApplicationPackage().getMetaData(); + return sessionZooKeeperClient.loadApplicationPackage().getMetaData(); } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java index c553133ba12..1e832548342 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java @@ -25,12 +25,12 @@ public abstract class Session implements Comparable<Session> { private final long sessionId; protected final TenantName tenant; - protected final SessionZooKeeperClient zooKeeperClient; + protected final SessionZooKeeperClient sessionZooKeeperClient; - protected Session(TenantName tenant, long sessionId, SessionZooKeeperClient zooKeeperClient) { + protected Session(TenantName tenant, long sessionId, SessionZooKeeperClient sessionZooKeeperClient) { this.tenant = tenant; this.sessionId = sessionId; - this.zooKeeperClient = zooKeeperClient; + this.sessionZooKeeperClient = sessionZooKeeperClient; } /** * Retrieve the session id for this session. @@ -41,7 +41,7 @@ public abstract class Session implements Comparable<Session> { } public Session.Status getStatus() { - return zooKeeperClient.readStatus(); + return sessionZooKeeperClient.readStatus(); } @Override @@ -80,43 +80,43 @@ public abstract class Session implements Comparable<Session> { } public Instant getCreateTime() { - return zooKeeperClient.readCreateTime(); + return sessionZooKeeperClient.readCreateTime(); } public void setApplicationId(ApplicationId applicationId) { - zooKeeperClient.writeApplicationId(applicationId); + sessionZooKeeperClient.writeApplicationId(applicationId); } void setApplicationPackageReference(FileReference applicationPackageReference) { if (applicationPackageReference == null) throw new IllegalArgumentException(String.format( "Null application package FileReference for tenant: %s, session: %d", tenant, sessionId)); - zooKeeperClient.writeApplicationPackageReference(applicationPackageReference); + sessionZooKeeperClient.writeApplicationPackageReference(applicationPackageReference); } public void setVespaVersion(Version version) { - zooKeeperClient.writeVespaVersion(version); + sessionZooKeeperClient.writeVespaVersion(version); } public void setDockerImageRepository(Optional<DockerImage> dockerImageRepository) { - zooKeeperClient.writeDockerImageRepository(dockerImageRepository); + sessionZooKeeperClient.writeDockerImageRepository(dockerImageRepository); } public void setAthenzDomain(Optional<AthenzDomain> athenzDomain) { - zooKeeperClient.writeAthenzDomain(athenzDomain); + sessionZooKeeperClient.writeAthenzDomain(athenzDomain); } - public ApplicationId getApplicationId() { return zooKeeperClient.readApplicationId(); } + public ApplicationId getApplicationId() { return sessionZooKeeperClient.readApplicationId(); } - public FileReference getApplicationPackageReference() {return zooKeeperClient.readApplicationPackageReference(); } + public FileReference getApplicationPackageReference() {return sessionZooKeeperClient.readApplicationPackageReference(); } - public Optional<DockerImage> getDockerImageRepository() { return zooKeeperClient.readDockerImageRepository(); } + public Optional<DockerImage> getDockerImageRepository() { return sessionZooKeeperClient.readDockerImageRepository(); } - public Version getVespaVersion() { return zooKeeperClient.readVespaVersion(); } + public Version getVespaVersion() { return sessionZooKeeperClient.readVespaVersion(); } - public Optional<AthenzDomain> getAthenzDomain() { return zooKeeperClient.readAthenzDomain(); } + public Optional<AthenzDomain> getAthenzDomain() { return sessionZooKeeperClient.readAthenzDomain(); } public AllocatedHosts getAllocatedHosts() { - return zooKeeperClient.getAllocatedHosts(); + return sessionZooKeeperClient.getAllocatedHosts(); } public Transaction createDeactivateTransaction() { @@ -124,7 +124,7 @@ public abstract class Session implements Comparable<Session> { } private Transaction createSetStatusTransaction(Status status) { - return zooKeeperClient.createWriteStatusTransaction(status); + return sessionZooKeeperClient.createWriteStatusTransaction(status); } // Note: Assumes monotonically increasing session ids diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java index 4a2e7cb405b..3c83263f781 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java @@ -55,6 +55,7 @@ import java.io.File; import java.io.IOException; import java.net.URI; import java.time.Instant; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Optional; @@ -115,7 +116,7 @@ public class SessionPreparer { * @param logger For storing logs returned in response to client. * @param params parameters controlling behaviour of prepare. * @param currentActiveApplicationSet Set of currently active applications. - * @param tenantPath Zookeeper path for the tenant for this session + * @param tenantPath Zookeeper path for the tenant for this session * @return the config change actions that must be done to handle the activation of the models prepared. */ public ConfigChangeActions prepare(HostValidator<ApplicationId> hostValidator, DeployLogger logger, PrepareParams params, @@ -317,7 +318,7 @@ public class SessionPreparer { } private List<ContainerEndpoint> readEndpointsIfNull(List<ContainerEndpoint> endpoints) { - if (endpoints == null) { // endpoints is only set when prepared via HTTP + if (endpoints == null) { // endpoints are only set when prepared via HTTP endpoints = this.containerEndpointsCache.read(applicationId); } return List.copyOf(endpoints); @@ -383,7 +384,7 @@ public class SessionPreparer { */ public ConfigChangeActions getConfigChangeActions() { return new ConfigChangeActions(results.stream().map(result -> result.actions) - .flatMap(actions -> actions.stream()) + .flatMap(Collection::stream) .collect(Collectors.toList())); } 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 f2a867a239a..2a61c621224 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 @@ -17,10 +17,11 @@ import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.config.server.GlobalComponentRegistry; import com.yahoo.vespa.config.server.ReloadHandler; import com.yahoo.vespa.config.server.TimeoutBudget; +import com.yahoo.vespa.config.server.application.ApplicationSet; import com.yahoo.vespa.config.server.application.TenantApplications; +import com.yahoo.vespa.config.server.configchange.ConfigChangeActions; import com.yahoo.vespa.config.server.deploy.TenantFileSystemDirs; import com.yahoo.vespa.config.server.filedistribution.FileDirectory; -import com.yahoo.vespa.config.server.host.HostValidator; import com.yahoo.vespa.config.server.monitoring.MetricUpdater; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.tenant.TenantRepository; @@ -67,7 +68,7 @@ public class SessionRepository { private static final FilenameFilter sessionApplicationsFilter = (dir, name) -> name.matches("\\d+"); private static final long nonExistingActiveSession = 0; - private final SessionCache<LocalSession> localSessionCache; + private final SessionCache<LocalSession> localSessionCache = new SessionCache<>(); private final SessionCache<RemoteSession> remoteSessionCache = new SessionCache<>(); private final Map<Long, LocalSessionStateWatcher> localSessionStateWatchers = new HashMap<>(); private final Map<Long, RemoteSessionStateWatcher> remoteSessionStateWatchers = new HashMap<>(); @@ -95,7 +96,6 @@ public class SessionRepository { this.tenantName = tenantName; this.componentRegistry = componentRegistry; this.sessionsPath = TenantRepository.getSessionsPath(tenantName); - localSessionCache = new SessionCache<>(); this.clock = componentRegistry.getClock(); this.curator = componentRegistry.getCurator(); this.sessionLifetime = Duration.ofSeconds(componentRegistry.getConfigserverConfig().sessionLifetime()); @@ -147,6 +147,26 @@ 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); + Curator.CompletionWaiter waiter = sessionZooKeeperClient.createPrepareWaiter(); + ConfigChangeActions actions = sessionPreparer.prepare(applicationRepo.getHostValidator(), logger, params, + currentActiveApplicationSet, tenantPath, now, + getSessionAppDir(sessionId), + session.getApplicationPackage(), sessionZooKeeperClient); + session.setPrepared(); + waiter.awaitCompletion(params.getTimeoutBudget().timeLeft()); + return actions; + } + public void deleteExpiredSessions(Map<ApplicationId, Long> activeSessions) { log.log(Level.FINE, "Purging old sessions"); try { @@ -340,8 +360,6 @@ public class SessionRepository { synchronizeOnNew(getSessionListFromDirectoryCache(Collections.singletonList(event.getData()))); break; case CHILD_REMOVED: - sessionsChanged(); - break; case CONNECTION_RECONNECTED: sessionsChanged(); break; @@ -372,7 +390,7 @@ public class SessionRepository { } public RemoteSession createRemoteSession(long sessionId) { - SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(getSessionPath(sessionId)); + SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(sessionId); return new RemoteSession(tenantName, sessionId, componentRegistry, sessionZKClient); } @@ -403,10 +421,10 @@ public class SessionRepository { TimeoutBudget timeoutBudget, Clock clock) { log.log(Level.FINE, TenantRepository.logPre(tenantName) + "Creating session " + sessionId + " in ZooKeeper"); - SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(getSessionPath(sessionId)); + SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(sessionId); sessionZKClient.createNewSession(clock.instant()); Curator.CompletionWaiter waiter = sessionZKClient.getUploadWaiter(); - LocalSession session = new LocalSession(tenantName, sessionId, sessionPreparer, applicationPackage, sessionZKClient, + LocalSession session = new LocalSession(tenantName, sessionId, applicationPackage, sessionZKClient, getSessionAppDir(sessionId), applicationRepo); waiter.awaitCompletion(timeoutBudget.timeLeft()); return session; @@ -464,8 +482,8 @@ public class SessionRepository { try { ApplicationPackage applicationPackage = createApplicationPackage(applicationFile, applicationId, sessionId, currentlyActiveSessionId, false); - SessionZooKeeperClient sessionZooKeeperClient = createSessionZooKeeperClient(getSessionPath(sessionId)); - return new LocalSession(tenantName, sessionId, sessionPreparer, applicationPackage, sessionZooKeeperClient, + SessionZooKeeperClient sessionZooKeeperClient = createSessionZooKeeperClient(sessionId); + return new LocalSession(tenantName, sessionId, applicationPackage, sessionZooKeeperClient, getSessionAppDir(sessionId), applicationRepo); } catch (Exception e) { throw new RuntimeException("Error creating session " + sessionId, e); @@ -493,9 +511,8 @@ public class SessionRepository { LocalSession createSessionFromId(long sessionId) { File sessionDir = getAndValidateExistingSessionAppDir(sessionId); ApplicationPackage applicationPackage = FilesApplicationPackage.fromFile(sessionDir); - Path sessionIdPath = sessionsPath.append(String.valueOf(sessionId)); - SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(sessionIdPath); - return new LocalSession(tenantName, sessionId, sessionPreparer, applicationPackage, sessionZKClient, + SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(sessionId); + return new LocalSession(tenantName, sessionId, applicationPackage, sessionZKClient, getSessionAppDir(sessionId), applicationRepo); } @@ -509,7 +526,7 @@ public class SessionRepository { } log.log(Level.INFO, "Creating local session for session id " + sessionId); - SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(getSessionPath(sessionId)); + SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(sessionId); FileReference fileReference = sessionZKClient.readApplicationPackageReference(); log.log(Level.FINE, "File reference for session id " + sessionId + ": " + fileReference); if (fileReference != null) { @@ -543,9 +560,11 @@ public class SessionRepository { return sessionsPath.append(String.valueOf(sessionId)); } - private SessionZooKeeperClient createSessionZooKeeperClient(Path sessionPath) { + + private SessionZooKeeperClient createSessionZooKeeperClient(long sessionId) { String serverId = componentRegistry.getConfigserverConfig().serverId(); Optional<NodeFlavors> nodeFlavors = componentRegistry.getZone().nodeFlavors(); + Path sessionPath = getSessionPath(sessionId); return new SessionZooKeeperClient(curator, componentRegistry.getConfigCurator(), sessionPath, serverId, nodeFlavors); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java index 06cfe704046..f7c8ae9d5c3 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java @@ -121,9 +121,8 @@ public class Tenant implements TenantHandlerProvider { * Called by watchers as a reaction to {@link #delete()}. */ void close() { - sessionRepository.close(); // Closes watchers and clears memory. applicationRepo.close(); // Closes watchers. - sessionRepository.close(); // Closes watchers, clears memory, and deletes local files and ZK session state. + sessionRepository.close(); // Closes watchers, clears memory, and deletes local files and ZK session state. } /** Deletes the tenant tree from ZooKeeper (application and session status for the tenant) and triggers {@link #close()}. */ diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java index 43d21e27a16..be368692aba 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java @@ -3,11 +3,9 @@ package com.yahoo.vespa.config.server.http; import com.yahoo.config.application.api.ApplicationFile; import com.yahoo.config.application.api.ApplicationPackage; -import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterSpec; -import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.HostFilter; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.ProvisionLogger; @@ -18,14 +16,9 @@ import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.path.Path; import com.yahoo.transaction.NestedTransaction; import com.yahoo.transaction.Transaction; -import com.yahoo.vespa.config.server.application.ApplicationSet; -import com.yahoo.vespa.config.server.configchange.ConfigChangeActions; -import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.session.DummyTransaction; import com.yahoo.vespa.config.server.session.LocalSession; import com.yahoo.vespa.config.server.session.MockSessionZKClient; -import com.yahoo.vespa.config.server.session.PrepareParams; -import com.yahoo.vespa.config.server.session.RemoteSession; import com.yahoo.vespa.config.server.session.Session; import java.io.ByteArrayOutputStream; @@ -36,7 +29,6 @@ import java.time.Instant; import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Optional; /** * Base class for session handler tests @@ -90,13 +82,11 @@ public class SessionHandlerTest { public static class MockLocalSession extends LocalSession { public Session.Status status; - private ConfigChangeActions actions = new ConfigChangeActions(); private Instant createTime = Instant.now(); private ApplicationId applicationId; - private Optional<DockerImage> dockerImageRepository; public MockLocalSession(long sessionId, ApplicationPackage app) { - super(TenantName.defaultName(), sessionId, null, app, new MockSessionZKClient(app), null, null); + super(TenantName.defaultName(), sessionId, app, new MockSessionZKClient(app), null, null); } public MockLocalSession(long sessionId, ApplicationPackage app, ApplicationId applicationId) { @@ -104,13 +94,6 @@ public class SessionHandlerTest { this.applicationId = applicationId; } - @Override - public ConfigChangeActions prepare(DeployLogger logger, PrepareParams params, Optional<ApplicationSet> application, Path tenantPath, Instant now) { - status = Session.Status.PREPARE; - this.dockerImageRepository = params.dockerImageRepository(); - return actions; - } - public void setStatus(Session.Status status) { this.status = status; } @@ -143,10 +126,6 @@ public class SessionHandlerTest { @Override public void delete(NestedTransaction transaction) { } - @Override - public Optional<DockerImage> getDockerImageRepository() { - return dockerImageRepository; - } } public enum Cmd { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java index fa81b16be76..9d84d5a7f28 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java @@ -17,7 +17,6 @@ import com.yahoo.vespa.config.server.application.TenantApplications; import com.yahoo.vespa.config.server.deploy.DeployHandlerLogger; import com.yahoo.vespa.config.server.deploy.TenantFileSystemDirs; import com.yahoo.vespa.config.server.deploy.ZooKeeperClient; -import com.yahoo.vespa.config.server.host.HostRegistry; import com.yahoo.vespa.config.server.tenant.TenantRepository; import com.yahoo.vespa.config.server.zookeeper.ConfigCurator; import com.yahoo.vespa.curator.Curator; @@ -43,18 +42,22 @@ import static org.junit.Assert.assertTrue; public class LocalSessionTest { private static final File testApp = new File("src/test/apps/app"); + private static final TenantName tenantName = TenantName.from("test_tenant"); + private static final Path tenantPath = Path.createRoot(); - private Path tenantPath = Path.createRoot(); + TenantRepository tenantRepository; private Curator curator; private ConfigCurator configCurator; private TenantFileSystemDirs tenantFileSystemDirs; @Before public void setupTest() { + tenantRepository = new TenantRepository(new TestComponentRegistry.Builder().build(), false); + tenantRepository.addTenant(tenantName); curator = new MockCurator(); configCurator = ConfigCurator.create(curator); tenantFileSystemDirs = new TenantFileSystemDirs(uncheck(() -> Files.createTempDirectory("serverdb")).toFile(), - TenantName.from("test_tenant")); + tenantName); } @Test @@ -116,15 +119,10 @@ public class LocalSessionTest { } private LocalSession createSession(TenantName tenant, long sessionId) throws Exception { - SessionTest.MockSessionPreparer preparer = new SessionTest.MockSessionPreparer(); - return createSession(tenant, sessionId, preparer); + return createSession(tenant, sessionId, Optional.empty()); } - private LocalSession createSession(TenantName tenant, long sessionId, SessionTest.MockSessionPreparer preparer) throws Exception { - return createSession(tenant, sessionId, preparer, Optional.empty()); - } - - private LocalSession createSession(TenantName tenant, long sessionId, SessionTest.MockSessionPreparer preparer, + private LocalSession createSession(TenantName tenant, long sessionId, Optional<AllocatedHosts> allocatedHosts) throws Exception { SessionZooKeeperClient zkc = new MockSessionZKClient(curator, tenant, sessionId, allocatedHosts); zkc.createWriteStatusTransaction(Session.Status.NEW).commit(); @@ -139,7 +137,7 @@ public class LocalSessionTest { TenantApplications applications = TenantApplications.create( new TestComponentRegistry.Builder().curator(curator).build(), tenant); applications.createApplication(zkc.readApplicationId()); - return new LocalSession(tenant, sessionId, preparer, FilesApplicationPackage.fromFile(testApp), + return new LocalSession(tenant, sessionId, FilesApplicationPackage.fromFile(testApp), zkc, sessionDir, applications); } @@ -148,7 +146,8 @@ public class LocalSessionTest { } private void doPrepare(LocalSession session, PrepareParams params) { - session.prepare(getLogger(), params, Optional.empty(), tenantPath, Instant.now()); + SessionRepository sessionRepository = tenantRepository.getTenant(tenantName).getSessionRepository(); + sessionRepository.prepareLocalSession(session, getLogger(), params, Optional.empty(), tenantPath, Instant.now()); } private DeployHandlerLogger getLogger() { |