In this case we're closing the timers on error. We might close a context twice, if we throw an IOException from rollupComputer.compute on an iteration after the first iteration.

Making the code resilient to a situation where we have intermittent failures on rollupComputer.compute is possible, but is significantly less readable and not worth the tradeoff IMO. See https://gist.github.com/fourk/87636981f2ed10d3e62e