From f939bcea1eaf358f1884367360adfc8e883ea753 Mon Sep 17 00:00:00 2001 From: Philip Paquette 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/connection.py') 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