summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHÃ¥kon Hallingstad <hakon@verizonmedia.com>2021-03-09 14:54:36 +0100
committerGitHub <noreply@github.com>2021-03-09 14:54:36 +0100
commit1ce85daf1b01dd8d528c684e084e1d68b45bbf97 (patch)
treed24f57419b6c84aa004f7289e911671d7106598b
parentff5ccd6e39ab72b581b083e8430095e38ec2b96d (diff)
parent7ead844949e39410b580d0cf7ed3c72aafb7d0fa (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.java3
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java17
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);