diff options
author | Harald Musum <musum@verizonmedia.com> | 2020-07-01 11:33:06 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-01 11:33:06 +0200 |
commit | b4abecef92c802ee6f779dc77d4328cc6fbf22cb (patch) | |
tree | e32cbe070e788967672b7ed9e2a938ff46a76aad | |
parent | 56a3e1d3d11f6ab4762c1141781472b55ebff157 (diff) | |
parent | 1f6cbbce449ca379c80cf0561de157938ec6d881 (diff) |
Merge pull request #13760 from vespa-engine/hmusum/create-local-session-on-all-state-changes
Try to create local session when session state changes
2 files changed, 24 insertions, 16 deletions
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 b039aeda318..bfdcc0e9c75 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 @@ -329,7 +329,7 @@ public class SessionRepository { addSesssionStateWatcher(sessionId, fileCache, remoteSession, localSession); } - private boolean distributeApplicationPackage() { + boolean distributeApplicationPackage() { return distributeApplicationPackage.value(); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java index e3f4854105a..1cbab9be1a8 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/SessionStateWatcher.java @@ -1,17 +1,19 @@ // 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.Optional; -import java.util.logging.Level; import com.yahoo.text.Utf8; import com.yahoo.vespa.config.server.ReloadHandler; import com.yahoo.vespa.config.server.monitoring.MetricUpdater; import com.yahoo.vespa.curator.Curator; import org.apache.curator.framework.recipes.cache.ChildData; +import java.util.Optional; import java.util.concurrent.Executor; +import java.util.logging.Level; import java.util.logging.Logger; +import static com.yahoo.vespa.config.server.session.Session.Status; + /** * Watches one particular session (/config/v2/tenants/<tenantName>/sessions/<n>/sessionState in ZooKeeper) * The session must be in the session repo. @@ -49,18 +51,19 @@ public class SessionStateWatcher { this.sessionRepository = sessionRepository; } - private void sessionStatusChanged(Session.Status newStatus) { + private void sessionStatusChanged(Status newStatus) { long sessionId = remoteSession.getSessionId(); - log.log(Level.FINE, remoteSession.logPre() + "Session change: Session " + remoteSession.getSessionId() + " changed status to " + newStatus); - if (newStatus.equals(Session.Status.PREPARE)) { + if (newStatus.equals(Status.PREPARE)) { + createLocalSession(sessionId); log.log(Level.FINE, remoteSession.logPre() + "Loading prepared session: " + sessionId); remoteSession.loadPrepared(); - } else if (newStatus.equals(Session.Status.ACTIVATE)) { + } else if (newStatus.equals(Status.ACTIVATE)) { + createLocalSession(sessionId); remoteSession.makeActive(reloadHandler); - } else if (newStatus.equals(Session.Status.DEACTIVATE)) { + } else if (newStatus.equals(Status.DEACTIVATE)) { remoteSession.deactivate(); - } else if (newStatus.equals(Session.Status.DELETE)) { + } else if (newStatus.equals(Status.DELETE)) { remoteSession.deactivate(); localSession.ifPresent(session -> { log.log(Level.FINE, session.logPre() + "Deleting session " + sessionId); @@ -69,6 +72,12 @@ public class SessionStateWatcher { } } + private void createLocalSession(long sessionId) { + if (sessionRepository.distributeApplicationPackage() && localSession.isEmpty()) { + localSession = sessionRepository.createLocalSessionUsingDistributedApplicationPackage(sessionId); + } + } + public long getSessionId() { return remoteSession.getSessionId(); } @@ -83,19 +92,18 @@ public class SessionStateWatcher { private void nodeChanged() { zkWatcherExecutor.execute(() -> { - Session.Status currentStatus = remoteSession.getStatus(); - Session.Status newStatus = Session.Status.NONE; + Status newStatus = Status.NONE; try { ChildData node = fileCache.getCurrentData(); if (node != null) { - newStatus = Session.Status.parse(Utf8.toString(node.getData())); - log.log(Level.FINE, remoteSession.logPre() + "Session change: Remote session " + remoteSession.getSessionId() + - " changed status from " + currentStatus.name() + " to " + newStatus.name()); + newStatus = Status.parse(Utf8.toString(node.getData())); + log.log(Level.FINE, remoteSession.logPre() + "Session change: Session " + + remoteSession.getSessionId() + " changed status to " + newStatus.name()); sessionStatusChanged(newStatus); } } catch (Exception e) { - log.log(Level.WARNING, remoteSession.logPre() + "Error handling session change from " + currentStatus.name() + - " to " + newStatus.name() + " for session " + getSessionId(), e); + log.log(Level.WARNING, remoteSession.logPre() + "Error handling session change to " + + newStatus.name() + " for session " + getSessionId(), e); metrics.incSessionChangeErrors(); } }); |