aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2020-10-20 12:45:38 +0200
committerGitHub <noreply@github.com>2020-10-20 12:45:38 +0200
commitc8409e4d6bd06adcc29bdf20328ef782a5d6f2ef (patch)
treef1a39ff4a7d1887c519c292f0bbdc45327593ed6
parent169fcaabd9ae451fc241f572a7bbd8185af30808 (diff)
Revert "Revert "Merge LocalSession and RemoteSession""
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java46
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ApplicationPackageMaintainer.java8
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java12
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java28
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSession.java61
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java37
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java210
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java10
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SilentDeployLogger.java2
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java65
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/deploy/RedeployTest.java4
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java23
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionRepositoryTest.java36
14 files changed, 182 insertions, 362 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 157e1bd838c..b454e5b063d 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
@@ -50,9 +50,7 @@ import com.yahoo.vespa.config.server.http.v2.ProtonMetricsResponse;
import com.yahoo.vespa.config.server.metrics.DeploymentMetricsRetriever;
import com.yahoo.vespa.config.server.metrics.ProtonMetricsRetriever;
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.RemoteSession;
import com.yahoo.vespa.config.server.session.Session;
import com.yahoo.vespa.config.server.session.SessionRepository;
import com.yahoo.vespa.config.server.session.SilentDeployLogger;
@@ -482,10 +480,10 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
Optional<Long> activeSession = tenantApplications.activeSessionOf(applicationId);
if (activeSession.isEmpty()) return false;
- // Deleting an application is done by deleting the remote session, other config
+ // Deleting an application is done by deleting the session, other config
// servers will pick this up and clean up through the watcher in this class
try {
- Session session = getRemoteSession(tenant, activeSession.get());
+ Session session = getSession(tenant, activeSession.get());
tenant.getSessionRepository().delete(session);
} catch (NotFoundException e) {
log.log(Level.INFO, TenantRepository.logPre(applicationId) + "Active session exists, but has not been deleted properly. Trying to cleanup");
@@ -609,7 +607,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
Tenant tenant = getTenant(applicationId);
if (tenant == null) throw new NotFoundException("Tenant '" + applicationId.tenant() + "' not found");
long sessionId = getSessionIdForApplication(tenant, applicationId);
- RemoteSession session = getRemoteSession(tenant, sessionId);
+ Session session = getSession(tenant, sessionId);
SessionRepository sessionRepository = tenant.getSessionRepository();
return sessionRepository.ensureApplicationLoaded(session).getForVersionOrLatest(version, clock.instant());
} catch (NotFoundException e) {
@@ -761,7 +759,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
*
* @return the active session, or null if there is no active session for the given application id.
*/
- public RemoteSession getActiveRemoteSession(ApplicationId applicationId) {
+ public Session getActiveRemoteSession(ApplicationId applicationId) {
Tenant tenant = getTenant(applicationId);
if (tenant == null) throw new IllegalArgumentException("Could not find any tenant for '" + applicationId + "'");
return getActiveSession(tenant, applicationId);
@@ -781,14 +779,14 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
}
public void validateThatSessionIsNotActive(Tenant tenant, long sessionId) {
- Session session = getRemoteSession(tenant, sessionId);
+ Session session = getSession(tenant, sessionId);
if (Session.Status.ACTIVATE.equals(session.getStatus())) {
throw new IllegalStateException("Session is active: " + sessionId);
}
}
public void validateThatSessionIsPrepared(Tenant tenant, long sessionId) {
- Session session = getRemoteSession(tenant, sessionId);
+ Session session = getSession(tenant, sessionId);
if ( ! Session.Status.PREPARE.equals(session.getStatus()))
throw new IllegalStateException("Session not prepared: " + sessionId);
}
@@ -819,9 +817,9 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
return session.getSessionId();
}
- public void deleteExpiredLocalSessions() {
- Map<Tenant, Collection<LocalSession>> sessionsPerTenant = new HashMap<>();
- tenantRepository.getAllTenants().forEach(tenant -> sessionsPerTenant.put(tenant, tenant.getSessionRepository().getLocalSessions()));
+ public void deleteExpiredSessions() {
+ Map<Tenant, Collection<Session>> sessionsPerTenant = new HashMap<>();
+ tenantRepository.getAllTenants().forEach(tenant -> sessionsPerTenant.put(tenant, tenant.getSessionRepository().getSessions()));
Set<ApplicationId> applicationIds = new HashSet<>();
sessionsPerTenant.values()
@@ -839,18 +837,6 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
sessionsPerTenant.keySet().forEach(tenant -> tenant.getSessionRepository().deleteExpiredSessions(activeSessions));
}
- public int deleteExpiredRemoteSessions(Duration expiryTime) {
- return deleteExpiredRemoteSessions(clock, expiryTime);
- }
-
- public int deleteExpiredRemoteSessions(Clock clock, Duration expiryTime) {
- return tenantRepository.getAllTenants()
- .stream()
- .map(tenant -> tenant.getSessionRepository().deleteExpiredRemoteSessions(clock, expiryTime))
- .mapToInt(i -> i)
- .sum();
- }
-
// ---------------- Tenant operations ----------------------------------------------------------------
@@ -923,14 +909,14 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
}
private Session getLocalSession(Tenant tenant, long sessionId) {
- Session session = tenant.getSessionRepository().getLocalSession(sessionId);
+ Session session = tenant.getSessionRepository().getSession(sessionId);
if (session == null) throw new NotFoundException("Session " + sessionId + " was not found");
return session;
}
- private RemoteSession getRemoteSession(Tenant tenant, long sessionId) {
- RemoteSession session = tenant.getSessionRepository().getRemoteSession(sessionId);
+ private Session getSession(Tenant tenant, long sessionId) {
+ Session session = tenant.getSessionRepository().getSession(sessionId);
if (session == null) throw new NotFoundException("Session " + sessionId + " was not found");
return session;
@@ -966,13 +952,13 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
// TODO: Merge this and getActiveSession(), they are almost identical
private Session getExistingSession(Tenant tenant, ApplicationId applicationId) {
TenantApplications applicationRepo = tenant.getApplicationRepo();
- return getRemoteSession(tenant, applicationRepo.requireActiveSessionOf(applicationId));
+ return getSession(tenant, applicationRepo.requireActiveSessionOf(applicationId));
}
- public RemoteSession getActiveSession(Tenant tenant, ApplicationId applicationId) {
+ public Session getActiveSession(Tenant tenant, ApplicationId applicationId) {
TenantApplications applicationRepo = tenant.getApplicationRepo();
if (applicationRepo.activeApplications().contains(applicationId)) {
- return tenant.getSessionRepository().getRemoteSession(applicationRepo.requireActiveSessionOf(applicationId));
+ return tenant.getSessionRepository().getSession(applicationRepo.requireActiveSessionOf(applicationId));
}
return null;
}
@@ -980,7 +966,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
public Session getActiveLocalSession(Tenant tenant, ApplicationId applicationId) {
TenantApplications applicationRepo = tenant.getApplicationRepo();
if (applicationRepo.activeApplications().contains(applicationId)) {
- return tenant.getSessionRepository().getLocalSession(applicationRepo.requireActiveSessionOf(applicationId));
+ return tenant.getSessionRepository().getSession(applicationRepo.requireActiveSessionOf(applicationId));
}
return null;
}
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 7d58682947f..3c22c05ae2d 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
@@ -94,7 +94,7 @@ public class Deployment implements com.yahoo.config.provision.Deployment {
PrepareParams params = this.params.get();
ApplicationId applicationId = params.getApplicationId();
try (ActionTimer timer = applicationRepository.timerFor(applicationId, "deployment.prepareMillis")) {
- this.configChangeActions = tenant.getSessionRepository().prepareLocalSession(session, deployLogger, params, clock.instant());
+ this.configChangeActions = tenant.getSessionRepository().prepareSession(session, deployLogger, params, clock.instant());
this.prepared = true;
}
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ApplicationPackageMaintainer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ApplicationPackageMaintainer.java
index aa709b3bf37..f73afc7c711 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ApplicationPackageMaintainer.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ApplicationPackageMaintainer.java
@@ -70,7 +70,7 @@ public class ApplicationPackageMaintainer extends ConfigServerMaintainer {
continue;
}
}
- createLocalSessionIfMissing(applicationId, sessionId);
+ createSessionIfMissing(applicationId, sessionId);
}
}
}
@@ -83,11 +83,11 @@ public class ApplicationPackageMaintainer extends ConfigServerMaintainer {
super.close();
}
- private void createLocalSessionIfMissing(ApplicationId applicationId, long sessionId) {
+ private void createSessionIfMissing(ApplicationId applicationId, long sessionId) {
Tenant tenant = applicationRepository.getTenant(applicationId);
SessionRepository sessionRepository = tenant.getSessionRepository();
- if (sessionRepository.getLocalSession(sessionId) == null)
- sessionRepository.createLocalSessionFromDistributedApplicationPackage(sessionId);
+ if (sessionRepository.getSession(sessionId) == null)
+ sessionRepository.createSessionFromDistributedApplicationPackage(sessionId);
}
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java
index 19534bba810..32b067b5731 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/SessionsMaintainer.java
@@ -1,7 +1,6 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.config.server.maintenance;
-import com.yahoo.log.LogLevel;
import com.yahoo.vespa.config.server.ApplicationRepository;
import com.yahoo.vespa.curator.Curator;
import com.yahoo.vespa.flags.FlagSource;
@@ -16,23 +15,14 @@ import java.time.Duration;
* @author hmusum
*/
public class SessionsMaintainer extends ConfigServerMaintainer {
- private final boolean hostedVespa;
SessionsMaintainer(ApplicationRepository applicationRepository, Curator curator, Duration interval, FlagSource flagSource) {
super(applicationRepository, curator, flagSource, Duration.ofMinutes(1), interval);
- this.hostedVespa = applicationRepository.configserverConfig().hostedVespa();
}
@Override
protected boolean maintain() {
- applicationRepository.deleteExpiredLocalSessions();
-
- if (hostedVespa) {
- Duration expiryTime = Duration.ofMinutes(90);
- int deleted = applicationRepository.deleteExpiredRemoteSessions(expiryTime);
- log.log(LogLevel.FINE, () -> "Deleted " + deleted + " expired remote sessions older than " + expiryTime);
- }
-
+ applicationRepository.deleteExpiredSessions();
return 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
deleted file mode 100644
index f842578b657..00000000000
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/LocalSession.java
+++ /dev/null
@@ -1,28 +0,0 @@
-// 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.session;
-
-import com.yahoo.config.application.api.ApplicationPackage;
-import com.yahoo.config.provision.TenantName;
-
-/**
- * A LocalSession is a session that has been created locally on this configserver. A local session can be edited and
- * prepared. Deleting a local session will ensure that the local filesystem state and global zookeeper state is
- * cleaned for this session.
- *
- * @author Ulf Lilleengen
- */
-// This is really the store of an application, whether it is active or in an edit session
-// TODO: Separate the "application store" and "session" aspects - the latter belongs in the HTTP layer -bratseth
-public class LocalSession extends Session {
-
- /**
- * 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, ApplicationPackage applicationPackage,
- SessionZooKeeperClient sessionZooKeeperClient) {
- super(tenant, sessionId, sessionZooKeeperClient, applicationPackage);
- }
-
-}
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
deleted file mode 100644
index de5f1392242..00000000000
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSession.java
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.config.server.session;
-
-import com.yahoo.config.provision.TenantName;
-import com.yahoo.vespa.config.server.application.ApplicationSet;
-
-import java.util.Objects;
-import java.util.Optional;
-
-/**
- * A RemoteSession represents a session created on another config server. This session can
- * be regarded as read only, and this interface only allows reading information about a session.
- *
- * @author Ulf Lilleengen
- */
-public class RemoteSession extends Session {
-
- private final Optional<ApplicationSet> applicationSet;
-
- /**
- * Creates a session. This involves loading the application, validating it and distributing it.
- *
- * @param tenant The name of the tenant creating session
- * @param sessionId The session id for this session.
- * @param zooKeeperClient a SessionZooKeeperClient instance
- */
- RemoteSession(TenantName tenant, long sessionId, SessionZooKeeperClient zooKeeperClient) {
- this(tenant, sessionId, zooKeeperClient, Optional.empty());
- }
-
- /**
- * Creates a remote session, with application set
- *
- * @param tenant The name of the tenant creating session
- * @param sessionId The session id for this session.
- * @param zooKeeperClient a SessionZooKeeperClient instance
- * @param applicationSet current application set for this session
- */
- RemoteSession(TenantName tenant, long sessionId, SessionZooKeeperClient zooKeeperClient, Optional<ApplicationSet> applicationSet) {
- super(tenant, sessionId, zooKeeperClient);
- this.applicationSet = applicationSet;
- }
-
- @Override
- Optional<ApplicationSet> applicationSet() { return applicationSet; }
-
- public synchronized RemoteSession activated(ApplicationSet applicationSet) {
- Objects.requireNonNull(applicationSet, "applicationSet cannot be null");
- return new RemoteSession(tenant, sessionId, sessionZooKeeperClient, Optional.of(applicationSet));
- }
-
- public synchronized RemoteSession deactivated() {
- return new RemoteSession(tenant, sessionId, sessionZooKeeperClient, Optional.empty());
- }
-
- @Override
- public String toString() {
- return super.toString() + ",application set=" + applicationSet;
- }
-
-}
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 69dfc4d627d..d5e158cd9ac 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
@@ -17,38 +17,34 @@ import com.yahoo.vespa.config.server.application.ApplicationSet;
import com.yahoo.vespa.config.server.tenant.TenantRepository;
import java.time.Instant;
+import java.util.Objects;
import java.util.Optional;
/**
- * A session represents an instance of an application that can be edited, prepared and activated. This
- * class represents the common stuff between sessions working on the local file
- * system ({@link LocalSession}s) and sessions working on zookeeper ({@link RemoteSession}s).
+ * A session represents an instance of an application that can be edited, prepared and activated.
*
* @author Ulf Lilleengen
* @author hmusum
*/
-public abstract class Session implements Comparable<Session> {
+public class Session implements Comparable<Session> {
protected final long sessionId;
protected final TenantName tenant;
protected final SessionZooKeeperClient sessionZooKeeperClient;
protected final Optional<ApplicationPackage> applicationPackage;
+ private final Optional<ApplicationSet> applicationSet;
- protected Session(TenantName tenant, long sessionId, SessionZooKeeperClient sessionZooKeeperClient) {
- this(tenant, sessionId, sessionZooKeeperClient, Optional.empty());
+ public Session(TenantName tenant, long sessionId, SessionZooKeeperClient sessionZooKeeperClient, ApplicationPackage applicationPackage) {
+ this(tenant, sessionId, sessionZooKeeperClient, Optional.of(applicationPackage), Optional.empty());
}
- protected Session(TenantName tenant, long sessionId, SessionZooKeeperClient sessionZooKeeperClient,
- ApplicationPackage applicationPackage) {
- this(tenant, sessionId, sessionZooKeeperClient, Optional.of(applicationPackage));
- }
-
- private Session(TenantName tenant, long sessionId, SessionZooKeeperClient sessionZooKeeperClient,
- Optional<ApplicationPackage> applicationPackage) {
+ public Session(TenantName tenant, long sessionId, SessionZooKeeperClient sessionZooKeeperClient,
+ Optional<ApplicationPackage> applicationPackage, Optional<ApplicationSet> applicationSet) {
this.tenant = tenant;
this.sessionId = sessionId;
this.sessionZooKeeperClient = sessionZooKeeperClient;
this.applicationPackage = applicationPackage;
+ this.applicationSet = applicationSet;
}
public final long getSessionId() {
@@ -63,9 +59,18 @@ public abstract class Session implements Comparable<Session> {
return sessionZooKeeperClient;
}
+ public synchronized Session activated(ApplicationSet applicationSet) {
+ Objects.requireNonNull(applicationSet, "applicationSet cannot be null");
+ return new Session(tenant, sessionId, sessionZooKeeperClient, applicationPackage, Optional.of(applicationSet));
+ }
+
+ public synchronized Session deactivated() {
+ return new Session(tenant, sessionId, sessionZooKeeperClient, applicationPackage, Optional.empty());
+ }
+
@Override
public String toString() {
- return "Session,id=" + sessionId;
+ return "Session,id=" + sessionId + ",application set=" + applicationSet + ",application package=" + applicationPackage;
}
public long getActiveSessionAtCreate() {
@@ -181,14 +186,14 @@ public abstract class Session implements Comparable<Session> {
return applicationPackage.orElseThrow(() -> new RuntimeException("No application package found for " + this));
}
- public ApplicationFile getApplicationFile(Path relativePath, LocalSession.Mode mode) {
+ public ApplicationFile getApplicationFile(Path relativePath, Session.Mode mode) {
if (mode.equals(Session.Mode.WRITE)) {
markSessionEdited();
}
return getApplicationPackage().getFile(relativePath);
}
- Optional<ApplicationSet> applicationSet() { return Optional.empty(); };
+ Optional<ApplicationSet> applicationSet() { return applicationSet; }
private void markSessionEdited() {
setStatus(Session.Status.NEW);
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 59146c339d3..7d92cc88783 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
@@ -73,8 +73,7 @@ public class SessionRepository {
private static final FilenameFilter sessionApplicationsFilter = (dir, name) -> name.matches("\\d+");
private static final long nonExistingActiveSessionId = 0;
- private final Map<Long, LocalSession> localSessionCache = new ConcurrentHashMap<>();
- private final Map<Long, RemoteSession> remoteSessionCache = new ConcurrentHashMap<>();
+ private final Map<Long, Session> sessionCache = new ConcurrentHashMap<>();
private final Map<Long, SessionStateWatcher> sessionStateWatchers = new HashMap<>();
private final Duration sessionLifetime;
private final Clock clock;
@@ -104,36 +103,27 @@ public class SessionRepository {
this.applicationRepo = applicationRepo;
this.sessionPreparer = sessionPreparer;
this.metrics = componentRegistry.getMetrics().getOrCreateMetricUpdater(Metrics.createDimensions(tenantName));
- loadSessions(); // Needs to be done before creating cache below
+ loadAll(); // Needs to be done before creating cache below
this.directoryCache = curator.createDirectoryCache(sessionsPath.getAbsolute(), false, false, componentRegistry.getZkCacheExecutor());
this.directoryCache.addListener(this::childEvent);
this.directoryCache.start();
}
- private void loadSessions() {
- loadLocalSessions();
- loadRemoteSessions();
+ private void loadAll() {
+ loadSessionsFromFileSystem();
+ loadSessions();
}
- // ---------------- Local sessions ----------------------------------------------------------------
-
- public synchronized void addLocalSession(LocalSession session) {
+ public synchronized void addSession(Session session) {
long sessionId = session.getSessionId();
- localSessionCache.put(sessionId, session);
- if (remoteSessionCache.get(sessionId) == null) {
- createRemoteSession(sessionId);
- }
- }
-
- public LocalSession getLocalSession(long sessionId) {
- return localSessionCache.get(sessionId);
+ sessionCache.put(sessionId, session);
}
- public Collection<LocalSession> getLocalSessions() {
- return localSessionCache.values();
+ public Collection<Session> getSessions() {
+ return sessionCache.values();
}
- private void loadLocalSessions() {
+ private void loadSessionsFromFileSystem() {
File[] sessions = tenantFileSystemDirs.sessionsPath().listFiles(sessionApplicationsFilter);
if (sessions == null) return;
@@ -147,7 +137,7 @@ public class SessionRepository {
}
}
- public ConfigChangeActions prepareLocalSession(Session session, DeployLogger logger, PrepareParams params, Instant now) {
+ public ConfigChangeActions prepareSession(Session session, DeployLogger logger, PrepareParams params, 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();
@@ -171,10 +161,10 @@ public class SessionRepository {
* @param timeoutBudget timeout for creating session and waiting for other servers.
* @return a new session
*/
- public LocalSession createSessionFromExisting(Session existingSession, boolean internalRedeploy, TimeoutBudget timeoutBudget) {
+ public Session createSessionFromExisting(Session existingSession, boolean internalRedeploy, TimeoutBudget timeoutBudget) {
ApplicationId existingApplicationId = existingSession.getApplicationId();
File existingApp = getSessionAppDir(existingSession.getSessionId());
- LocalSession session = createSessionFromApplication(existingApp, existingApplicationId, internalRedeploy, timeoutBudget);
+ Session session = createSessionFromApplication(existingApp, existingApplicationId, internalRedeploy, timeoutBudget);
// Note: Setters below need to be kept in sync with calls in SessionPreparer.writeStateToZooKeeper()
session.setApplicationId(existingApplicationId);
session.setApplicationPackageReference(existingSession.getApplicationPackageReference());
@@ -192,93 +182,59 @@ public class SessionRepository {
* @param timeoutBudget Timeout for creating session and waiting for other servers.
* @return a new session
*/
- public LocalSession createSessionFromApplicationPackage(File applicationDirectory, ApplicationId applicationId, TimeoutBudget timeoutBudget) {
+ public Session createSessionFromApplicationPackage(File applicationDirectory, ApplicationId applicationId, TimeoutBudget timeoutBudget) {
applicationRepo.createApplication(applicationId);
return createSessionFromApplication(applicationDirectory, applicationId, false, timeoutBudget);
}
- /**
- * This method is used when creating a session based on a remote session and the distributed application package
- * It does not wait for session being created on other servers
- */
- private void createLocalSession(File applicationFile, ApplicationId applicationId, long sessionId) {
- try {
- ApplicationPackage applicationPackage = createApplicationPackage(applicationFile, applicationId, sessionId, false);
- createLocalSession(sessionId, applicationPackage);
- } catch (Exception e) {
- throw new RuntimeException("Error creating session " + sessionId, e);
- }
- }
-
// Will delete session data in ZooKeeper and file system
- public void deleteLocalSession(LocalSession session) {
+ public void deleteLocalSession(Session session) {
long sessionId = session.getSessionId();
- log.log(Level.FINE, () -> "Deleting local session " + sessionId);
+ log.log(Level.FINE, () -> "Deleting session " + sessionId);
SessionStateWatcher watcher = sessionStateWatchers.remove(sessionId);
if (watcher != null) watcher.close();
- localSessionCache.remove(sessionId);
+ sessionCache.remove(sessionId);
NestedTransaction transaction = new NestedTransaction();
transaction.add(FileTransaction.from(FileOperations.delete(getSessionAppDir(sessionId).getAbsolutePath())));
transaction.commit();
}
private void deleteAllSessions() {
- List<LocalSession> sessions = new ArrayList<>(localSessionCache.values());
- for (LocalSession session : sessions) {
+ List<Session> sessions = new ArrayList<>(sessionCache.values());
+ for (Session session : sessions) {
deleteLocalSession(session);
}
}
- // ---------------- Remote sessions ----------------------------------------------------------------
-
- public RemoteSession getRemoteSession(long sessionId) {
- return remoteSessionCache.get(sessionId);
+ public Session getSession(long sessionId) {
+ return sessionCache.get(sessionId);
}
public List<Long> getRemoteSessionsFromZooKeeper() {
return getSessionList(curator.getChildren(sessionsPath));
}
- public synchronized RemoteSession createRemoteSession(long sessionId) {
+ public synchronized Session createSession(long sessionId) {
SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(sessionId);
- RemoteSession session = new RemoteSession(tenantName, sessionId, sessionZKClient);
- remoteSessionCache.put(sessionId, session);
+ Session session = new Session(tenantName, sessionId, sessionZKClient, Optional.empty(), Optional.empty());
+ sessionCache.put(sessionId, session);
loadSessionIfActive(session);
updateSessionStateWatcher(sessionId, session);
return session;
}
- public int deleteExpiredRemoteSessions(Clock clock, Duration expiryTime) {
- int deleted = 0;
- for (long sessionId : getRemoteSessionsFromZooKeeper()) {
- Session session = remoteSessionCache.get(sessionId);
- if (session == null) continue; // Internal sessions not in sync with zk, continue
- if (session.getStatus() == Session.Status.ACTIVATE) continue;
- if (sessionHasExpired(session.getCreateTime(), expiryTime, clock)) {
- log.log(Level.FINE, () -> "Remote session " + sessionId + " for " + tenantName + " has expired, deleting it");
- deleteRemoteSessionFromZooKeeper(session);
- deleted++;
- }
- }
- return deleted;
- }
-
- public void deactivateAndUpdateCache(RemoteSession remoteSession) {
- RemoteSession session = remoteSession.deactivated();
- remoteSessionCache.put(session.getSessionId(), session);
+ public void deactivateAndUpdateCache(Session session) {
+ Session deactivated = session.deactivated();
+ sessionCache.put(deactivated.getSessionId(), deactivated);
}
- public void deleteRemoteSessionFromZooKeeper(Session session) {
+ public void deleteSessionFromZooKeeper(Session session) {
SessionZooKeeperClient sessionZooKeeperClient = createSessionZooKeeperClient(session.getSessionId());
Transaction transaction = sessionZooKeeperClient.deleteTransaction();
transaction.commit();
transaction.close();
}
- private boolean sessionHasExpired(Instant created, Duration expiryTime, Clock clock) {
- return (created.plus(expiryTime).isBefore(clock.instant()));
- }
-
private List<Long> getSessionListFromDirectoryCache(List<ChildData> children) {
return getSessionList(children.stream()
.map(child -> Path.fromString(child.getPath()).getName())
@@ -289,7 +245,7 @@ public class SessionRepository {
return children.stream().map(Long::parseLong).collect(Collectors.toList());
}
- private void loadRemoteSessions() throws NumberFormatException {
+ private void loadSessions() throws NumberFormatException {
getRemoteSessionsFromZooKeeper().forEach(this::sessionAdded);
}
@@ -299,16 +255,16 @@ public class SessionRepository {
* @param sessionId session id for the new session
*/
public synchronized void sessionAdded(long sessionId) {
- log.log(Level.FINE, () -> "Adding remote session " + sessionId);
- Session session = createRemoteSession(sessionId);
+ log.log(Level.FINE, () -> "Adding session " + sessionId);
+ Session session = createSession(sessionId);
if (session.getStatus() == Session.Status.NEW) {
log.log(Level.FINE, () -> session.logPre() + "Confirming upload for session " + sessionId);
confirmUpload(session);
}
- createLocalSessionFromDistributedApplicationPackage(sessionId);
+ createSessionFromDistributedApplicationPackage(sessionId);
}
- void activate(RemoteSession session) {
+ void activate(Session session) {
long sessionId = session.getSessionId();
Curator.CompletionWaiter waiter = createSessionZooKeeperClient(sessionId).getActiveWaiter();
log.log(Level.FINE, () -> session.logPre() + "Getting session from repo: " + session);
@@ -320,28 +276,21 @@ public class SessionRepository {
log.log(Level.INFO, session.logPre() + "Session activated: " + sessionId);
}
- public void delete(Session remoteSession) {
- long sessionId = remoteSession.getSessionId();
- // TODO: Change log level to FINE when debugging is finished
- log.log(Level.INFO, () -> remoteSession.logPre() + "Deactivating and deleting remote session " + sessionId);
- deleteRemoteSessionFromZooKeeper(remoteSession);
- remoteSessionCache.remove(sessionId);
- LocalSession localSession = getLocalSession(sessionId);
- if (localSession != null) {
- // TODO: Change log level to FINE when debugging is finished
- log.log(Level.INFO, () -> localSession.logPre() + "Deleting local session " + sessionId);
- deleteLocalSession(localSession);
- }
+ public void delete(Session session) {
+ long sessionId = session.getSessionId();
+ deleteSessionFromZooKeeper(session);
+ sessionCache.remove(sessionId);
+ deleteLocalSession(session);
}
private void sessionRemoved(long sessionId) {
SessionStateWatcher watcher = sessionStateWatchers.remove(sessionId);
if (watcher != null) watcher.close();
- remoteSessionCache.remove(sessionId);
+ sessionCache.remove(sessionId);
metrics.incRemovedSessions();
}
- private void loadSessionIfActive(RemoteSession session) {
+ private void loadSessionIfActive(Session session) {
for (ApplicationId applicationId : applicationRepo.activeApplications()) {
if (applicationRepo.requireActiveSessionOf(applicationId) == session.getSessionId()) {
log.log(Level.FINE, () -> "Found active application for session " + session.getSessionId() + " , loading it");
@@ -352,22 +301,22 @@ public class SessionRepository {
}
}
- void prepareRemoteSession(RemoteSession session) {
+ void prepare(Session session) {
SessionZooKeeperClient sessionZooKeeperClient = createSessionZooKeeperClient(session.getSessionId());
Curator.CompletionWaiter waiter = sessionZooKeeperClient.getPrepareWaiter();
ensureApplicationLoaded(session);
notifyCompletion(waiter, session);
}
- public ApplicationSet ensureApplicationLoaded(RemoteSession session) {
+ public ApplicationSet ensureApplicationLoaded(Session session) {
if (session.applicationSet().isPresent()) {
return session.applicationSet().get();
}
ApplicationSet applicationSet = loadApplication(session);
- RemoteSession activated = session.activated(applicationSet);
+ Session activated = session.activated(applicationSet);
long sessionId = activated.getSessionId();
- remoteSessionCache.put(sessionId, activated);
+ sessionCache.put(sessionId, activated);
updateSessionStateWatcher(sessionId, activated);
return applicationSet;
@@ -427,7 +376,7 @@ public class SessionRepository {
private void nodeChanged() {
zkWatcherExecutor.execute(() -> {
Multiset<Session.Status> sessionMetrics = HashMultiset.create();
- for (Session session : remoteSessionCache.values()) {
+ for (Session session : sessionCache.values()) {
sessionMetrics.add(session.getStatus());
}
metrics.setNewSessions(sessionMetrics.count(Session.Status.NEW));
@@ -458,20 +407,20 @@ public class SessionRepository {
public void deleteExpiredSessions(Map<ApplicationId, Long> activeSessions) {
log.log(Level.FINE, () -> "Purging old sessions for tenant '" + tenantName + "'");
try {
- for (LocalSession candidate : localSessionCache.values()) {
+ for (Session candidate : sessionCache.values()) {
Instant createTime = candidate.getCreateTime();
log.log(Level.FINE, () -> "Candidate session for deletion: " + candidate.getSessionId() + ", created: " + createTime);
// Sessions with state other than ACTIVATE
if (hasExpired(candidate) && !isActiveSession(candidate)) {
- deleteLocalSession(candidate);
+ delete(candidate);
} else if (createTime.plus(Duration.ofDays(1)).isBefore(clock.instant())) {
// Sessions with state ACTIVATE, but which are not actually active
Optional<ApplicationId> applicationId = candidate.getOptionalApplicationId();
if (applicationId.isEmpty()) continue;
Long activeSession = activeSessions.get(applicationId.get());
if (activeSession == null || activeSession != candidate.getSessionId()) {
- deleteLocalSession(candidate);
+ delete(candidate);
log.log(Level.INFO, "Deleted inactive session " + candidate.getSessionId() + " created " +
createTime + " for '" + applicationId + "'");
}
@@ -484,11 +433,11 @@ public class SessionRepository {
log.log(Level.FINE, () -> "Done purging old sessions");
}
- private boolean hasExpired(LocalSession candidate) {
- return (candidate.getCreateTime().plus(sessionLifetime).isBefore(clock.instant()));
+ private boolean hasExpired(Session candidate) {
+ return candidate.getCreateTime().plus(sessionLifetime).isBefore(clock.instant());
}
- private boolean isActiveSession(LocalSession candidate) {
+ private boolean isActiveSession(Session candidate) {
return candidate.getStatus() == Session.Status.ACTIVATE;
}
@@ -515,10 +464,10 @@ public class SessionRepository {
return FilesApplicationPackage.fromFileWithDeployData(configApplicationDir, deployData);
}
- private LocalSession createSessionFromApplication(File applicationFile,
- ApplicationId applicationId,
- boolean internalRedeploy,
- TimeoutBudget timeoutBudget) {
+ private Session createSessionFromApplication(File applicationFile,
+ ApplicationId applicationId,
+ boolean internalRedeploy,
+ TimeoutBudget timeoutBudget) {
long sessionId = getNextSessionId();
try {
ensureSessionPathDoesNotExist(sessionId);
@@ -527,9 +476,9 @@ public class SessionRepository {
SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(sessionId);
sessionZKClient.createNewSession(clock.instant());
Curator.CompletionWaiter waiter = sessionZKClient.getUploadWaiter();
- LocalSession session = new LocalSession(tenantName, sessionId, app, sessionZKClient);
+ Session session = new Session(tenantName, sessionId, sessionZKClient, app);
waiter.awaitCompletion(timeoutBudget.timeLeft());
- addLocalSession(session);
+ addSession(session);
return session;
} catch (Exception e) {
throw new RuntimeException("Error creating session " + sessionId, e);
@@ -555,8 +504,8 @@ public class SessionRepository {
Optional<ApplicationSet> currentActiveApplicationSet = Optional.empty();
try {
long currentActiveSessionId = applicationRepo.requireActiveSessionOf(appId);
- RemoteSession currentActiveSession = getRemoteSession(currentActiveSessionId);
- currentActiveApplicationSet = Optional.ofNullable(ensureApplicationLoaded(currentActiveSession));
+ Session activeSession = getSession(currentActiveSessionId);
+ currentActiveApplicationSet = Optional.ofNullable(ensureApplicationLoaded(activeSession));
} catch (IllegalArgumentException e) {
// Do nothing if we have no currently active session
}
@@ -590,29 +539,29 @@ public class SessionRepository {
void createSessionFromId(long sessionId) {
File sessionDir = getAndValidateExistingSessionAppDir(sessionId);
ApplicationPackage applicationPackage = FilesApplicationPackage.fromFile(sessionDir);
- createLocalSession(sessionId, applicationPackage);
+ createSessionWithApplicationPackage(sessionId, applicationPackage);
}
- void createLocalSession(long sessionId, ApplicationPackage applicationPackage) {
+ void createSessionWithApplicationPackage(long sessionId, ApplicationPackage applicationPackage) {
SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(sessionId);
- LocalSession session = new LocalSession(tenantName, sessionId, applicationPackage, sessionZKClient);
- addLocalSession(session);
+ Session session = new Session(tenantName, sessionId, sessionZKClient, applicationPackage);
+ addSession(session);
}
/**
- * Returns a new local session for the given session id if it does not already exist.
- * Will also add the session to the local session cache if necessary
+ * Returns a new session for the given session id if it does not already exist.
+ * Will also add the session to the session cache if necessary
*/
- public void createLocalSessionFromDistributedApplicationPackage(long sessionId) {
+ public void createSessionFromDistributedApplicationPackage(long sessionId) {
if (applicationRepo.sessionExistsInFileSystem(sessionId)) {
- log.log(Level.FINE, () -> "Local session for session id " + sessionId + " already exists");
+ log.log(Level.FINE, () -> "Session " + sessionId + " already exists");
createSessionFromId(sessionId);
return;
}
SessionZooKeeperClient sessionZKClient = createSessionZooKeeperClient(sessionId);
FileReference fileReference = sessionZKClient.readApplicationPackageReference();
- log.log(Level.FINE, () -> "File reference for session id " + sessionId + ": " + fileReference);
+ log.log(Level.FINE, () -> "File reference for session " + sessionId + ": " + fileReference);
if (fileReference != null) {
File rootDir = new File(Defaults.getDefaults().underVespaHome(componentRegistry.getConfigserverConfig().fileReferencesDir()));
File sessionDir;
@@ -622,13 +571,18 @@ public class SessionRepository {
} catch (IllegalArgumentException e) {
// We cannot be guaranteed that the file reference exists (it could be that it has not
// been downloaded yet), and e.g when bootstrapping we cannot throw an exception in that case
- log.log(Level.FINE, "File reference for session id " + sessionId + ": " + fileReference + " not found in " + fileDirectory);
+ log.log(Level.FINE, "File reference for session " + sessionId + ": " + fileReference + " not found in " + fileDirectory);
return;
}
ApplicationId applicationId = sessionZKClient.readApplicationId()
.orElseThrow(() -> new RuntimeException("Could not find application id for session " + sessionId));
- log.log(Level.FINE, () -> "Creating local session for tenant '" + tenantName + "' with session id " + sessionId);
- createLocalSession(sessionDir, applicationId, sessionId);
+ log.log(Level.FINE, () -> "Creating session for tenant '" + tenantName + "' with id " + sessionId);
+ try {
+ ApplicationPackage applicationPackage = createApplicationPackage(sessionDir, applicationId, sessionId, false);
+ createSessionWithApplicationPackage(sessionId, applicationPackage);
+ } catch (Exception e) {
+ throw new RuntimeException("Error creating session " + sessionId, e);
+ }
}
}
@@ -668,20 +622,20 @@ public class SessionRepository {
return new TenantFileSystemDirs(componentRegistry.getConfigServerDB(), tenantName).getUserApplicationDir(sessionId);
}
- private void updateSessionStateWatcher(long sessionId, RemoteSession remoteSession) {
+ private void updateSessionStateWatcher(long sessionId, Session session) {
SessionStateWatcher sessionStateWatcher = sessionStateWatchers.get(sessionId);
if (sessionStateWatcher == null) {
Curator.FileCache fileCache = curator.createFileCache(getSessionStatePath(sessionId).getAbsolute(), false);
fileCache.addListener(this::nodeChanged);
- sessionStateWatchers.put(sessionId, new SessionStateWatcher(fileCache, remoteSession, metrics, zkWatcherExecutor, this));
+ sessionStateWatchers.put(sessionId, new SessionStateWatcher(fileCache, session, metrics, zkWatcherExecutor, this));
} else {
- sessionStateWatcher.updateRemoteSession(remoteSession);
+ sessionStateWatcher.updateRemoteSession(session);
}
}
@Override
public String toString() {
- return getLocalSessions().toString();
+ return getSessions().toString();
}
public Clock clock() { return clock; }
@@ -707,14 +661,14 @@ public class SessionRepository {
}
private void checkForRemovedSessions(List<Long> sessions) {
- for (Session session : remoteSessionCache.values())
+ for (Session session : sessionCache.values())
if ( ! sessions.contains(session.getSessionId()))
sessionRemoved(session.getSessionId());
}
private void checkForAddedSessions(List<Long> sessions) {
for (Long sessionId : sessions)
- if (remoteSessionCache.get(sessionId) == null)
+ if (sessionCache.get(sessionId) == null)
sessionAdded(sessionId);
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java
index 0f433f53c77..f1100b37912 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java
@@ -24,13 +24,13 @@ public class SessionStateWatcher {
private static final Logger log = Logger.getLogger(SessionStateWatcher.class.getName());
private final Curator.FileCache fileCache;
- private volatile RemoteSession session;
+ private volatile Session session;
private final MetricUpdater metrics;
private final Executor zkWatcherExecutor;
private final SessionRepository sessionRepository;
SessionStateWatcher(Curator.FileCache fileCache,
- RemoteSession session,
+ Session session,
MetricUpdater metrics,
Executor zkWatcherExecutor,
SessionRepository sessionRepository) {
@@ -51,7 +51,7 @@ public class SessionStateWatcher {
break;
case PREPARE:
createLocalSession(sessionId);
- sessionRepository.prepareRemoteSession(session);
+ sessionRepository.prepare(session);
break;
case ACTIVATE:
createLocalSession(sessionId);
@@ -66,7 +66,7 @@ public class SessionStateWatcher {
}
private void createLocalSession(long sessionId) {
- sessionRepository.createLocalSessionFromDistributedApplicationPackage(sessionId);
+ sessionRepository.createSessionFromDistributedApplicationPackage(sessionId);
}
public long getSessionId() {
@@ -100,7 +100,7 @@ public class SessionStateWatcher {
});
}
- public synchronized void updateRemoteSession(RemoteSession session) {
+ public synchronized void updateRemoteSession(Session session) {
this.session = session;
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SilentDeployLogger.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SilentDeployLogger.java
index 9e2e5ddf698..e9d5a7da549 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SilentDeployLogger.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SilentDeployLogger.java
@@ -7,7 +7,7 @@ import java.util.logging.Logger;
import com.yahoo.config.application.api.DeployLogger;
/**
- * The purpose of this is to mute the log messages from model and application building in {@link RemoteSession} that
+ * The purpose of this is to mute the log messages from model and application building that
* is triggered by {@link SessionStateWatcher}, since those messages already have been emitted by the prepare
* handler, for the same prepare operation.
*
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 b71d1b99cf0..988c8e59b92 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
@@ -33,7 +33,6 @@ import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.deploy.DeployTester;
import com.yahoo.vespa.config.server.deploy.TenantFileSystemDirs;
import com.yahoo.vespa.config.server.http.v2.PrepareResult;
-import com.yahoo.vespa.config.server.session.LocalSession;
import com.yahoo.vespa.config.server.session.PrepareParams;
import com.yahoo.vespa.config.server.session.Session;
import com.yahoo.vespa.config.server.session.SessionRepository;
@@ -309,10 +308,10 @@ public class ApplicationRepositoryTest {
{
PrepareResult result = deployApp(testApp);
long sessionId = result.sessionId();
- Session applicationData = sessionRepository.getLocalSession(sessionId);
+ Session applicationData = sessionRepository.getSession(sessionId);
assertNotNull(applicationData);
assertNotNull(applicationData.getApplicationId());
- assertNotNull(sessionRepository.getLocalSession(sessionId));
+ assertNotNull(sessionRepository.getSession(sessionId));
assertNotNull(applicationRepository.getActiveSession(applicationId()));
String sessionNode = sessionRepository.getSessionPath(sessionId).getAbsolute();
assertTrue(configCurator.exists(sessionNode));
@@ -323,8 +322,8 @@ public class ApplicationRepositoryTest {
// Delete app and verify that it has been deleted from repos and provisioner
assertTrue(applicationRepository.delete(applicationId()));
assertNull(applicationRepository.getActiveSession(applicationId()));
- assertNull(sessionRepository.getLocalSession(sessionId));
- assertNull(sessionRepository.getLocalSession(sessionId));
+ assertNull(sessionRepository.getSession(sessionId));
+ assertNull(sessionRepository.getSession(sessionId));
assertTrue(provisioner.removed());
assertEquals(tenant.getName(), provisioner.lastApplicationId().tenant());
assertEquals(applicationId(), provisioner.lastApplicationId());
@@ -383,54 +382,48 @@ public class ApplicationRepositoryTest {
// No change to active session id
assertEquals(activeSessionId, tester.tenant().getApplicationRepo().requireActiveSessionOf(tester.applicationId()));
SessionRepository sessionRepository = tester.tenant().getSessionRepository();
- assertEquals(3, sessionRepository.getLocalSessions().size());
+ assertEquals(3, sessionRepository.getSessions().size());
clock.advance(Duration.ofHours(1)); // longer than session lifetime
- // All sessions except 3 should be removed after the call to deleteExpiredLocalSessions
- tester.applicationRepository().deleteExpiredLocalSessions();
- Collection<LocalSession> sessions = sessionRepository.getLocalSessions();
+ // All sessions except 3 should be removed after the call to deleteExpiredSessions
+ tester.applicationRepository().deleteExpiredSessions();
+ Collection<Session> sessions = sessionRepository.getSessions();
assertEquals(1, sessions.size());
- ArrayList<LocalSession> localSessions = new ArrayList<>(sessions);
- LocalSession localSession = localSessions.get(0);
+ ArrayList<Session> sessionList = new ArrayList<>(sessions);
+ Session localSession = sessionList.get(0);
assertEquals(3, localSession.getSessionId());
- // All sessions except 3 should be removed after the call to deleteExpiredRemoteSessions
- assertEquals(2, tester.applicationRepository().deleteExpiredRemoteSessions(clock, Duration.ofSeconds(0)));
- ArrayList<Long> remoteSessions = new ArrayList<>(sessionRepository.getRemoteSessionsFromZooKeeper());
- Session remoteSession = sessionRepository.getRemoteSession(remoteSessions.get(0));
- assertEquals(3, remoteSession.getSessionId());
-
// Deploy, but do not activate
Optional<com.yahoo.config.provision.Deployment> deployment4 = tester.redeployFromLocalActive();
assertTrue(deployment4.isPresent());
deployment4.get().prepare(); // session 5 (not activated)
- assertEquals(2, sessionRepository.getLocalSessions().size());
+ assertEquals(sessionRepository.getSessions().toString(), 2, sessionRepository.getSessions().size());
sessionRepository.deleteLocalSession(localSession);
- assertEquals(1, sessionRepository.getLocalSessions().size());
+ assertEquals(1, sessionRepository.getSessions().size());
- // Create a local session without any data in zookeeper (corner case seen in production occasionally)
- // and check that expiring local sessions still work
+ // Create a session without any data in zookeeper (corner case seen in production occasionally)
+ // and check that expiring sessions still works
int sessionId = 6;
Files.createDirectory(new TenantFileSystemDirs(serverdb, tenant1).getUserApplicationDir(sessionId).toPath());
- LocalSession localSession2 = new LocalSession(tenant1,
- sessionId,
- FilesApplicationPackage.fromFile(testApp),
- new SessionZooKeeperClient(curator,
- configCurator,
- tenant1,
- sessionId,
- ConfigUtils.getCanonicalHostName()));
- sessionRepository.addLocalSession(localSession2);
- assertEquals(2, sessionRepository.getLocalSessions().size());
-
- // Check that trying to expire local session when there exists a local session with no zookeeper data works
- tester.applicationRepository().deleteExpiredLocalSessions();
- assertEquals(1, sessionRepository.getLocalSessions().size());
+ Session localSession2 = new Session(tenant1,
+ sessionId,
+ new SessionZooKeeperClient(curator,
+ configCurator,
+ tenant1,
+ sessionId,
+ ConfigUtils.getCanonicalHostName()),
+ FilesApplicationPackage.fromFile(testApp));
+ sessionRepository.addSession(localSession2);
+ assertEquals(2, sessionRepository.getSessions().size());
+
+ // Check that trying to expire session when there exists a session with no zookeeper data works
+ tester.applicationRepository().deleteExpiredSessions();
+ assertEquals(1, sessionRepository.getSessions().size());
// Check that trying to expire when there are no active sessions works
- tester.applicationRepository().deleteExpiredLocalSessions();
+ tester.applicationRepository().deleteExpiredSessions();
}
@Test
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 015cc039a1c..352c199cb4c 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
@@ -33,11 +33,11 @@ public class RedeployTest {
assertTrue(deployment.isPresent());
long activeSessionIdBefore = tester.applicationRepository().getActiveSession(tester.applicationId()).getSessionId();
- assertEquals(tester.applicationId(), tester.tenant().getSessionRepository().getLocalSession(activeSessionIdBefore).getApplicationId());
+ assertEquals(tester.applicationId(), tester.tenant().getSessionRepository().getSession(activeSessionIdBefore).getApplicationId());
deployment.get().activate();
long activeSessionIdAfter = tester.applicationRepository().getActiveSession(tester.applicationId()).getSessionId();
assertEquals(activeSessionIdAfter, activeSessionIdBefore + 1);
- assertEquals(tester.applicationId(), tester.tenant().getSessionRepository().getLocalSession(activeSessionIdAfter).getApplicationId());
+ assertEquals(tester.applicationId(), tester.tenant().getSessionRepository().getSession(activeSessionIdAfter).getApplicationId());
}
/** No deployment is done because there is no local active session. */
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java
index 7276091fed0..e55a36af386 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java
@@ -1,7 +1,6 @@
// Copyright Verizon Media. 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.fasterxml.jackson.databind.ObjectMapper;
import com.yahoo.cloud.config.ConfigserverConfig;
import com.yahoo.component.Version;
import com.yahoo.config.model.api.ModelFactory;
@@ -18,7 +17,6 @@ import com.yahoo.vespa.config.server.MockLogRetriever;
import com.yahoo.vespa.config.server.MockProvisioner;
import com.yahoo.vespa.config.server.MockTesterClient;
import com.yahoo.vespa.config.server.TestComponentRegistry;
-import com.yahoo.vespa.config.server.application.ConfigConvergenceChecker;
import com.yahoo.vespa.config.server.application.HttpProxy;
import com.yahoo.vespa.config.server.application.OrchestratorMock;
import com.yahoo.vespa.config.server.deploy.DeployTester;
@@ -37,12 +35,10 @@ import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
-import javax.ws.rs.client.Client;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
-import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.List;
@@ -336,13 +332,13 @@ public class ApplicationHandlerTest {
Tenant tenant = applicationRepository.getTenant(applicationId);
long sessionId = tenant.getApplicationRepo().requireActiveSessionOf(applicationId);
deleteAndAssertResponse(applicationId, Zone.defaultZone(), Response.Status.OK, null, fullAppIdInUrl);
- assertNull(tenant.getSessionRepository().getLocalSession(sessionId));
+ assertNull(tenant.getSessionRepository().getSession(sessionId));
}
private void deleteAndAssertOKResponse(Tenant tenant, ApplicationId applicationId) throws IOException {
long sessionId = tenant.getApplicationRepo().requireActiveSessionOf(applicationId);
deleteAndAssertResponse(applicationId, Zone.defaultZone(), Response.Status.OK, null, true);
- assertNull(tenant.getSessionRepository().getLocalSession(sessionId));
+ assertNull(tenant.getSessionRepository().getSession(sessionId));
}
private void deleteAndAssertResponse(ApplicationId applicationId, Zone zone, int expectedStatus, HttpErrorResponse.errorCodes errorCode, boolean fullAppIdInUrl) throws IOException {
@@ -425,21 +421,6 @@ public class ApplicationHandlerTest {
return createApplicationHandler().handle(HttpRequest.createTestRequest(restartUrl, GET));
}
- private static class MockStateApiFactory implements ConfigConvergenceChecker.StateApiFactory {
- boolean createdApi = false;
- @Override
- public ConfigConvergenceChecker.StateApi createStateApi(Client client, URI serviceUri) {
- createdApi = true;
- return () -> {
- try {
- return new ObjectMapper().readTree("{\"config\":{\"generation\":1}}");
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- };
- }
- }
-
private ApplicationHandler createApplicationHandler() {
return createApplicationHandler(applicationRepository);
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionRepositoryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionRepositoryTest.java
index bfcfc7d6e43..adba5093b59 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionRepositoryTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionRepositoryTest.java
@@ -105,11 +105,11 @@ public class SessionRepositoryTest {
setup();
long firstSessionId = deploy();
long secondSessionId = deploy();
- assertNotNull(sessionRepository.getLocalSession(firstSessionId));
- assertNotNull(sessionRepository.getLocalSession(secondSessionId));
- assertNull(sessionRepository.getLocalSession(secondSessionId + 1));
+ assertNotNull(sessionRepository.getSession(firstSessionId));
+ assertNotNull(sessionRepository.getSession(secondSessionId));
+ assertNull(sessionRepository.getSession(secondSessionId + 1));
- ApplicationSet applicationSet = sessionRepository.ensureApplicationLoaded(sessionRepository.getRemoteSession(firstSessionId));
+ ApplicationSet applicationSet = sessionRepository.ensureApplicationLoaded(sessionRepository.getSession(firstSessionId));
assertNotNull(applicationSet);
assertEquals(2, applicationSet.getApplicationGeneration());
assertEquals(applicationId.application(), applicationSet.getForVersionOrLatest(Optional.empty(), Instant.now()).getId().application());
@@ -117,8 +117,8 @@ public class SessionRepositoryTest {
sessionRepository.close();
// All created sessions are deleted
- assertNull(sessionRepository.getLocalSession(firstSessionId));
- assertNull(sessionRepository.getLocalSession(secondSessionId));
+ assertNull(sessionRepository.getSession(firstSessionId));
+ assertNull(sessionRepository.getSession(secondSessionId));
}
@Test
@@ -128,16 +128,16 @@ public class SessionRepositoryTest {
long firstSessionId = deploy();
long secondSessionId = deploy();
- assertNotNull(sessionRepository.getLocalSession(firstSessionId));
- assertNotNull(sessionRepository.getLocalSession(secondSessionId));
- assertNull(sessionRepository.getLocalSession(secondSessionId + 1));
+ assertNotNull(sessionRepository.getSession(firstSessionId));
+ assertNotNull(sessionRepository.getSession(secondSessionId));
+ assertNull(sessionRepository.getSession(secondSessionId + 1));
// tenant is "newTenant"
TenantName newTenant = TenantName.from("newTenant");
tenantRepository.addTenant(newTenant);
long sessionId = deploy(ApplicationId.from(newTenant.value(), "testapp", "default"));
SessionRepository sessionRepository2 = tenantRepository.getTenant(newTenant).getSessionRepository();
- assertNotNull(sessionRepository2.getLocalSession(sessionId));
+ assertNotNull(sessionRepository2.getSession(sessionId));
}
@Test
@@ -158,9 +158,9 @@ public class SessionRepositoryTest {
assertStatusChange(sessionId, Session.Status.PREPARE);
assertStatusChange(sessionId, Session.Status.ACTIVATE);
- sessionRepository.delete(sessionRepository.getRemoteSession(sessionId));
+ sessionRepository.delete(sessionRepository.getSession(sessionId));
assertSessionRemoved(sessionId);
- assertNull(sessionRepository.getRemoteSession(sessionId));
+ assertNull(sessionRepository.getSession(sessionId));
}
// If reading a session throws an exception it should be handled and not prevent other applications
@@ -277,8 +277,8 @@ public class SessionRepositoryTest {
}
private void assertSessionRemoved(long sessionId) {
- waitFor(p -> sessionRepository.getRemoteSession(sessionId) == null, sessionId);
- assertNull(sessionRepository.getRemoteSession(sessionId));
+ waitFor(p -> sessionRepository.getSession(sessionId) == null, sessionId);
+ assertNull(sessionRepository.getSession(sessionId));
}
private void assertRemoteSessionExists(long sessionId) {
@@ -286,10 +286,10 @@ public class SessionRepositoryTest {
}
private void assertRemoteSessionStatus(long sessionId, Session.Status status) {
- waitFor(p -> sessionRepository.getRemoteSession(sessionId) != null &&
- sessionRepository.getRemoteSession(sessionId).getStatus() == status, sessionId);
- assertNotNull(sessionRepository.getRemoteSession(sessionId));
- assertThat(sessionRepository.getRemoteSession(sessionId).getStatus(), is(status));
+ waitFor(p -> sessionRepository.getSession(sessionId) != null &&
+ sessionRepository.getSession(sessionId).getStatus() == status, sessionId);
+ assertNotNull(sessionRepository.getSession(sessionId));
+ assertThat(sessionRepository.getSession(sessionId).getStatus(), is(status));
}
private void waitFor(LongPredicate predicate, long sessionId) {