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())
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.