When using eventlet monkey_patch()'d code, greenthreads can be blocked on connection for several seconds while the database contents are parsed. Eventlet recommends adding a sleep(0) call to cooperatively yield in cpu-bound code. asyncio code has asyncio.sleep(0). This patch adds an API method that defaults to doing nothing, but can be overridden to yield as needed.
Signed-off-by: Terry Wilson <twil...@redhat.com> --- python/ovs/db/idl.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/python/ovs/db/idl.py b/python/ovs/db/idl.py index 889cf3431..751feb47f 100644 --- a/python/ovs/db/idl.py +++ b/python/ovs/db/idl.py @@ -479,6 +479,15 @@ class Idl(object): :type updates: Row """ + def cooperative_yield(self): + """Hook for cooperatively yielding to eventlet/gevent/asyncio/etc. + + When a block of code is going to spend a lot of time cpu-bound without + doing any I/O, it can cause greenthread/coroutine libraries to block. + This call should be added to code where this can happen, but defaults + to doing nothing to avoid overhead where it is not needed. + """ + def __send_cond_change(self, table, cond): monitor_cond_change = {table.name: [{"where": cond}]} old_uuid = str(self.uuid) @@ -644,6 +653,8 @@ class Idl(object): 'is not an object' % (table_name, uuid_string)) + self.cooperative_yield() + if version == OVSDB_UPDATE2: changes = self.__process_update2(table, uuid, row_update) if changes: -- 2.17.1 _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev