From ce548687f814dc64f6434a0cdf62391d4956ec96 Mon Sep 17 00:00:00 2001 From: Brian Warner Date: Sun, 3 Apr 2016 01:01:08 -0700 Subject: [PATCH] iputil.py: avoid DirtyReactorError when running tests offline The udpprot.transport.connect() fails if we don't have a network connection, but the port is still listening, so trial gives us a DirtyReactorError. The fix is a "finally:" which does port.stopListening() even in this case. Closes ticket:2769 --- src/allmydata/util/iputil.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/allmydata/util/iputil.py b/src/allmydata/util/iputil.py index 4b90b250b..60c082192 100644 --- a/src/allmydata/util/iputil.py +++ b/src/allmydata/util/iputil.py @@ -130,10 +130,16 @@ def get_local_ip_for(target): try: udpprot = DatagramProtocol() port = reactor.listenUDP(0, udpprot) - udpprot.transport.connect(target_ipaddr, 7) - localip = udpprot.transport.getHost().host - d = port.stopListening() - d.addErrback(log.err) + try: + # connect() will fail if we're offline (e.g. running tests on a + # disconnected laptop), which is fine (localip=None), but we must + # still do port.stopListening() or we'll get a DirtyReactorError + udpprot.transport.connect(target_ipaddr, 7) + localip = udpprot.transport.getHost().host + return localip + finally: + d = port.stopListening() + d.addErrback(log.err) except (socket.error, CannotListenError): # no route to that host localip = None