diff options
author | Harald Musum <musum@verizonmedia.com> | 2020-06-18 13:19:27 +0200 |
---|---|---|
committer | Harald Musum <musum@verizonmedia.com> | 2020-06-18 13:19:27 +0200 |
commit | 5f5df5235de6f7c2532c19833e64adc113ffe1ed (patch) | |
tree | afa4015f7d34ef4979a0902a6b11edaae05c6e48 /configserver | |
parent | 47c6ca64b5e49845704b96ffd676320e3433079b (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.java | 6 | ||||
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/config/server/session/Session.java | 2 | ||||
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionRepository.java | 23 | ||||
-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.java | 2 |
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 |