Browse Source

Prevent pubsub managers from ever crashing

Fixes #1262
pull/1298/head
Miguel Grinberg 1 year ago
parent
commit
12134bd5c5
Failed to extract signature
  1. 12
      src/socketio/async_pubsub_manager.py
  2. 11
      src/socketio/pubsub_manager.py
  3. 1
      tests/async/test_pubsub_manager.py

12
src/socketio/async_pubsub_manager.py

@ -230,11 +230,13 @@ class AsyncPubSubManager(AsyncManager):
await self._handle_close_room(data) await self._handle_close_room(data)
except asyncio.CancelledError: except asyncio.CancelledError:
raise # let the outer try/except handle it raise # let the outer try/except handle it
except: except Exception:
self.server.logger.exception( self.server.logger.exception(
'Unknown error in pubsub listening task') 'Handler error in pubsub listening thread')
self.server.logger.error('pubsub listen() exited unexpectedly')
break # loop should never exit except in unit tests!
except asyncio.CancelledError: # pragma: no cover except asyncio.CancelledError: # pragma: no cover
break break
except: # pragma: no cover except Exception: # pragma: no cover
import traceback self.server.logger.exception('Unexpected Error in pubsub '
traceback.print_exc() 'listening thread')

11
src/socketio/pubsub_manager.py

@ -188,6 +188,8 @@ class PubSubManager(Manager):
namespace=message.get('namespace')) namespace=message.get('namespace'))
def _thread(self): def _thread(self):
while True:
try:
for message in self._listen(): for message in self._listen():
data = None data = None
if isinstance(message, dict): if isinstance(message, dict):
@ -220,6 +222,11 @@ class PubSubManager(Manager):
self._handle_leave_room(data) self._handle_leave_room(data)
elif data['method'] == 'close_room': elif data['method'] == 'close_room':
self._handle_close_room(data) self._handle_close_room(data)
except: except Exception:
self.server.logger.exception( self.server.logger.exception(
'Unknown error in pubsub listening thread') 'Handler error in pubsub listening thread')
self.server.logger.error('pubsub listen() exited unexpectedly')
break # loop should never exit except in unit tests!
except Exception: # pragma: no cover
self.server.logger.exception('Unexpected Error in pubsub '
'listening thread')

1
tests/async/test_pubsub_manager.py

@ -541,7 +541,6 @@ class TestAsyncPubSubManager(unittest.TestCase):
'host_id': host_id} 'host_id': host_id}
yield pickle.dumps({'method': 'close_room', 'value': 'baz', yield pickle.dumps({'method': 'close_room', 'value': 'baz',
'host_id': host_id}) 'host_id': host_id})
raise asyncio.CancelledError() # force the thread to exit
self.pm._listen = messages self.pm._listen = messages
_run(self.pm._thread()) _run(self.pm._thread())

Loading…
Cancel
Save