diff options
author | Harald Musum <musum@verizonmedia.com> | 2022-06-21 13:07:46 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-06-21 13:07:46 +0200 |
commit | 0e0c9b8ec58241cb78fccf02c091119a8553a424 (patch) | |
tree | 78f008bd19274a4e235728379d975497b9c78c39 /configserver | |
parent | 0afaefcdd7eba6e8389a2d8a6d5e453595844bb5 (diff) | |
parent | 030c8c464801d0706bb7004312ed3f54f6a144a1 (diff) |
Merge pull request #23177 from vespa-engine/hmusum/synchronize-access
Synchronize access to sessionStateWatchers map [run-systemtest]
Diffstat (limited to 'configserver')
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java | 26 |
1 files changed, 17 insertions, 9 deletions
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 059d192e7d2..9b8abbf4cf6 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 @@ -315,7 +315,7 @@ public class SessionRepository { public void deleteLocalSession(LocalSession session) { long sessionId = session.getSessionId(); log.log(Level.FINE, () -> "Deleting local session " + sessionId); - SessionStateWatcher watcher = sessionStateWatchers.remove(sessionId); + SessionStateWatcher watcher = removeSessionStateWatcher(sessionId); if (watcher != null) watcher.close(); localSessionCache.remove(sessionId); NestedTransaction transaction = new NestedTransaction(); @@ -323,6 +323,12 @@ public class SessionRepository { transaction.commit(); } + private SessionStateWatcher removeSessionStateWatcher(long sessionId) { + synchronized (sessionStateWatchers) { + return sessionStateWatchers.remove(sessionId); + } + } + private void deleteAllSessions() { for (LocalSession session : getLocalSessions()) { deleteLocalSession(session); @@ -886,13 +892,15 @@ public class SessionRepository { } private void updateSessionStateWatcher(long sessionId, RemoteSession remoteSession) { - 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, metricUpdater, zkWatcherExecutor, this)); - } else { - sessionStateWatcher.updateRemoteSession(remoteSession); + synchronized (sessionStateWatchers) { + 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, metricUpdater, zkWatcherExecutor, this)); + } else { + sessionStateWatcher.updateRemoteSession(remoteSession); + } } } @@ -928,7 +936,7 @@ public class SessionRepository { long sessionId = it.next().sessionId; if (existingSessions.contains(sessionId)) continue; - SessionStateWatcher watcher = sessionStateWatchers.remove(sessionId); + SessionStateWatcher watcher = removeSessionStateWatcher(sessionId); if (watcher != null) watcher.close(); it.remove(); metricUpdater.incRemovedSessions(); |