diff options
author | Harald Musum <musum@verizonmedia.com> | 2020-07-06 17:53:10 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-06 17:53:10 +0200 |
commit | 24ad16a6dc83df7f228a1ea81bb4e725f3f188ce (patch) | |
tree | a264b4f67fd8888f72412545c00d24e090675387 | |
parent | 5428d23c28f862e78cfe9e2786d3d40dcece4f57 (diff) | |
parent | 9ab8e7cf441a132512a1bb4e4011e30b3ac0e008 (diff) |
Merge pull request #13811 from vespa-engine/hmusum/take-session-lock-in-more-places
Take session lock in more places
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); + }); + } } } |