@Override
    public void run() {
        controllerThreadId = Thread.currentThread().getId();
        context.log(logger, Level.INFO, "Starting tick loop");
        try {
            processingCycle = true;
            while (isRunning()) {
                tick();
            }
            context.log(logger, Level.INFO, "Tick loop stopped");
        } catch (InterruptedException e) {
            context.log(logger, Level.INFO, "Event thread stopped by interrupt exception: ", e);
        } catch (Throwable t) {
            t.printStackTrace();
            context.log(logger, Level.SEVERE, "Fatal error killed fleet controller", t);
            synchronized (monitor) { running.set(false); }
            System.exit(1);
        } finally {
            prepareShutdownEdge();
        }
    }
Move tasks that are dependent on the most recently generated state being published into
a completion queue with a dependency on the provided version argument. Once that version
has been ACKed by all distributors in the system, those tasks will be marked as completed.
clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/FleetController.java