TimerLoop
The one firing loop of a node: it fires the timers of every TimerRunner registered with it, each a context's log group, in the partitions the node owns there.
A round: first it writes what the timers fired since the last round came to (TimerRunner.flush, batched conditional writes); then, every TimerOptions.pollInterval, it reads each runner's timers due within TimerOptions.lookahead with one query over all the partitions it owns (me.ahoo.wow.spi.timer.TimerStore.due), whatever their number; then it sends each loaded timer that is due (TimerRunner.dispatch), at most TimerOptions.parallelism at once in a partition and at most TimerOptions.maxFireRate a second in a partition, so a backlog after an outage drains at that rate. It sleeps until the next poll, the next due timer or the next permitted firing, and wakes early when a firing ends or a partition starts.
Firing only by the owner of the timer's partition, its owner's: a runner holds the partitions the node owns, from their acquisition until their hand-off (me.ahoo.wow.runtime.cluster.PartitionOwnership).
rounds counts the rounds that read the stores, for the tests of the one query per round.
A fatal error a send meets (NodeFatals.isFatal: out of memory, say) is recorded as the node's (fatals) and ends that send, its timer left claimed: nothing sends it again here, and the next owner of its partition does once the claim lapses. A StackOverflowError is a failed attempt, as any error.