From f939bcea1eaf358f1884367360adfc8e883ea753 Mon Sep 17 00:00:00 2001
From: Philip Paquette <pcpaquette@gmail.com>
Date: Tue, 27 Aug 2019 21:57:07 -0400
Subject: Fixed the 'Unknown request' race condition

- This happened when a response was received before being marked as 'waiting_responses'
---
 diplomacy/client/connection.py | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

(limited to 'diplomacy/client')

diff --git a/diplomacy/client/connection.py b/diplomacy/client/connection.py
index a6ecef8..d0d5902 100644
--- a/diplomacy/client/connection.py
+++ b/diplomacy/client/connection.py
@@ -385,6 +385,7 @@ class Connection():
         LOGGER.info('Trying to connect.')
         yield self._connect()
 
+    @gen.coroutine
     def _on_socket_message(self, socket_message):
         """ Manage given socket_message (string),
             that may be a string representation of either a request or a notification.
@@ -405,8 +406,15 @@ class Connection():
 
         if request_id:
             if request_id not in self.requests_waiting_responses:
-                LOGGER.error('Unknown request.')
-                return
+                # Response received before the request was marked as 'waiting responses'
+                # Waiting 5 secs to make sure this is not a race condition before aborting
+                for _ in range(10):
+                    yield gen.sleep(0.5)
+                    if request_id in self.requests_waiting_responses:
+                        break
+                else:
+                    LOGGER.error('Unknown request.')
+                    return
             request_context = self.requests_waiting_responses.pop(request_id)  # type: RequestFutureContext
             try:
                 response = responses.parse_dict(json_message)
@@ -439,7 +447,7 @@ class Connection():
                 yield self._reconnect()
             else:
                 # Check response format and run callback (if defined).
-                self._on_socket_message(msg)
+                yield self._on_socket_message(msg)
 
     def _handle_unknown_token(self, token):
         """ Notify server about an unknown channel token.
-- 
cgit v1.2.3