Skip to content

Commit

Permalink
bpo-36916: asyncio: Swallow unhandled write() exception (GH-13313)
Browse files Browse the repository at this point in the history
  • Loading branch information
asvetlov authored and vstinner committed May 14, 2019
1 parent c96be81 commit f12ba7c
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 1 deletion.
11 changes: 10 additions & 1 deletion Lib/asyncio/streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -329,6 +329,13 @@ def __del__(self):
closed.exception()


def _swallow_unhandled_exception(task):
# Do a trick to suppress unhandled exception
# if stream.write() was used without await and
# stream.drain() was paused and resumed with an exception
task.exception()


class StreamWriter:
"""Wraps a Transport.
Expand Down Expand Up @@ -393,7 +400,9 @@ def _fast_drain(self):
# fast path, the stream is not paused
# no need to wait for resume signal
return self._complete_fut
return self._loop.create_task(self.drain())
ret = self._loop.create_task(self.drain())
ret.add_done_callback(_swallow_unhandled_exception)
return ret

def write_eof(self):
return self._transport.write_eof()
Expand Down
3 changes: 3 additions & 0 deletions Lib/test/test_asyncio/test_streams.py
Original file line number Diff line number Diff line change
Expand Up @@ -851,6 +851,8 @@ def test_drain_raises(self):
# where it never gives up the event loop but the socket is
# closed on the server side.

messages = []
self.loop.set_exception_handler(lambda loop, ctx: messages.append(ctx))
q = queue.Queue()

def server():
Expand Down Expand Up @@ -883,6 +885,7 @@ async def client(host, port):
# Clean up the thread. (Only on success; on failure, it may
# be stuck in accept().)
thread.join()
self.assertEqual([], messages)

def test___repr__(self):
stream = asyncio.StreamReader(loop=self.loop,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Remove a message about an unhandled exception in a task when writer.write()
is used without await and writer.drain() fails with an exception.

0 comments on commit f12ba7c

Please sign in to comment.