diff mbox series

[ovs-dev,5/5] ovsdb-idl: Add _until variants of run functions.

Message ID 20250507134151.118615-6-martin.morgenstern@cloudandheat.com
State New
Delegated to: Ilya Maximets
Headers show
Series Timing API for jsonrpc, ovsdb-cs and ovsdb-idl. | expand

Checks

Context Check Description
ovsrobot/apply-robot success apply and check: success
ovsrobot/cirrus-robot fail cirrus build: failed
ovsrobot/github-robot-_Build_and_Test success github build: passed

Commit Message

Martin Morgenstern May 7, 2025, 1:41 p.m. UTC
Add timing based variants of ovsdb_idl_run() and ovsdb_idl_loop_run(),
which accept an additional 'deadline' parameter.

This parameter instructs the ovsdb-cs and jsonrpc layers below to
process messages as long as the deadline isn't reached, allowing clients
to process more OVSDB updates in one batch.

Signed-off-by: Martin Morgenstern <martin.morgenstern@cloudandheat.com>
---
 lib/ovsdb-idl.c | 24 ++++++++++++++++++++++--
 lib/ovsdb-idl.h |  3 +++
 2 files changed, 25 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
index 4c2a3e3aa..1d2d5f119 100644
--- a/lib/ovsdb-idl.c
+++ b/lib/ovsdb-idl.c
@@ -441,11 +441,21 @@  ovsdb_idl_clear(struct ovsdb_idl *db)
  * ovsdb_idl_get_seqno(). */
 void
 ovsdb_idl_run(struct ovsdb_idl *idl)
+{
+    ovsdb_idl_run_until(idl, 0);
+}
+
+void
+ovsdb_idl_run_until(struct ovsdb_idl *idl, long long deadline)
 {
     ovs_assert(!idl->txn);
 
     struct ovs_list events;
-    ovsdb_cs_run(idl->cs, &events);
+    if (deadline) {
+        ovsdb_cs_run_until(idl->cs, &events, deadline);
+    } else {
+        ovsdb_cs_run(idl->cs, &events);
+    }
 
     struct ovsdb_cs_event *event;
     LIST_FOR_EACH_POP (event, list_node, &events) {
@@ -4374,7 +4384,17 @@  ovsdb_idl_loop_destroy(struct ovsdb_idl_loop *loop)
 struct ovsdb_idl_txn *
 ovsdb_idl_loop_run(struct ovsdb_idl_loop *loop)
 {
-    ovsdb_idl_run(loop->idl);
+    return ovsdb_idl_loop_run_until(loop, 0);
+}
+
+struct ovsdb_idl_txn *
+ovsdb_idl_loop_run_until(struct ovsdb_idl_loop *loop, long long deadline)
+{
+    if (deadline) {
+        ovsdb_idl_run_until(loop->idl, deadline);
+    } else {
+        ovsdb_idl_run(loop->idl);
+    }
 
     /* See if the 'committing_txn' succeeded in the meantime. */
     if (loop->committing_txn && loop->committing_txn->status == TXN_SUCCESS) {
diff --git a/lib/ovsdb-idl.h b/lib/ovsdb-idl.h
index 86fd2bd36..be9bf146d 100644
--- a/lib/ovsdb-idl.h
+++ b/lib/ovsdb-idl.h
@@ -74,6 +74,7 @@  void ovsdb_idl_destroy(struct ovsdb_idl *);
 void ovsdb_idl_set_leader_only(struct ovsdb_idl *, bool leader_only);
 
 void ovsdb_idl_run(struct ovsdb_idl *);
+void ovsdb_idl_run_until(struct ovsdb_idl *, long long);
 void ovsdb_idl_wait(struct ovsdb_idl *);
 
 void ovsdb_idl_get_memory_usage(struct ovsdb_idl *, struct simap *usage);
@@ -409,6 +410,8 @@  struct ovsdb_idl_loop {
 
 void ovsdb_idl_loop_destroy(struct ovsdb_idl_loop *);
 struct ovsdb_idl_txn *ovsdb_idl_loop_run(struct ovsdb_idl_loop *);
+struct ovsdb_idl_txn *ovsdb_idl_loop_run_until(struct ovsdb_idl_loop *,
+                                               long long);
 int ovsdb_idl_loop_commit_and_wait(struct ovsdb_idl_loop *);
 
 /* Conditional Replication