Ticket #2854 defect closed fixed

Opened 7 years ago

Last modified 5 years ago

Reactor claims not be running although reactor.run() has been called

Reported by: htj Owned by:
Priority: normal Milestone:
Component: core Keywords:
Cc: therve, exarkun Branch:
Author: Launchpad Bug:

Description

Hi

The following code fails in current twisted trunk:

from twisted.internet import reactor, defer

def main():
    reactor.stop()
    return

if __name__ == '__main__':
    reactor.callWhenRunning(main)
    reactor.run()

The output is:

Unhandled error in Deferred:
Traceback (most recent call last):
  File "/home/htj/pack/python/twisted/internet/base.py", line 389, in _continueFiring
    callable(*args, **kwargs)
  File "ting.py", line 8, in main
    d.addBoth(lambda _ : reactor.stop())
  File "/home/htj/pack/python/twisted/internet/defer.py", line 210, in addBoth
    callbackKeywords=kw, errbackKeywords=kw)
  File "/home/htj/pack/python/twisted/internet/defer.py", line 182, in addCallbacks
    self._runCallbacks()
--- <exception caught here> ---
  File "/home/htj/pack/python/twisted/internet/defer.py", line 317, in _runCallbacks
    self.result = callback(self.result, *args, **kw)
  File "ting.py", line 4, in main
    reactor.stop()
  File "/home/htj/pack/python/twisted/internet/base.py", line 480, in stop
    raise RuntimeError, "can't stop reactor that isn't running"
exceptions.RuntimeError: can't stop reactor that isn't running

This has worked well in previous versions if twisted. Am I doing anything wrong? If I start doing actual IO the above structure works well.

I've tracked down the change in behaviour to be in internet/base.py from changeset 20909:  http://twistedmatrix.com/trac/changeset/20909

Although I do not really an idea of whats causing it.

I'm not quite sure how to have this as a trial test, it seems to be related to events during startup.

Change History

1

Changed 7 years ago by htj

  • type changed from enhancement to defect

enhancement -> defect

2

Changed 7 years ago by exarkun

  • priority changed from normal to high

Apparently running used to be set to 1 after the before phase of the startup event in all cases. Now, if there are no before phase triggers for the startup event which return Deferreds which have not already been called back, running will not be set to 1 until after all before phase startup triggers have run. This includes triggers added via callWhenRunning.

I suppose the old behavior should be restored. Obviously, as part of that, tests for running should be added. Hopefully just as obviously, the exact semantics of running should probably be documented (however, I still think running is a private attribute of the reactor. It is unfortunate that it does not have an _ prefix).

This is a regression introduced by r20909. If conflicts which would make it difficult have not yet been introduced, that revision should be reverted, fixed, re-reviewed, and re-merged.

3

Changed 7 years ago by exarkun

  • milestone set to Core-2.6

4

Changed 6 years ago by therve

  • cc therve, exarkun added

The great thing (or maybe not), is that it has been fixed in r21395. At least, the reported problem doesn't appear anymore.

5

Changed 6 years ago by exarkun

Some new tests should still be added

6

Changed 6 years ago by therve

  • priority changed from high to normal
  • milestone twisted-8.0 deleted

7

Changed 5 years ago by exarkun

  • status changed from new to closed
  • resolution set to fixed

This behavior is tested by twisted.internet.test.test_core.SystemEventTestsBuilder.test_stopWhenAlreadyStopped.

8

Changed 3 years ago by <automation>

  • owner glyph deleted
Note: See TracTickets for help on using tickets.