[FIX] bus: use poll selector on evented mode

Websocket instances use `selectors.DefaultSelector` in order to
wait for the socket to be ready for I/O. Gevent replaces the
default selector standard implementation by its own, using
`select.select` by default. The issue is that `select.select`
can only handle fd between 0 and 1023 which leads to select
out of range errors when this cap is reached.

In order to solve this issue, this commit enforces the use of
the `PollSelector` when running in evented mode and when it
is available: `select.poll` does not suffer from the same limit
as `select.select` does.

closes odoo/odoo#127692

X-original-commit: 7e8c0dbe118494c94745ba0fde6290db66d610e2
Signed-off-by: Julien Castiaux (juc) <juc@odoo.com>
Signed-off-by: Matthieu Stockbauer (tsm) <tsm@odoo.com>
This commit is contained in:
tsm-odoo
2023-07-07 08:31:50 +02:00
parent cc6b60f72f
commit 6daf75fed4
+5 -1
View File
@@ -241,7 +241,11 @@ class Websocket:
self._channels = set()
self._last_notif_sent_id = 0
# Websocket start up
self._selector = selectors.DefaultSelector()
self._selector = (
selectors.PollSelector()
if odoo.evented and hasattr(selectors, 'PollSelector')
else selectors.DefaultSelector()
)
self._selector.register(self._socket, selectors.EVENT_READ)
self._selector.register(self._notif_sock_r, selectors.EVENT_READ)
self.state = ConnectionState.OPEN