summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2020-06-18 13:19:27 +0200
committerHarald Musum <musum@verizonmedia.com>2020-06-18 13:19:27 +0200
commit5f5df5235de6f7c2532c19833e64adc113ffe1ed (patch)
treeafa4015f7d34ef4979a0902a6b11edaae05c6e48 /configserver
parent47c6ca64b5e49845704b96ffd676320e3433079b (diff)
Merge watcher classes for sessions into one class
Diffstat (limited to 'configserver')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java6
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java2
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java23
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java (renamed from configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionStateWatcher.java)50
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/SilentDeployLogger.java2
5 files changed, 51 insertions, 32 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java
index 319520cef74..651572b3e36 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java
@@ -63,10 +63,10 @@ public class Deployment implements com.yahoo.config.provision.Deployment {
/** The (optional) Athenz domain this application should use */
private final Optional<AthenzDomain> athenzDomain;
- private boolean prepared = false;
-
/** Whether this model should be validated (only takes effect if prepared=false) */
- private boolean validate;
+ private final boolean validate;
+
+ private boolean prepared = false;
private boolean ignoreSessionStaleFailure = false;
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java
index 1e832548342..77058d8d6d9 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java
@@ -20,6 +20,7 @@ import java.util.Optional;
* system ({@link LocalSession}s) and sessions working on zookeeper {@link RemoteSession}s.
*
* @author Ulf Lilleengen
+ * @author hmusum
*/
public abstract class Session implements Comparable<Session> {
@@ -32,6 +33,7 @@ public abstract class Session implements Comparable<Session> {
this.sessionId = sessionId;
this.sessionZooKeeperClient = sessionZooKeeperClient;
}
+
/**
* Retrieve the session id for this session.
* @return the session id.
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 c3db5d737df..392c5e93122 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
@@ -72,8 +72,7 @@ public class SessionRepository {
private final SessionCache<LocalSession> localSessionCache = new SessionCache<>();
private final SessionCache<RemoteSession> remoteSessionCache = new SessionCache<>();
- private final Map<Long, LocalSessionStateWatcher> localSessionStateWatchers = new HashMap<>();
- private final Map<Long, RemoteSessionStateWatcher> remoteSessionStateWatchers = new HashMap<>();
+ private final Map<Long, SessionStateWatcher> sessionStateWatchers = new HashMap<>();
private final Duration sessionLifetime;
private final Clock clock;
private final Curator curator;
@@ -122,7 +121,9 @@ public class SessionRepository {
localSessionCache.addSession(session);
long sessionId = session.getSessionId();
Curator.FileCache fileCache = curator.createFileCache(getSessionStatePath(sessionId).getAbsolute(), false);
- localSessionStateWatchers.put(sessionId, new LocalSessionStateWatcher(fileCache, session, this, zkWatcherExecutor));
+ RemoteSession remoteSession = new RemoteSession(tenantName, sessionId, componentRegistry, createSessionZooKeeperClient(sessionId));
+ sessionStateWatchers.put(sessionId, new SessionStateWatcher(fileCache, reloadHandler, remoteSession,
+ Optional.of(session), metrics, zkWatcherExecutor, this));
}
public LocalSession getLocalSession(long sessionId) {
@@ -207,7 +208,7 @@ public class SessionRepository {
public void deleteLocalSession(LocalSession session) {
long sessionId = session.getSessionId();
log.log(Level.FINE, "Deleting local session " + sessionId);
- LocalSessionStateWatcher watcher = localSessionStateWatchers.remove(sessionId);
+ SessionStateWatcher watcher = sessionStateWatchers.remove(sessionId);
if (watcher != null) watcher.close();
localSessionCache.removeSession(sessionId);
NestedTransaction transaction = new NestedTransaction();
@@ -317,20 +318,22 @@ public class SessionRepository {
*/
public void sessionAdded(long sessionId) {
log.log(Level.FINE, () -> "Adding session to SessionRepository: " + sessionId);
- RemoteSession session = createRemoteSession(sessionId);
+ RemoteSession remoteSession = createRemoteSession(sessionId);
Curator.FileCache fileCache = curator.createFileCache(getSessionStatePath(sessionId).getAbsolute(), false);
fileCache.addListener(this::nodeChanged);
- loadSessionIfActive(session);
- addRemoteSession(session);
- remoteSessionStateWatchers.put(sessionId, new RemoteSessionStateWatcher(fileCache, reloadHandler, session, metrics, zkWatcherExecutor));
+ loadSessionIfActive(remoteSession);
+ addRemoteSession(remoteSession);
+ Optional<LocalSession> localSession = Optional.empty();
if (distributeApplicationPackage.value()) {
- Optional<LocalSession> localSession = createLocalSessionUsingDistributedApplicationPackage(sessionId);
+ localSession = createLocalSessionUsingDistributedApplicationPackage(sessionId);
localSession.ifPresent(this::addSession);
}
+ sessionStateWatchers.put(sessionId, new SessionStateWatcher(fileCache, reloadHandler, remoteSession, localSession,
+ metrics, zkWatcherExecutor, this));
}
private void sessionRemoved(long sessionId) {
- RemoteSessionStateWatcher watcher = remoteSessionStateWatchers.remove(sessionId);
+ SessionStateWatcher watcher = sessionStateWatchers.remove(sessionId);
if (watcher != null) watcher.close();
remoteSessionCache.removeSession(sessionId);
metrics.incRemovedSessions();
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionStateWatcher.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java
index 93e6c83fe5b..dee11bcd332 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/RemoteSessionStateWatcher.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. 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.Optional;
import java.util.logging.Level;
import com.yahoo.text.Utf8;
import com.yahoo.vespa.config.server.ReloadHandler;
@@ -16,49 +17,62 @@ import java.util.logging.Logger;
* The session must be in the session repo.
*
* @author Vegard Havdal
+ * @author hmusum
*/
-public class RemoteSessionStateWatcher {
+public class SessionStateWatcher {
- private static final Logger log = Logger.getLogger(RemoteSessionStateWatcher.class.getName());
+ private static final Logger log = Logger.getLogger(SessionStateWatcher.class.getName());
private final Curator.FileCache fileCache;
private final ReloadHandler reloadHandler;
- private final RemoteSession session;
+ private final RemoteSession remoteSession;
+ private final Optional<LocalSession> localSession;
private final MetricUpdater metrics;
private final Executor zkWatcherExecutor;
+ private final SessionRepository sessionRepository;
- RemoteSessionStateWatcher(Curator.FileCache fileCache,
- ReloadHandler reloadHandler,
- RemoteSession session,
- MetricUpdater metrics,
- Executor zkWatcherExecutor) {
+ SessionStateWatcher(Curator.FileCache fileCache,
+ ReloadHandler reloadHandler,
+ RemoteSession remoteSession,
+ Optional<LocalSession> localSession,
+ MetricUpdater metrics,
+ Executor zkWatcherExecutor,
+ SessionRepository sessionRepository) {
this.fileCache = fileCache;
this.reloadHandler = reloadHandler;
- this.session = session;
+ this.remoteSession = remoteSession;
+ this.localSession = localSession;
this.metrics = metrics;
this.fileCache.start();
this.fileCache.addListener(this::nodeChanged);
this.zkWatcherExecutor = zkWatcherExecutor;
+ this.sessionRepository = sessionRepository;
}
private void sessionChanged(Session.Status status) {
- log.log(Level.FINE, session.logPre() + "Session change: Remote session " + session.getSessionId() + " changed status to " + status);
+ long sessionId = remoteSession.getSessionId();
+ log.log(Level.FINE, remoteSession.logPre() + "Session change: Session " + remoteSession.getSessionId() + " changed status to " + status);
// valid for NEW -> PREPARE transitions, not ACTIVATE -> PREPARE.
if (status.equals(Session.Status.PREPARE)) {
- log.log(Level.FINE, session.logPre() + "Loading prepared session: " + session.getSessionId());
- session.loadPrepared();
+ log.log(Level.FINE, remoteSession.logPre() + "Loading prepared session: " + remoteSession.getSessionId());
+ remoteSession.loadPrepared();
} else if (status.equals(Session.Status.ACTIVATE)) {
- session.makeActive(reloadHandler);
+ remoteSession.makeActive(reloadHandler);
} else if (status.equals(Session.Status.DEACTIVATE)) {
- session.deactivate();
+ remoteSession.deactivate();
} else if (status.equals(Session.Status.DELETE)) {
- session.deactivate();
+ remoteSession.deactivate();
+ log.log(Level.INFO, remoteSession.logPre() + "Session change: Local session " + sessionId + " changed status to " + status);
+ localSession.ifPresent(localSession1 -> {
+ log.log(Level.FINE, remoteSession.logPre() + "Deleting session " + sessionId);
+ sessionRepository.deleteLocalSession(localSession.get());
+ });
}
}
public long getSessionId() {
- return session.getSessionId();
+ return remoteSession.getSessionId();
}
public void close() {
@@ -71,7 +85,7 @@ public class RemoteSessionStateWatcher {
private void nodeChanged() {
zkWatcherExecutor.execute(() -> {
- Session.Status currentStatus = session.getStatus();
+ Session.Status currentStatus = remoteSession.getStatus();
Session.Status newStatus = Session.Status.NONE;
try {
ChildData node = fileCache.getCurrentData();
@@ -80,7 +94,7 @@ public class RemoteSessionStateWatcher {
sessionChanged(newStatus);
}
} catch (Exception e) {
- log.log(Level.WARNING, session.logPre() + "Error handling session change from " + currentStatus.name() +
+ log.log(Level.WARNING, remoteSession.logPre() + "Error handling session change from " + currentStatus.name() +
" to " + newStatus.name() + " for session " + getSessionId(), e);
metrics.incSessionChangeErrors();
}
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SilentDeployLogger.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SilentDeployLogger.java
index 92ab6b3fbf5..445837104d4 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SilentDeployLogger.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SilentDeployLogger.java
@@ -7,7 +7,7 @@ import java.util.logging.Logger;
import com.yahoo.config.application.api.DeployLogger;
/**
- * The purpose of this is to mute the log messages from model and application building in {@link RemoteSession} that is triggered by {@link RemoteSessionStateWatcher}, since those messages already
+ * The purpose of this is to mute the log messages from model and application building in {@link RemoteSession} that is triggered by {@link SessionStateWatcher}, since those messages already
* have been emitted by the prepare handler, for the same prepare operation.
*
* @author vegardh