aboutsummaryrefslogtreecommitdiff
path: root/diplomacy/client/connection.py
diff options
context:
space:
mode:
authorPhilip Paquette <pcpaquette@gmail.com>2019-08-27 21:57:07 -0400
committerPhilip Paquette <pcpaquette@gmail.com>2019-08-28 06:15:47 -0400
commitf939bcea1eaf358f1884367360adfc8e883ea753 (patch)
tree2d53660f3c934b8e8a1ed03eaa3adb1ef00e9d94 /diplomacy/client/connection.py
parent9e036fdbf7288506e45eccbc9dac9c28fc50f13b (diff)
Fixed the 'Unknown request' race condition
- This happened when a response was received before being marked as 'waiting_responses'
Diffstat (limited to 'diplomacy/client/connection.py')
-rw-r--r--diplomacy/client/connection.py14
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.