Skip to content

Commit b8483d2

Browse files
committed
Handle Stream.wait_closed() windows bug gracefully
1 parent 70b0403 commit b8483d2

File tree

3 files changed

+13
-4
lines changed

3 files changed

+13
-4
lines changed

asyncpg/compat.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,14 @@ def current_asyncio_task(loop):
7979
else:
8080
def current_asyncio_task(loop):
8181
return asyncio.Task.current_task(loop)
82+
83+
84+
async def wait_closed(stream):
85+
# Not all asyncio versions have StreamWriter.wait_closed().
86+
if hasattr(stream, 'wait_closed'):
87+
try:
88+
await stream.wait_closed()
89+
except ConnectionResetError:
90+
# On Windows wait_closed() sometimes propagates
91+
# ConnectionResetError which is totally unnecessary.
92+
pass

asyncpg/connect_utils.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -611,8 +611,7 @@ async def _negotiate_ssl_connection(host, port, conn_factory, *, loop, ssl,
611611
sock = sock.dup() # Must come before tr.close()
612612
finally:
613613
writer.close()
614-
if hasattr(writer, 'wait_closed'):
615-
await writer.wait_closed()
614+
await compat.wait_closed(writer)
616615

617616
try:
618617
return await conn_factory(sock=sock) # Must come after tr.close()

asyncpg/connection.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1223,8 +1223,7 @@ async def _cancel(self, waiter):
12231223
waiter.set_result(None)
12241224
if w is not None:
12251225
w.close()
1226-
if hasattr(w, 'wait_closed'):
1227-
await w.wait_closed()
1226+
await compat.wait_closed(w)
12281227

12291228
def _cancel_current_command(self, waiter):
12301229
self._cancellations.add(self._loop.create_task(self._cancel(waiter)))

0 commit comments

Comments
 (0)