Fix deadlock issue when joining large guilds.

This commit is contained in:
Rapptz 2016-04-15 23:26:33 -04:00
parent cc23a54d58
commit 8d7dd79673
2 changed files with 13 additions and 7 deletions

View File

@ -378,8 +378,6 @@ class Client:
log.info('Unhandled event {}'.format(event))
else:
result = func(data)
if asyncio.iscoroutine(result):
yield from result
@asyncio.coroutine
def _make_websocket(self, initial=True):

View File

@ -338,6 +338,17 @@ class ConnectionState:
return self._add_server_from_data(data)
@asyncio.coroutine
def _chunk_and_dispatch(self, server, unavailable):
yield from self.chunker(server)
chunks = list(self.chunks_needed(server))
if chunks:
yield from asyncio.wait(chunks)
if unavailable == False:
self.dispatch('server_available', server)
else:
self.dispatch('server_join', server)
def parse_guild_create(self, data):
unavailable = data.get('unavailable')
if unavailable == True:
@ -367,11 +378,8 @@ class ConnectionState:
# since we're not waiting for 'useful' READY we'll just
# do the chunk request here
yield from self.chunker(server)
chunks = list(self.chunks_needed(server))
if chunks:
yield from asyncio.wait(chunks)
utils.create_task(self._chunk_and_dispatch(server, unavailable), loop=self.loop)
return
# Dispatch available if newly available
if unavailable == False: