On 10/22/26 Ilya Maximets wrote: > While the old code suggested that the select.poll() can be used as a > drop-in replacement, it is not really the case, it seems. The problem > is that a second select.poll.register() call overwrites the event > flags for the file descriptor. So, if we first register for POLLOUT > and then for POLLIN, then we will not actually wait for POLLOUT, which > may be a problem on a congested connection where the application will > never wake up to send if there is nothing to receive. > > We may need to have a separate class similar to the _SelectSelect to > accumulate the flags and only actually register in the poll() call > itself when we have all the event flags. > > WDYT?
Thanks, Ilya, good catch, and thanks, Terry, for testing. You're right. With a bare select.poll, registering POLLOUT and then POLLIN on the same fd leaves only POLLIN, and Idl.wait() does exactly that when the jsonrpc connection has output pending: Session.wait() ends up in send_wait() and Session.recv_wait() follows. I could reproduce it with a socketpair: a Poller waiting for POLLOUT and then POLLIN on the writable end, with a 2 second timer, sleeps the full 2 seconds instead of waking up right away. I have a v4 ready with a small class that keeps the accumulated mask per fd, the way poll_fd_wait() does in lib/poll-loop.c. It registers the merged mask on every register() call rather than deferring it to poll(). select.poll only builds the pollfd array when poll() is called, so the result is the same and the class stays a bit simpler. Does that work for you, or would you rather have it the other way? I'll send v4 once we agree on it. Terry, since the code changes, I won't carry your Acked-by and Tested-by over to v4. The same problem is also in the workaround that went into neutron, I'll fix it there as well. Best regards, Kyuyeong _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
