Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 19 additions & 4 deletions api/pubsub.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,9 @@ def __init__(self, host=None, db_number=None):
host = self._settings.redis_host
if db_number is None:
db_number = self._settings.redis_db_number
self._redis = aioredis.from_url(f'redis://{host}/{db_number}')
self._redis = aioredis.from_url(
f'redis://{host}/{db_number}', health_check_interval=30
)
# self._subscriptions is a dict that matches a subscription id
# (key) with a Subscription object ('sub') and a redis
# PubSub object ('redis_sub'). For instance:
Expand Down Expand Up @@ -135,9 +137,22 @@ async def listen(self, sub_id, user=None):
f"not owned by {user}")
while True:
self._subscriptions[sub_id]['last_poll'] = datetime.utcnow()
msg = await sub['redis_sub'].get_message(
ignore_subscribe_messages=True, timeout=1.0
)
msg = None
try:
msg = await sub['redis_sub'].get_message(
ignore_subscribe_messages=True, timeout=1.0
)
except aioredis.ConnectionError:
async with self._lock:
channel = self._subscriptions[sub_id]['sub'].channel
new_redis_sub = self._redis.pubsub()
await new_redis_sub.subscribe(channel)
self._subscriptions[sub_id]['redis_sub'] = new_redis_sub
sub['redis_sub'] = new_redis_sub
Comment on lines +145 to +151
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here the method creates a new subscription on connection error. How will the client receive the new sub ID?
The client will need it to keep listening and also to unsubscribe.
I think it's better to return None instead of creating a new subscription.
The client will need to subscribe again in this case.

continue
except aioredis.RedisError:
return None # Handle any exceptions gracefully
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd suggest to log something before returning None just to know afterwards what happened from the logs.


if msg is None:
continue
msg_data = json.loads(msg['data'])
Expand Down