private void updateNodeInfoFromReportedState(final NodeInfo node,
                                                 final NodeState currentState,
                                                 final NodeState reportedState,
                                                 final NodeListener nodeListener) {
        final long timeNow = timer.getCurrentTimeInMillis();
        log.log(FINE, () -> String.format("Finding new cluster state entry for %s switching state %s", node, currentState.getTextualDifference(reportedState)));

        if (handleReportedNodeCrashEdge(node, currentState, reportedState, nodeListener, timeNow)) {
            return;
        }
        if (initializationProgressHasIncreased(currentState, reportedState)) {
            node.setInitProgressTime(timeNow);
            log.log(FINEST, () -> "Reset initialize timer on " + node + " to " + node.getInitProgressTime());
        }
        if (handleImplicitCrashEdgeFromReverseInitProgress(node, currentState, reportedState, nodeListener, timeNow)) {
            return;
        }
        markNodeUnstableIfDownEdgeDuringInit(node, currentState, reportedState, nodeListener, timeNow);
    }
Modify a node's cross-state information in the cluster based on a newly arrived reported state.

@param  node the node we are computing the state of
@param  currentState the current state of the node
@param  reportedState the new state reported by (or, in the case of down - inferred from) the node
@param  nodeListener this listener is notified for some of the system state changes that this will return
clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/StateChangeHandler.java