[issue30064] BaseSelectorEventLoop.sock_{recv, sendall}() don't remove their callbacks when canceled
Fantix King
report at bugs.python.org
Sun Jun 14 00:06:58 EDT 2020
Fantix King <fantix.king at gmail.com> added the comment:
Oh thank you for the clue, that's super helpful! Let me try locally.
This fix PR was originally done to solve a hanging call in a race condition, so the test would hang forever if the fix is not working as expected. The 10 seconds wait_for() is to make sure that we don't end up with a test hanging forever.
If enlarging the timeout works in some of your cases, that really inspires me on a potential cause of the issue in the test. To simulate the race condition specifically for loop.sock_sendall(), I needed a connected socket with a full send buffer so that the next sock_sendall() call would block. To achieve this, I wrote something like this:
with self.assertRaises(BlockingIOError):
while True:
sock.send(b' ' * 5)
And another loop in a subtask to consume the data:
while not data:
data = await self.loop.sock_recv(server, 1024)
data = data.strip()
It might be that it cost too much time in these loops (especially the 2nd one because the logs showed that it was blocked on calling sock_sendall()). But that's just a guess yet, let me add some more debug logs and test locally.
----------
_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue30064>
_______________________________________
More information about the Python-bugs-list
mailing list