What an alarm lane actually achieved, as opposed to what it returned.
This type exists because the same bug happened three times. Migration re-armed at +1 ms on a step
that ERRORED, because an error return is non-null too. The fill head re-armed at +1 ms on a render
that THREW, producing 196 firings in 14 seconds, every one reporting outcome: ok. Both were
fixed case by case, and both had the same shape: a non-null return read as work done.
The re-arm delay is now a function of this classification and of nothing else, so the fast path
cannot be reached without something having first said the work progressed. Queue depth is no longer
sufficient -- it was what made the third instance possible, since a row that failed to be struck
kept the queue non-empty and the chain fast forever.
What an alarm lane actually achieved, as opposed to what it returned.
This type exists because the same bug happened three times. Migration re-armed at +1 ms on a step that ERRORED, because an error return is non-null too. The fill head re-armed at +1 ms on a render that THREW, producing 196 firings in 14 seconds, every one reporting
outcome: ok. Both were fixed case by case, and both had the same shape: a non-null return read as work done.The re-arm delay is now a function of this classification and of nothing else, so the fast path cannot be reached without something having first said the work progressed. Queue depth is no longer sufficient -- it was what made the third instance possible, since a row that failed to be struck kept the queue non-empty and the chain fast forever.