If an IDL client sets the same monitor condition twice, the expected
seqno when the IDL contents are updated should be the same for both
calls.
In the following scenario:
1. Client calls ovsdb_idl_db_set_condition(db, table, cond1)
2. ovsdb_idl sends monitor_cond_change(cond1) but the server doesn't yet
reply.
3. Client calls ovsdb_idl_db_set_condition(db, table, cond1)
At step 3 the returned expected seqno should be the same as at step 1.
Similarly, if step 2 is skipped, i.e., the client calls sets
the condition twice in the same iteration, then both
ovsdb_idl_db_set_condition() calls should return the same value.
Fixes: 46437c5232bd ("ovsdb-idl: Enhance conditional monitoring API")
Signed-off-by: Dumitru Ceara <[email protected]>
---
lib/ovsdb-idl.c | 9 ++++++---
tests/test-ovsdb.c | 4 ++++
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
index fdb9d85..d1fa6ab 100644
--- a/lib/ovsdb-idl.c
+++ b/lib/ovsdb-idl.c
@@ -1564,7 +1564,6 @@ ovsdb_idl_db_set_condition(struct ovsdb_idl_db *db,
{
struct ovsdb_idl_condition *table_cond;
struct ovsdb_idl_table *table = ovsdb_idl_db_table_from_class(db, tc);
- unsigned int seqno = db->cond_seqno;
/* Compare the new condition to the last known condition which can be
* either "new" (not sent yet), "requested" or "acked", in this order.
@@ -1582,10 +1581,14 @@ ovsdb_idl_db_set_condition(struct ovsdb_idl_db *db,
ovsdb_idl_condition_clone(&table->new_cond, condition);
db->cond_changed = true;
poll_immediate_wake();
- return seqno + 1;
+ return db->cond_seqno + 1;
+ } else if (table_cond != table->ack_cond) {
+ /* 'condition' was already set but has not been "acked" yet. The IDL
+ * will be up to date when db->cond_seqno gets incremented. */
+ return db->cond_seqno + 1;
}
- return seqno;
+ return db->cond_seqno;
}
/* Sets the replication condition for 'tc' in 'idl' to 'condition' and
diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
index b1a4be3..bb9deba 100644
--- a/tests/test-ovsdb.c
+++ b/tests/test-ovsdb.c
@@ -2391,6 +2391,10 @@ update_conditions(struct ovsdb_idl *idl, char *commands)
if (seqno == next_seqno ) {
ovs_fatal(0, "condition unchanged");
}
+ unsigned int new_next_seqno = ovsdb_idl_set_condition(idl, tc, &cond);
+ if (next_seqno != new_next_seqno) {
+ ovs_fatal(0, "condition expected seqno changed");
+ }
ovsdb_idl_condition_destroy(&cond);
json_destroy(json);
}
--
1.8.3.1
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev