diff options
author | HÃ¥kon Hallingstad <hakon@verizonmedia.com> | 2021-03-09 14:54:36 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-09 14:54:36 +0100 |
commit | 1ce85daf1b01dd8d528c684e084e1d68b45bbf97 (patch) | |
tree | d24f57419b6c84aa004f7289e911671d7106598b | |
parent | ff5ccd6e39ab72b581b083e8430095e38ec2b96d (diff) | |
parent | 7ead844949e39410b580d0cf7ed3c72aafb7d0fa (diff) |
Merge pull request #16860 from vespa-engine/hmusum/copy-list-before-iterating-2
Copy session list before iterating
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java | 3 | ||||
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java | 17 |
2 files changed, 11 insertions, 9 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 9f101d44269..b46231d7070 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 @@ -868,8 +868,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye public void deleteExpiredLocalSessions() { Map<Tenant, Collection<LocalSession>> sessionsPerTenant = new HashMap<>(); tenantRepository.getAllTenants() - .forEach(tenant -> sessionsPerTenant.put(tenant, - List.copyOf(tenant.getSessionRepository().getLocalSessions()))); + .forEach(tenant -> sessionsPerTenant.put(tenant, tenant.getSessionRepository().getLocalSessions())); Set<ApplicationId> applicationIds = new HashSet<>(); sessionsPerTenant.values() 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 61defa6de90..5400b898de3 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 @@ -196,8 +196,9 @@ public class SessionRepository { return localSessionCache.get(sessionId); } + /** Returns a copy of local sessions */ public Collection<LocalSession> getLocalSessions() { - return localSessionCache.values(); + return List.copyOf(localSessionCache.values()); } private void loadLocalSessions(ExecutorService executor) { @@ -300,8 +301,7 @@ public class SessionRepository { } private void deleteAllSessions() { - List<LocalSession> sessions = new ArrayList<>(localSessionCache.values()); - for (LocalSession session : sessions) { + for (LocalSession session : getLocalSessions()) { deleteLocalSession(session); } } @@ -312,6 +312,11 @@ public class SessionRepository { return remoteSessionCache.get(sessionId); } + /** Returns a copy of remote sessions */ + public Collection<RemoteSession> getRemoteSessions() { + return List.copyOf(remoteSessionCache.values()); + } + public List<Long> getRemoteSessionsFromZooKeeper() { return getSessionList(curator.getChildren(sessionsPath)); } @@ -527,9 +532,7 @@ public class SessionRepository { private void nodeChanged() { zkWatcherExecutor.execute(() -> { Multiset<Session.Status> sessionMetrics = HashMultiset.create(); - for (Session session : remoteSessionCache.values()) { - sessionMetrics.add(session.getStatus()); - } + getRemoteSessions().forEach(session -> sessionMetrics.add(session.getStatus())); metricUpdater.setNewSessions(sessionMetrics.count(Session.Status.NEW)); metricUpdater.setPreparedSessions(sessionMetrics.count(Session.Status.PREPARE)); metricUpdater.setActivatedSessions(sessionMetrics.count(Session.Status.ACTIVATE)); @@ -559,7 +562,7 @@ public class SessionRepository { log.log(Level.FINE, () -> "Purging old sessions for tenant '" + tenantName + "'"); Set<LocalSession> toDelete = new HashSet<>(); try { - for (LocalSession candidate : List.copyOf(localSessionCache.values())) { + for (LocalSession candidate : getLocalSessions()) { Instant createTime = candidate.getCreateTime(); log.log(Level.FINE, () -> "Candidate session for deletion: " + candidate.getSessionId() + ", created: " + createTime); |