[ovs-dev] [PATCH v3] Revert "ovsdb-idl: Avoid sending redundant conditional monitoring updates"

Dumitru Ceara dceara at redhat.com
Wed Mar 25 20:15:23 UTC 2020

This reverts commit 5351980b047f4dd40be7a59a1e4b910df21eca0a.

If the ovsdb-server reply to "monitor_cond_since" requests has
"found" == false then ovsdb_idl_db_parse_monitor_reply() calls
ovsdb_idl_db_clear() which iterates through all tables and
unconditionally sets table->cond_changed to false.

However, if the client had already set a new condition for some of the
tables, this new condition request will never be sent to ovsdb-server
until the condition is reset to a different value. This is due to the
check in ovsdb_idl_db_set_condition().

One way to replicate the issue is described in the bugzilla reporting
the bug, when ovn-controller is configured to use "ovn-monitor-all":

Commit 5351980b047f tried to optimize sending redundant conditional
monitoring updates but the chances that this scenario happens with the
latest code is quite low since commit 403a6a0cb003 ("ovsdb-idl: Fast
resync from server when connection reset.") changed the behavior of
ovsdb_idl_db_parse_monitor_reply() to avoid calling ovsdb_idl_db_clear()
in most cases.

Reported-by: Dan Williams <dcbw at redhat.com>
Reported-at: https://bugzilla.redhat.com/1808125
CC: Andy Zhou <azhou at ovn.org>
Fixes: 5351980b047f ("ovsdb-idl: Avoid sending redundant conditional monitoring updates")
Signed-off-by: Dumitru Ceara <dceara at redhat.com>

- Changed commit summary from "ovsdb-idl.c: Clear conditions when
  clearing IDL.". Also updated the commit description.
- Instead of clearing IDL conditions, revert 5351980b047f as suggested
  by Ilya when reviewing v2:
- Updated commit log so that the "Fixes:" tag reflects the correct
  commit that introduced the issue.
 lib/ovsdb-idl.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
index 190143f..1535ad7 100644
--- a/lib/ovsdb-idl.c
+++ b/lib/ovsdb-idl.c
@@ -610,7 +610,6 @@ ovsdb_idl_db_clear(struct ovsdb_idl_db *db)
         struct ovsdb_idl_table *table = &db->tables[i];
         struct ovsdb_idl_row *row, *next_row;
-        table->cond_changed = false;
         if (hmap_is_empty(&table->rows)) {
@@ -634,7 +633,6 @@ ovsdb_idl_db_clear(struct ovsdb_idl_db *db)
-    db->cond_changed = false;
     db->cond_seqno = 0;

More information about the dev mailing list