[ovs-dev] [PATCH monitor_cond 06/12] ovsdb: add API for changing monitor session's conditions

Liran Schour lirans at il.ibm.com
Tue Jan 5 13:13:59 UTC 2016


That will be used to by jsonrpc-server for monitor_cond_change
method See ovsdb-server (1) man page.

Signed-off-by: Liran Schour <lirans at il.ibm.com>
---
 ovsdb/monitor.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 ovsdb/monitor.h |  7 +++++++
 2 files changed, 58 insertions(+), 1 deletion(-)

diff --git a/ovsdb/monitor.c b/ovsdb/monitor.c
index 5e3117a..cf87b98 100644
--- a/ovsdb/monitor.c
+++ b/ovsdb/monitor.c
@@ -591,6 +591,50 @@ ovsdb_monitor_table_condition_add(
     return NULL;
 }
 
+struct ovsdb_error *
+ovsdb_monitor_table_condition_change(
+                            struct ovsdb_monitor_session_condition *condition,
+                            const struct ovsdb_table *table,
+                            const struct json *added,
+                            const struct json *removed)
+{
+    struct ovsdb_monitor_table_condition *mtc =
+        shash_find_data(&condition->tables, table->schema->name);
+    struct ovsdb_condition added_cnd = OVSDB_CONDITION_INITIALIZER;
+    struct ovsdb_condition removed_cnd = OVSDB_CONDITION_INITIALIZER;
+    struct ovsdb_error *error;
+
+    if (added) {
+        error = ovsdb_condition_from_json(table->schema, added,
+                                          NULL, &added_cnd);
+        if (error) {
+            return error;
+        }
+    }
+    if (removed) {
+        error = ovsdb_condition_from_json(table->schema, removed,
+                                          NULL, &removed_cnd);
+        if (error) {
+            return error;
+        }
+    }
+    if (!ovsdb_conditions_includes(&mtc->new_condition,
+                                   &added_cnd, &removed_cnd)) {
+        return ovsdb_syntax_error(
+                             removed, NULL,
+                             "conditions does not include removed");
+    }
+
+    ovsdb_condition_add(&mtc->new_condition, &added_cnd);
+    ovsdb_condition_remove(&mtc->new_condition, &removed_cnd);
+
+    if (!ovsdb_condition_empty(&mtc->new_condition)) {
+        condition->can_cache = false;
+    }
+
+    return NULL;
+}
+
 /* Set session's condition in this ovsdb_monitor */
 static void
 ovsdb_monitor_set_condition(
@@ -764,7 +808,7 @@ ovsdb_monitor_compose_row_update(
  * for 'row' within * 'mt', or NULL if no row update should be sent.
  *
  * The caller should specify 'initial' as true if the returned JSON is
- * going to be used as part of the initial reply to a "monitor2" request,
+ * going to be used as part of the initial reply to a "monitor_cond" request,
  * false if it is going to be used as part of an "update2" notification.
  *
  * 'changed' must be a scratch buffer for internal use that is at least
@@ -948,6 +992,12 @@ ovsdb_monitor_get_update(
 
         ovsdb_monitor_table_untrack_changes(mt, prev_txn);
         ovsdb_monitor_table_track_changes(mt, next_txn);
+
+        if (dbmon->condition && ovsdb_condition_cmp(mt->old_condition,
+                                                    mt->new_condition)) {
+            ovsdb_condition_destroy(mt->old_condition);
+            ovsdb_condition_clone(mt->old_condition, mt->new_condition);
+        }
     }
     *unflushed = next_txn;
     ovsdb_monitor_unset_condition(dbmon);
diff --git a/ovsdb/monitor.h b/ovsdb/monitor.h
index d4063f7..0f6c360 100644
--- a/ovsdb/monitor.h
+++ b/ovsdb/monitor.h
@@ -106,4 +106,11 @@ void ovsdb_monitor_session_condition_bind(
                            const struct ovsdb_monitor_session_condition *,
                            const struct ovsdb_monitor *);
 
+struct ovsdb_error *
+ovsdb_monitor_table_condition_change(
+                           struct ovsdb_monitor_session_condition *condition,
+                           const struct ovsdb_table *table,
+                           const struct json *added,
+                           const struct json *removed);
+
 #endif
-- 
2.1.4





More information about the dev mailing list