mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 09:58:01 +00:00
python: Add cooperative_yield() API method to Idl.
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 <twilson@redhat.com> Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
This commit is contained in:
parent
487253d5b8
commit
d28c5ca576
5
NEWS
5
NEWS
@ -13,6 +13,11 @@ Post-v2.15.0
|
||||
* New command line options --record/--replay for ovsdb-server and
|
||||
ovsdb-client to record and replay all the incoming transactions,
|
||||
monitors, etc. More datails in Documentation/topics/record-replay.rst.
|
||||
* The Python Idl class now has a cooperative_yield() method that can be
|
||||
overridden by an application that uses eventlet / gevent / asyncio with
|
||||
the desired yield method (e.g. {eventlet,gevent,asyncio}.sleep(0)) to
|
||||
prevent the application from being blocked for a long time while
|
||||
processing database updates.
|
||||
- In ovs-vsctl and vtep-ctl, the "find" command now accept new
|
||||
operators {in} and {not-in}.
|
||||
- Userspace datapath:
|
||||
|
@ -481,6 +481,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)
|
||||
@ -646,6 +655,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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user