summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2020-09-15 12:43:11 +0200
committerHarald Musum <musum@verizonmedia.com>2020-09-15 12:43:11 +0200
commit983062ba3cd1e12593485a10b41ad22aa8364987 (patch)
tree90b5d16b26b07932a8faffdc6412a0f19f6f6aa7 /configserver
parentf500f24745747137bad942c0c8c40db56be6c49e (diff)
Use maps instead of SessionCache instances
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionCache.java34
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java38
3 files changed, 21 insertions, 53 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 fb07bf626f3..824d6701233 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
@@ -819,7 +819,7 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
}
public void deleteExpiredLocalSessions() {
- Map<Tenant, List<LocalSession>> sessionsPerTenant = new HashMap<>();
+ Map<Tenant, Collection<LocalSession>> sessionsPerTenant = new HashMap<>();
tenantRepository.getAllTenants().forEach(tenant -> sessionsPerTenant.put(tenant, tenant.getSessionRepository().getLocalSessions()));
Set<ApplicationId> applicationIds = new HashSet<>();
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionCache.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionCache.java
deleted file mode 100644
index 60fa037e99a..00000000000
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionCache.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright Verizon Media. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.config.server.session;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * A session cache that can store any type of {@link Session}.
- *
- * @author Ulf Lilleengen
- * @author hmusum
- */
-public class SessionCache<SESSIONTYPE extends Session> {
-
- private final HashMap<Long, SESSIONTYPE> sessions = new HashMap<>();
-
- public synchronized void putSession(SESSIONTYPE session) {
- sessions.put(session.getSessionId(), session);
- }
-
- synchronized void removeSession(long id) {
- sessions.remove(id);
- }
-
- public synchronized SESSIONTYPE getSession(long id) {
- return sessions.get(id);
- }
-
- public synchronized List<SESSIONTYPE> getSessions() {
- return new ArrayList<>(sessions.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 a5285a42e0a..3c18a51f22c 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
@@ -46,11 +46,13 @@ import java.time.Clock;
import java.time.Duration;
import java.time.Instant;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -71,8 +73,8 @@ public class SessionRepository {
private static final FilenameFilter sessionApplicationsFilter = (dir, name) -> name.matches("\\d+");
private static final long nonExistingActiveSessionId = 0;
- private final SessionCache<LocalSession> localSessionCache = new SessionCache<>();
- private final SessionCache<RemoteSession> remoteSessionCache = new SessionCache<>();
+ private final Map<Long, LocalSession> localSessionCache = new ConcurrentHashMap<>();
+ private final Map<Long, RemoteSession> remoteSessionCache = new ConcurrentHashMap<>();
private final Map<Long, SessionStateWatcher> sessionStateWatchers = new HashMap<>();
private final Duration sessionLifetime;
private final Clock clock;
@@ -121,18 +123,18 @@ public class SessionRepository {
// ---------------- Local sessions ----------------------------------------------------------------
public synchronized void addLocalSession(LocalSession session) {
- localSessionCache.putSession(session);
+ localSessionCache.put(session.getSessionId(), session);
long sessionId = session.getSessionId();
RemoteSession remoteSession = createRemoteSession(sessionId);
addSessionStateWatcher(sessionId, remoteSession);
}
public LocalSession getLocalSession(long sessionId) {
- return localSessionCache.getSession(sessionId);
+ return localSessionCache.get(sessionId);
}
- public List<LocalSession> getLocalSessions() {
- return localSessionCache.getSessions();
+ public Collection<LocalSession> getLocalSessions() {
+ return localSessionCache.values();
}
private void loadLocalSessions() {
@@ -173,7 +175,7 @@ public class SessionRepository {
public void deleteExpiredSessions(Map<ApplicationId, Long> activeSessions) {
log.log(Level.FINE, () -> "Purging old sessions for tenant '" + tenantName + "'");
try {
- for (LocalSession candidate : localSessionCache.getSessions()) {
+ for (LocalSession candidate : localSessionCache.values()) {
Instant createTime = candidate.getCreateTime();
log.log(Level.FINE, () -> "Candidate session for deletion: " + candidate.getSessionId() + ", created: " + createTime);
@@ -214,7 +216,7 @@ public class SessionRepository {
log.log(Level.FINE, () -> "Deleting local session " + sessionId);
SessionStateWatcher watcher = sessionStateWatchers.remove(sessionId);
if (watcher != null) watcher.close();
- localSessionCache.removeSession(sessionId);
+ localSessionCache.remove(sessionId);
deletePersistentData(sessionId);
}
}
@@ -247,7 +249,7 @@ public class SessionRepository {
}
private void deleteAllSessions() {
- List<LocalSession> sessions = new ArrayList<>(localSessionCache.getSessions());
+ List<LocalSession> sessions = new ArrayList<>(localSessionCache.values());
for (LocalSession session : sessions) {
deleteLocalSession(session);
}
@@ -256,7 +258,7 @@ public class SessionRepository {
// ---------------- Remote sessions ----------------------------------------------------------------
public RemoteSession getRemoteSession(long sessionId) {
- return remoteSessionCache.getSession(sessionId);
+ return remoteSessionCache.get(sessionId);
}
public List<Long> getRemoteSessions() {
@@ -264,15 +266,15 @@ public class SessionRepository {
}
public void addRemoteSession(RemoteSession session) {
- remoteSessionCache.putSession(session);
+ remoteSessionCache.put(session.getSessionId(), session);
metrics.incAddedSessions();
}
public int deleteExpiredRemoteSessions(Clock clock, Duration expiryTime) {
int deleted = 0;
for (long sessionId : getRemoteSessions()) {
- RemoteSession session = remoteSessionCache.getSession(sessionId);
- if (session == null) continue; // Internal sessions not in synch with zk, continue
+ RemoteSession session = remoteSessionCache.get(sessionId);
+ if (session == null) continue; // Internal sessions not in sync with zk, continue
if (session.getStatus() == Session.Status.ACTIVATE) continue;
if (sessionHasExpired(session.getCreateTime(), expiryTime, clock)) {
log.log(Level.FINE, () -> "Remote session " + sessionId + " for " + tenantName + " has expired, deleting it");
@@ -325,14 +327,14 @@ public class SessionRepository {
}
private void checkForRemovedSessions(List<Long> sessions) {
- for (RemoteSession session : remoteSessionCache.getSessions())
+ for (RemoteSession session : remoteSessionCache.values())
if ( ! sessions.contains(session.getSessionId()))
sessionRemoved(session.getSessionId());
}
private void checkForAddedSessions(List<Long> sessions) {
for (Long sessionId : sessions)
- if (remoteSessionCache.getSession(sessionId) == null)
+ if (remoteSessionCache.get(sessionId) == null)
sessionAdded(sessionId);
}
@@ -392,7 +394,7 @@ public class SessionRepository {
private void sessionRemoved(long sessionId) {
SessionStateWatcher watcher = sessionStateWatchers.remove(sessionId);
if (watcher != null) watcher.close();
- remoteSessionCache.removeSession(sessionId);
+ remoteSessionCache.remove(sessionId);
metrics.incRemovedSessions();
}
@@ -410,7 +412,7 @@ public class SessionRepository {
private void nodeChanged() {
zkWatcherExecutor.execute(() -> {
Multiset<Session.Status> sessionMetrics = HashMultiset.create();
- for (RemoteSession session : remoteSessionCache.getSessions()) {
+ for (RemoteSession session : remoteSessionCache.values()) {
sessionMetrics.add(session.getStatus());
}
metrics.setNewSessions(sessionMetrics.count(Session.Status.NEW));
@@ -439,7 +441,7 @@ public class SessionRepository {
private void synchronizeOnNew(List<Long> sessionList) {
for (long sessionId : sessionList) {
- RemoteSession session = remoteSessionCache.getSession(sessionId);
+ RemoteSession session = remoteSessionCache.get(sessionId);
if (session == null) continue; // session might have been deleted after getting session list
log.log(Level.FINE, () -> session.logPre() + "Confirming upload for session " + sessionId);
session.confirmUpload();