@Override
    protected void expire(List<Node> expired) {
        nodeRepository().nodes().performOn(NodeList.copyOf(expired),
                                           node -> node.state() == State.dirty && isExpired(node),
                                           (node, lock) -> nodeRepository().nodes().fail(node.hostname(),
                                                                                         wantToDeprovisionOnExpiry,
                                                                                         Agent.DirtyExpirer,
                                                                                         "Node is stuck in dirty"));
    }
This moves nodes from dirty to failed if they have been in dirty too long
with the assumption that a node is stuck in dirty because it has failed.
<p>
As the nodes are moved back to dirty their failure count is increased,
and if the count is sufficiently low they will be attempted recycled to dirty again.
The upshot is nodes may get multiple attempts at clearing through dirty, but they will
eventually stay in failed.

@author bratseth
node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/DirtyExpirer.java