summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java4
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java6
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java57
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSession.java20
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java34
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionPreparer.java7
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java49
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenant.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/SessionHandlerTest.java23
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/session/LocalSessionTest.java23
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() {