private boolean completeSatisfiedVersionDependentTasks() {
        int publishedVersion = systemStateBroadcaster.lastClusterStateVersionInSync();
        long queueSizeBefore = taskCompletionQueue.size();
        // Note: although version monotonicity of tasks in queue always should hold,
        // deadline monotonicity is not guaranteed to do so due to reconfigs of task
        // timeout durations. Means that tasks enqueued with shorter deadline duration
        // might be observed as having at least the same timeout as tasks enqueued during
        // a previous configuration. Current clock implementation is also susceptible to
        // skewing.
        final long now = timer.getCurrentTimeInMillis();
        while (!taskCompletionQueue.isEmpty()) {
            VersionDependentTaskCompletion taskCompletion = taskCompletionQueue.peek();
            // TODO expose and use monotonic clock instead of system clock
            if (publishedVersion >= taskCompletion.getMinimumVersion()) {
                context.log(logger, Level.FINE, () -> String.format("Deferred task of type '%s' has minimum version %d, published is %d; completing",
                                                    taskCompletion.getTask().getClass().getName(), taskCompletion.getMinimumVersion(), publishedVersion));
                taskCompletion.getTask().notifyCompleted();
                taskCompletionQueue.remove();
            } else if (taskCompletion.getDeadlineTimePointMs() <= now) {
                var details = buildNodesNotYetConvergedMessage(taskCompletion.getMinimumVersion());
                context.log(logger, Level.WARNING, () -> String.format("Deferred task of type '%s' has exceeded wait deadline; completing with failure (details: %s)",
                                                       taskCompletion.getTask().getClass().getName(), details));
                taskCompletion.getTask().handleFailure(RemoteClusterControllerTask.Failure.of(
                        RemoteClusterControllerTask.FailureCondition.DEADLINE_EXCEEDED, details));
                taskCompletion.getTask().notifyCompleted();
                taskCompletionQueue.remove();
            } else {
                break;
            }
        }
        return (taskCompletionQueue.size() != queueSizeBefore);
    }
This is called when the options field has been set to a new set of options
clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java