diff options
author | Philip Paquette <pcpaquette@gmail.com> | 2019-08-27 21:57:07 -0400 |
---|---|---|
committer | Philip Paquette <pcpaquette@gmail.com> | 2019-08-28 06:15:47 -0400 |
commit | f939bcea1eaf358f1884367360adfc8e883ea753 (patch) | |
tree | 2d53660f3c934b8e8a1ed03eaa3adb1ef00e9d94 | |
parent | 9e036fdbf7288506e45eccbc9dac9c28fc50f13b (diff) |
Fixed the 'Unknown request' race condition
- This happened when a response was received before being marked as 'waiting_responses'
-rw-r--r-- | diplomacy/client/connection.py | 14 |
1 files changed, 11 insertions, 3 deletions
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. |