summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2020-07-06 17:53:10 +0200
committerGitHub <noreply@github.com>2020-07-06 17:53:10 +0200
commit24ad16a6dc83df7f228a1ea81bb4e725f3f188ce (patch)
treea264b4f67fd8888f72412545c00d24e090675387
parent5428d23c28f862e78cfe9e2786d3d40dcece4f57 (diff)
parent9ab8e7cf441a132512a1bb4e4011e30b3ac0e008 (diff)
Merge pull request #13811 from vespa-engine/hmusum/take-session-lock-in-more-places
Take session lock in more places
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/maintenance/ApplicationPackageMaintainer.java6
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java24
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java33
3 files changed, 34 insertions, 29 deletions
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 b0ca6ba67f5..81b1e9802ce 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
@@ -82,8 +82,10 @@ public class ApplicationPackageMaintainer extends ConfigServerMaintainer {
private void createLocalSessionIfMissing(ApplicationId applicationId, long sessionId) {
Tenant tenant = applicationRepository.tenantRepository().getTenant(applicationId.tenant());
SessionRepository sessionRepository = tenant.getSessionRepository();
- if (sessionRepository.getLocalSession(sessionId) == null)
- sessionRepository.createLocalSessionUsingDistributedApplicationPackage(sessionId);
+ try (var lock = sessionRepository.lock(sessionId)) {
+ if (sessionRepository.getLocalSession(sessionId) == null)
+ sessionRepository.createLocalSessionUsingDistributedApplicationPackage(sessionId);
+ }
}
private boolean missingOnDisk(FileReference applicationPackageReference) {
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 8a7be7ef176..1e861ff8d33 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
@@ -142,7 +142,7 @@ public class SessionRepository {
try {
addLocalSession(createSessionFromId(Long.parseLong(session.getName())));
} catch (IllegalArgumentException e) {
- log.log(Level.WARNING, "Could not load session '" +
+ log.log(Level.WARNING, "Could not load local session '" +
session.getAbsolutePath() + "':" + e.getMessage() + ", skipping it.");
}
}
@@ -318,16 +318,18 @@ public class SessionRepository {
* @param sessionId session id for the new session
*/
public void sessionAdded(long sessionId) {
- log.log(Level.FINE, () -> "Adding remote session to SessionRepository: " + sessionId);
- RemoteSession remoteSession = createRemoteSession(sessionId);
- Curator.FileCache fileCache = curator.createFileCache(getSessionStatePath(sessionId).getAbsolute(), false);
- fileCache.addListener(this::nodeChanged);
- loadSessionIfActive(remoteSession);
- addRemoteSession(remoteSession);
- Optional<LocalSession> localSession = Optional.empty();
- if (distributeApplicationPackage())
- localSession = createLocalSessionUsingDistributedApplicationPackage(sessionId);
- addSesssionStateWatcher(sessionId, fileCache, remoteSession, localSession);
+ try (var lock = lock(sessionId)) {
+ log.log(Level.FINE, () -> "Adding remote session to SessionRepository: " + sessionId);
+ RemoteSession remoteSession = createRemoteSession(sessionId);
+ Curator.FileCache fileCache = curator.createFileCache(getSessionStatePath(sessionId).getAbsolute(), false);
+ fileCache.addListener(this::nodeChanged);
+ loadSessionIfActive(remoteSession);
+ addRemoteSession(remoteSession);
+ Optional<LocalSession> localSession = Optional.empty();
+ if (distributeApplicationPackage())
+ localSession = createLocalSessionUsingDistributedApplicationPackage(sessionId);
+ addSesssionStateWatcher(sessionId, fileCache, remoteSession, localSession);
+ }
}
boolean distributeApplicationPackage() {
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 65c62a392b7..5d918079514 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
@@ -53,22 +53,23 @@ public class SessionStateWatcher {
private void sessionStatusChanged(Status newStatus) {
long sessionId = remoteSession.getSessionId();
-
- if (newStatus.equals(Status.PREPARE)) {
- createLocalSession(sessionId);
- log.log(Level.FINE, remoteSession.logPre() + "Loading prepared session: " + sessionId);
- remoteSession.loadPrepared();
- } else if (newStatus.equals(Status.ACTIVATE)) {
- createLocalSession(sessionId);
- remoteSession.makeActive(tenantApplications);
- } else if (newStatus.equals(Status.DEACTIVATE)) {
- remoteSession.deactivate();
- } else if (newStatus.equals(Status.DELETE)) {
- remoteSession.deactivate();
- localSession.ifPresent(session -> {
- log.log(Level.FINE, session.logPre() + "Deleting session " + sessionId);
- sessionRepository.deleteLocalSession(session);
- });
+ try (var lock = sessionRepository.lock(sessionId)) {
+ if (newStatus.equals(Status.PREPARE)) {
+ createLocalSession(sessionId);
+ log.log(Level.FINE, remoteSession.logPre() + "Loading prepared session: " + sessionId);
+ remoteSession.loadPrepared();
+ } else if (newStatus.equals(Status.ACTIVATE)) {
+ createLocalSession(sessionId);
+ remoteSession.makeActive(tenantApplications);
+ } else if (newStatus.equals(Status.DEACTIVATE)) {
+ remoteSession.deactivate();
+ } else if (newStatus.equals(Status.DELETE)) {
+ remoteSession.deactivate();
+ localSession.ifPresent(session -> {
+ log.log(Level.FINE, session.logPre() + "Deleting session " + sessionId);
+ sessionRepository.deleteLocalSession(session);
+ });
+ }
}
}