[Twisted-Python] accurate periodic call
p.mayers at imperial.ac.uk
Tue Feb 21 06:05:33 EST 2012
On 20/02/12 20:32, Glyph wrote:
> Well, it depends on how you define a "bug". LoopingCall's internal
> state remains consistent, but if you set your clock backwards,
> LoopingCall won't fire your callback again until the system clock
> catches up to where it previously was. Any new LoopingCalls that are
> created will work fine, although they will probably report an
> incorrect skipCount if you set the clock forward again.
Ah. This doesn't jump out from the original ticket text; the way I read
the text, it implies the LoopingCall stops being *scheduled* if the
clock goes backwards.
If I'm understanding it correctly, the problem is actually that the
callLater for the next run doesn't fire when expected, because it's
scheduled in the "pre-change" timeframe (now the future). As opposed to
being anything in the LoopingCall code?
I realise this is tricky to solve, but I'll note it's not impossible for
really REALLY big clock skews to happen. For example: recently we had a
server kernel panic and need a cold reboot. The machine booted and read
it's time from the CMOS clock, which was way WAY out. A minute or two
after the machine had booted, NTP slewed the clock back by months...
Fortunately this box doesn't run any Twisted code that a) starts on boot
and b) makes use of LoopingCall.
[I know this is horrible, but a lot of Unix distros don't sync system to
hardware clock periodically - usually on shutdown only - and a lot of
distros don't block boot until NTP has set the clock]
I realise it's an edge case; but at the very least, it is probably worth
updating the LoopingCall/IReactorTime.callLater documentation to make
this behaviour clear, because I certainly didn't appreciate this could
occur. It's pretty obvious in hindsight, though.
More information about the Twisted-Python