Skip to content

Commit

Permalink
ovsdb-idl: Return correct seqno from ovsdb_idl_db_set_condition().
Browse files Browse the repository at this point in the history
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: 46437c5 ("ovsdb-idl: Enhance conditional monitoring API")
Signed-off-by: Dumitru Ceara <[email protected]>
Signed-off-by: Ilya Maximets <[email protected]>
  • Loading branch information
dceara authored and igsilya committed Nov 16, 2020
1 parent 12eb2f6 commit 17f22fe
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 3 deletions.
9 changes: 6 additions & 3 deletions lib/ovsdb-idl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -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
Expand Down
4 changes: 4 additions & 0 deletions tests/test-ovsdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -2407,6 +2407,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);
}
Expand Down

0 comments on commit 17f22fe

Please sign in to comment.