r46874 - Merge hostname-endpoint-dirty-reactor-8223: Clean up reactor after cancellation
glyph-TA+aISz0psMTMxyoc4vAAJOcrHinNvQL0E9HWUfgJXw@public.gmane.org
| Newsgroups | gmane.comp.python.twisted.commits |
|---|---|
| Message-ID | <[email protected]> |
Author: glyph
Date: Mon Feb 29 14:05:27 2016
New Revision: 46874
Added:
trunk/twisted/topfiles/8223.misc
Modified:
trunk/twisted/internet/endpoints.py
trunk/twisted/internet/test/test_endpoints.py
Log:
Merge hostname-endpoint-dirty-reactor-8223: Clean up reactor after cancellation
Author: warner
Reviewer: glyph
Fixes: #8223
As noted in https://twistedmatrix.com/trac/ticket/8014#comment:15 , when a
HostnameEndpoint's Deferred is cancelled while waiting for a connection to
occur, it leaves the DelayedCall running. While this might not affect normal
applications, any trial tests that hit this case will fail, with a "Dirty
Reactor Error".
Modified: trunk/twisted/internet/endpoints.py
==============================================================================
--- trunk/twisted/internet/endpoints.py (original)
+++ trunk/twisted/internet/endpoints.py Mon Feb 29 14:05:27 2016
@@ -760,7 +760,6 @@
if endpoint is None:
# The list of endpoints ends.
checkDone.endpointsLeft = False
- iterateEndpoint.stop()
checkDone()
return
@@ -772,8 +771,6 @@
return result
@eachAttempt.addCallback
def succeeded(result):
- if iterateEndpoint.running:
- iterateEndpoint.stop()
winner.callback(result)
@eachAttempt.addErrback
def failed(reason):
@@ -788,6 +785,8 @@
checkDone.completed = True
for remaining in pending[:]:
remaining.cancel()
+ if iterateEndpoint.running:
+ iterateEndpoint.stop()
return result
return winner
Modified: trunk/twisted/internet/test/test_endpoints.py
==============================================================================
--- trunk/twisted/internet/test/test_endpoints.py (original)
+++ trunk/twisted/internet/test/test_endpoints.py Mon Feb 29 14:05:27 2016
@@ -1689,6 +1689,7 @@
self.assertIsInstance(failure.value, error.ConnectingCancelledError)
self.assertEqual(failure.value.address, address)
self.assertTrue(mreactor.tcpClients[0][2]._connector.stoppedConnecting)
+ self.assertEqual([], mreactor.getDelayedCalls())
def test_endpointConnectingCancelledAfterAllAttemptsStarted(self):
@@ -1722,6 +1723,7 @@
d = ep.connect(clientFactory)
mreactor.advance(endpoints.HostnameEndpoint._DEFAULT_ATTEMPT_DELAY)
self.assertEqual(self.failureResultOf(d).value, expectedError)
+ self.assertEqual([], mreactor.getDelayedCalls())
def test_endpointConnectFailureAfterIteration(self):
@@ -1746,6 +1748,7 @@
host, port, factory, timeout, bindAddress = mreactor.tcpClients[0]
factory.clientConnectionFailed(mreactor.connectors[0], expectedError)
self.assertEqual(self.failureResultOf(d).value, expectedError)
+ self.assertEqual([], mreactor.getDelayedCalls())
def test_endpointConnectSuccessAfterIteration(self):
@@ -1905,6 +1908,7 @@
self.assertIsInstance(failure.value, error.ConnectingCancelledError)
self.assertEqual(failure.value.address, address)
self.assertTrue(mreactor.tcpClients[0][2]._connector.stoppedConnecting)
+ self.assertEqual([], mreactor.getDelayedCalls())
def test_endpointConnectFailure(self):
@@ -1922,6 +1926,7 @@
d = ep.connect(clientFactory)
mreactor.advance(0.3)
self.assertEqual(self.failureResultOf(d).value, expectedError)
+ self.assertEqual([], mreactor.getDelayedCalls())
@@ -2030,6 +2035,7 @@
self.assertEqual(len(results), 1)
self.assertEqual(results[0].factory, clientFactory)
+ self.assertEqual([], self.mreactor.getDelayedCalls())
def test_IPv6IsFaster(self):
@@ -2063,6 +2069,7 @@
self.assertEqual(len(results), 1)
self.assertEqual(results[0].factory, clientFactory)
+ self.assertEqual([], self.mreactor.getDelayedCalls())
def test_otherConnectionsCancelled(self):
@@ -2090,6 +2097,7 @@
self.assertEqual(True,
self.mreactor.tcpClients[0][2]._connector.stoppedConnecting)
+ self.assertEqual([], self.mreactor.getDelayedCalls())