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(). In order to fix this we now also call ovsdb_idl_condition_clear() for each table condition in ovsdb_idl_db_clear(). This ensures that resetting the condition to the same value as before the "monitor_cond_since" reply will trigger a new request. One way to replicate the issue is described in the bugzilla reporting the bug, when ovn-controller is configured to use "ovn-monitor-all": https://bugzilla.redhat.com/show_bug.cgi?id=1808125#c6 Reported-by: Dan Williams <[email protected]> Reported-at: https://bugzilla.redhat.com/1808125 CC: Andy Zhou <[email protected]> Fixes: 5351980b047f ("ovsdb-idl: Avoid sending redundant conditional monitoring updates") Signed-off-by: Dumitru Ceara <[email protected]> --- v2: - Updated commit log so that the "Fixes:" tag reflects the correct commit that introduced the issue. --- lib/ovsdb-idl.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c index 190143f..64721ca 100644 --- a/lib/ovsdb-idl.c +++ b/lib/ovsdb-idl.c @@ -610,7 +610,11 @@ 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 (table->cond_changed) { + table->cond_changed = false; + ovsdb_idl_condition_clear(&table->condition); + } + if (hmap_is_empty(&table->rows)) { continue; } -- 1.8.3.1 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
