Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork33.3k
Closed
Description
Bug report
As a consequence of the optimization introduced in#91166, whenSelectorSocketTransport.writelines is used with a very large buffer which can't be written in one shot either by usingsocket.send orsocket.sendmsg the remaining data in the buffer is never written to the socket.
The following example can be used to reproduce the error:
importasyncioasyncdefsend_message(chunk_size:int,chunks:int):awaitasyncio.sleep(1)reader,writer=awaitasyncio.open_connection("127.0.0.1",9898)data= [bytes(chunk_size)]*chunks+ [b"end"]writer.writelines(data)awaitwriter.drain()writer.close()awaitwriter.wait_closed()asyncdefhandle_message(reader,writer):data=awaitreader.read()print(f"End marker:{data[-3:]!r}")writer.close()awaitwriter.wait_closed()asyncdefrun_server():server=awaitasyncio.start_server(handle_message,"127.0.0.1",9898)asyncwithserver:awaitserver.serve_forever()asyncdefmain():awaitasyncio.gather(run_server(),send_message(6500,100))asyncio.run(main())
The example above printsEnd marker: b'end' with python 3.11 but not with python3.12.0a6+
Your environment
- CPython versions tested on:
3.12.0a7 - Operating system and architecture: macOS 13.2
Linked PRs
Metadata
Metadata
Assignees
Projects
Status
Done