Skip to content

Commit

Permalink
ovsdb-idl.c: Clear conditions when clearing IDL.
Browse files Browse the repository at this point in the history
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 <dcbw@redhat.com>
Reported-at: https://bugzilla.redhat.com/1808125
CC: Han Zhou <hzhou@ovn.org>
Fixes: 403a6a0 ("ovsdb-idl: Fast resync from server when connection reset.")
Signed-off-by: Dumitru Ceara <dceara@redhat.com>
Signed-off-by: 0-day Robot <robot@bytheb.org>
  • Loading branch information
dceara authored and ovsrobot committed Feb 29, 2020
1 parent bae24b4 commit 133591e
Showing 1 changed file with 5 additions and 1 deletion.
6 changes: 5 additions & 1 deletion lib/ovsdb-idl.c
Expand Up @@ -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;
}
Expand Down

0 comments on commit 133591e

Please sign in to comment.