private boolean handleTimeDependentOpsForNode(ClusterState currentClusterState,
                                                  NodeListener nodeListener,
                                                  long currentTime,
                                                  NodeInfo node) {
        NodeState currentStateInSystem = currentClusterState.getNodeState(node.getNode());
        NodeState lastReportedState = node.getReportedState();
        boolean triggeredAnyTimers =
                reportDownIfOutdatedSlobrokNode(currentClusterState, nodeListener, currentTime, node, lastReportedState);

        if (nodeStillUnavailableAfterTransitionTimeExceeded(currentTime, node, currentStateInSystem, lastReportedState))
            triggeredAnyTimers = true;

        if (nodeInitProgressHasTimedOut(currentTime, node, currentStateInSystem, lastReportedState)) {
            eventLog.add(NodeEvent.forBaseline(node, String.format(
                        "%d milliseconds without initialize progress. Marking node down. " +
                        "Premature crash count is now %d.",
                        currentTime - node.getInitProgressTime(),
                        node.getPrematureCrashCount() + 1),
                    NodeEvent.Type.CURRENT, currentTime), isMaster);
            handlePrematureCrash(node, nodeListener);
            triggeredAnyTimers = true;
        }

        if (mayResetCrashCounterOnStableUpNode(currentTime, node, lastReportedState)) {
            node.setPrematureCrashCount(0);
            log.log(FINE, () -> "Resetting premature crash count on node " + node + " as it has been up for a long time.");
            triggeredAnyTimers = true;
        } else if (mayResetCrashCounterOnStableDownNode(currentTime, node, lastReportedState)) {
            node.setPrematureCrashCount(0);
            log.log(FINE, () -> "Resetting premature crash count on node " + node + " as it has been down for a long time.");
            triggeredAnyTimers = true;
        }

        return triggeredAnyTimers;
    }
Propose a new state for a node. This may happen due to an administrator action, orchestration, or
a configuration change.

If the newly proposed state differs from the state the node currently has in the system,
a cluster state regeneration will be triggered.
clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandler.java