diff options
Diffstat (limited to 'node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterImpl.java')
-rw-r--r-- | node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterImpl.java | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterImpl.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterImpl.java index 98394f52857..427588c287d 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterImpl.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/nodeadmin/NodeAdminStateUpdaterImpl.java @@ -43,6 +43,7 @@ import static com.yahoo.vespa.hosted.node.admin.provider.NodeAdminStateUpdater.S */ public class NodeAdminStateUpdaterImpl implements NodeAdminStateUpdater { static final Duration FREEZE_CONVERGENCE_TIMEOUT = Duration.ofMinutes(5); + static final String TRANSITION_EXCEPTION_MESSAGE = "NodeAdminStateUpdater has not run since current wanted state was set"; private final AtomicBoolean terminated = new AtomicBoolean(false); private State currentState = SUSPENDED_NODE_ADMIN; @@ -50,6 +51,7 @@ public class NodeAdminStateUpdaterImpl implements NodeAdminStateUpdater { private boolean workToDoNow = true; private final Object monitor = new Object(); + private RuntimeException lastConvergenceException; private final Logger log = Logger.getLogger(NodeAdminStateUpdater.class.getName()); private final ScheduledExecutorService specVerifierScheduler = @@ -143,15 +145,19 @@ public class NodeAdminStateUpdaterImpl implements NodeAdminStateUpdater { } @Override - public boolean setResumeStateAndCheckIfResumed(State wantedState) { + public void setResumeStateAndCheckIfResumed(State wantedState) { synchronized (monitor) { if (this.wantedState != wantedState) { log.info("Wanted state change: " + this.wantedState + " -> " + wantedState); this.wantedState = wantedState; + setLastConvergenceException(null); signalWorkToBeDone(); } - return currentState == wantedState; + if (currentState != wantedState) { + throw Optional.ofNullable(lastConvergenceException) + .orElseGet(() -> new RuntimeException(TRANSITION_EXCEPTION_MESSAGE)); + } } } @@ -187,9 +193,12 @@ public class NodeAdminStateUpdaterImpl implements NodeAdminStateUpdater { try { convergeState(wantedStateCopy); + setLastConvergenceException(null); } catch (OrchestratorException | ConvergenceException | HttpException e) { + setLastConvergenceException(e); log.info("Unable to converge to " + wantedStateCopy + ": " + e.getMessage()); - } catch (Exception e) { + } catch (RuntimeException e) { + setLastConvergenceException(e); log.log(LogLevel.ERROR, "Error while trying to converge to " + wantedStateCopy, e); } @@ -206,6 +215,12 @@ public class NodeAdminStateUpdaterImpl implements NodeAdminStateUpdater { fetchContainersToRunFromNodeRepository(); } + private void setLastConvergenceException(RuntimeException exception) { + synchronized (monitor) { + lastConvergenceException = exception; + } + } + /** * This method attempts to converge node-admin w/agents to a {@link State} * with respect to: freeze, Orchestrator, and services running. |