Make ensure_server async
authorTomás Touceda <chiiph@leap.se>
Tue, 13 Aug 2013 18:29:38 +0000 (15:29 -0300)
committerTomás Touceda <chiiph@leap.se>
Wed, 14 Aug 2013 20:09:31 +0000 (17:09 -0300)
changes/bug_make_ping_async [new file with mode: 0644]
src/leap/common/events/server.py

diff --git a/changes/bug_make_ping_async b/changes/bug_make_ping_async
new file mode 100644 (file)
index 0000000..692518c
--- /dev/null
@@ -0,0 +1,2 @@
+  o Make the server ping call be async inside events'
+    ensure_server. Fixes #3355.
\ No newline at end of file
index 59f3454..861cb4f 100644 (file)
@@ -77,18 +77,32 @@ def ensure_server(port=SERVER_PORT):
         s.connect(('localhost', port))
         s.close()
         # port is taken, check if there's a server running there
-        response = ping(port)
-        if response is not None and response.status == proto.EventResponse.OK:
-            logger.info('A server is already running on port %d.', port)
-            return None
-        # port is taken, and not by an events server
-        logger.info('Port %d is taken by something not an events server.', port)
-        raise PortAlreadyTaken(port)
+        ping(port,
+             reqcbk=lambda req, res: process_ping(port, req, res),
+             timeout=10)
     except socket.error:
         # port is available, run a server
         logger.info('Launching server on port %d.', port)
         return EventsServerDaemon.ensure(port)
 
+def process_ping(port, request, response):
+    """
+    Response callback for the ping event.
+
+    :param port: Port that is trying to be used
+    :type port: int
+    :param request: Ping request made
+    :type request: proto.PingRequest
+    :param response: Response from the event
+    :type response: proto.EventResponse
+    """
+    if response is not None and response.status == proto.EventResponse.OK:
+        logger.info('A server is already running on port %d.', port)
+        return
+    # port is taken, and not by an events server
+    logger.info('Port %d is taken by something not an events server.', port)
+    raise PortAlreadyTaken(port)
+
 
 def ping(port=SERVER_PORT, reqcbk=None, timeout=1000):
     """