To allow client to know when the conditional monitoring changes
has been accepted by the OVSDB server and the 'idl' contents has
been updated to match the new conditions.

Signed-off-by: Andy Zhou <az...@ovn.org>
---
 lib/ovsdb-idl.c    | 49 ++++++++++++++++++++++++++++++++++++++++++++++---
 lib/ovsdb-idl.h    |  7 ++++---
 tests/test-ovsdb.c |  7 ++++++-
 3 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/lib/ovsdb-idl.c b/lib/ovsdb-idl.c
index 341951d..090c04f 100644
--- a/lib/ovsdb-idl.c
+++ b/lib/ovsdb-idl.c
@@ -109,7 +109,13 @@ struct ovsdb_idl {
     /* Transaction support. */
     struct ovsdb_idl_txn *txn;
     struct hmap outstanding_txns;
+
+    /* Conditional monitoring. */
     bool cond_changed;
+    unsigned int cond_seqno;   /* Keep track of condition clauses changes
+                                  over a single conditional monitoring session.
+                                  Reverts to zero when idl session
+                                  reconnects.  */
 };
 
 struct ovsdb_idl_txn {
@@ -284,6 +290,7 @@ ovsdb_idl_create(const char *remote, const struct 
ovsdb_idl_class *class,
     }
 
     idl->cond_changed = false;
+    idl->cond_seqno = 0;
     idl->state_seqno = UINT_MAX;
     idl->request_id = NULL;
     idl->schema = NULL;
@@ -372,6 +379,7 @@ ovsdb_idl_clear(struct ovsdb_idl *idl)
     }
 
     idl->cond_changed = false;
+    idl->cond_seqno = 0;
     ovsdb_idl_track_clear(idl);
 
     if (changed) {
@@ -458,6 +466,7 @@ ovsdb_idl_run(struct ovsdb_idl *idl)
 
             case IDL_S_MONITORING_COND:
                 /* Conditional monitor clauses were updated. */
+                idl->cond_seqno++;
                 break;
 
             case IDL_S_MONITORING:
@@ -565,6 +574,26 @@ ovsdb_idl_get_seqno(const struct ovsdb_idl *idl)
     return idl->change_seqno;
 }
 
+/* Returns a "sequence number" that represents the number of conditional
+ * monitoring updates successfully received by the OVSDB server of an IDL
+ * connection.
+ *
+ * ovsdb_idl_set_condition() sets a new condition that is different from
+ * the current condtion, the next expected "sequence number" is returned.
+ *
+ * Whenever ovsdb_idl_get_cond_seqno() returns a value that matches
+ * the return value of ovsdb_idl_set_condition(),  The client is
+ * assured that:
+ *   -  The ovsdb_idl_set_condition() changes has been acknowledged by
+ *      theOVSDB sever
+ *
+ *    -'idl' now contains the content matches the new conditions.   */
+unsigned int
+ovsdb_idl_get_condition_seqno(const struct ovsdb_idl *idl)
+{
+    return idl->cond_seqno;
+}
+
 /* Returns true if 'idl' successfully connected to the remote database and
  * retrieved its contents (even if the connection subsequently dropped and is
  * in the process of reconnecting).  If so, then 'idl' contains an atomic
@@ -1045,9 +1074,20 @@ ovsdb_idl_condition_clone(struct ovsdb_idl_condition 
*dst,
     }
 }
 
-/* Sets the replication condition for 'tc' in 'idl' to 'condition' and arranges
- * to send the new condition to the database server. */
-void
+/* Sets the replication condition for 'tc' in 'idl' to 'condition' and
+ * arranges to send the new condition to the database server.
+ *
+ * Returns:
+ *
+ *  - UINT_MAX:  The new condition is the same as current condition.
+ *               No updates will be sent to the ovsdb-server.
+ *
+ *  - >0:        The next conditional update sequence number.
+ *               When this return value and ovsdb_idl_get_condition_seqno()
+ *               matchs, the 'idl' only contains rows that matches the
+ *               'condition'
+ */
+unsigned int
 ovsdb_idl_set_condition(struct ovsdb_idl *idl,
                         const struct ovsdb_idl_table_class *tc,
                         const struct ovsdb_idl_condition *condition)
@@ -1058,7 +1098,10 @@ ovsdb_idl_set_condition(struct ovsdb_idl *idl,
         ovsdb_idl_condition_clone(&table->condition, condition);
         idl->cond_changed = table->cond_changed = true;
         poll_immediate_wake();
+        return idl->cond_seqno + 1;
     }
+
+    return UINT_MAX;
 }
 
 static struct json *
diff --git a/lib/ovsdb-idl.h b/lib/ovsdb-idl.h
index f0326b4..743961b 100644
--- a/lib/ovsdb-idl.h
+++ b/lib/ovsdb-idl.h
@@ -349,8 +349,9 @@ void ovsdb_idl_condition_add_clause(struct 
ovsdb_idl_condition *,
 void ovsdb_idl_condition_add_clause_true(struct ovsdb_idl_condition *);
 bool ovsdb_idl_condition_is_true(const struct ovsdb_idl_condition *);
 
-void ovsdb_idl_set_condition(struct ovsdb_idl *,
-                             const struct ovsdb_idl_table_class *,
-                             const struct ovsdb_idl_condition *);
+unsigned int ovsdb_idl_set_condition(struct ovsdb_idl *,
+                                     const struct ovsdb_idl_table_class *,
+                                     const struct ovsdb_idl_condition *);
 
+unsigned int ovsdb_idl_get_condition_seqno(const struct ovsdb_idl *);
 #endif /* ovsdb-idl.h */
diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
index 968c1de..a21f54c 100644
--- a/tests/test-ovsdb.c
+++ b/tests/test-ovsdb.c
@@ -2282,7 +2282,12 @@ update_conditions(struct ovsdb_idl *idl, char *commands)
                 }
             }
         }
-        ovsdb_idl_set_condition(idl, tc, &cond);
+
+        uint64_t seqno;
+        seqno = ovsdb_idl_set_condition(idl, tc, &cond);
+        if (seqno == UINT_MAX) {
+            ovs_fatal(0, "condition unchanged");
+        }
         ovsdb_idl_condition_destroy(&cond);
         json_destroy(json);
     }
-- 
1.9.1

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to