From 6daf75fed4ca5b9ea9223cbb1f5407448a13f0a2 Mon Sep 17 00:00:00 2001 From: tsm-odoo Date: Wed, 5 Jul 2023 09:14:07 +0000 Subject: [PATCH] [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) Signed-off-by: Matthieu Stockbauer (tsm) --- addons/bus/websocket.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/bus/websocket.py b/addons/bus/websocket.py index 02f4f69fbb5..d4a449aa46c 100644 --- a/addons/bus/websocket.py +++ b/addons/bus/websocket.py @@ -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