[ovs-dev] [PATCH monitor_cond V5 01/18] ovsdb: create column index mapping between ovsdb row to monitor row

Liran Schour lirans at il.ibm.com
Fri Mar 4 08:08:56 UTC 2016


Columns indexing is different in ovsdb_row then in ovsdb_monitor_row.
We need mapping between the 2 for condition evaluation.

signed-off-by: Liran Schour <lirans at il.ibm.com>

---
v2->v3:
* Describe columns_index_map in comment
* Init columns_index_map with invalid value (-1)
---
 ovsdb/monitor.c | 29 +++++++++++++++++++++++++++--
 1 file changed, 27 insertions(+), 2 deletions(-)

diff --git a/ovsdb/monitor.c b/ovsdb/monitor.c
index 0d81d89..2645301 100644
--- a/ovsdb/monitor.c
+++ b/ovsdb/monitor.c
@@ -116,6 +116,11 @@ struct ovsdb_monitor_table {
     struct ovsdb_monitor_column *columns;
     size_t n_columns;
 
+    /* Columns in ovsdb_monitor_row have different indexes then in
+     * ovsdb_row. This field maps between column->index to the index in the
+     * ovsdb_monitor_row. It is used for condition evaluation */
+    unsigned int *columns_index_map;
+
     /* Contains 'ovsdb_monitor_changes' indexed by 'transaction'. */
     struct hmap changes;
 };
@@ -305,6 +310,19 @@ ovsdb_monitor_row_destroy(const struct ovsdb_monitor_table *mt,
     }
 }
 
+static void
+ovsdb_monitor_table_columns_sort(const struct ovsdb_monitor_table *mt)
+{
+    int i;
+
+    qsort(mt->columns, mt->n_columns, sizeof *mt->columns,
+          compare_ovsdb_monitor_column);
+    for (i = 1; i < mt->n_columns; i++) {
+        /* re-set index map due to sort */
+        mt->columns_index_map[mt->columns[i].column->index] = i;
+    }
+}
+
 void
 ovsdb_monitor_add_jsonrpc_monitor(struct ovsdb_monitor *dbmon,
                                   struct ovsdb_jsonrpc_monitor *jsonrpc_monitor)
@@ -342,11 +360,17 @@ ovsdb_monitor_add_table(struct ovsdb_monitor *m,
                         const struct ovsdb_table *table)
 {
     struct ovsdb_monitor_table *mt;
+    int i;
 
     mt = xzalloc(sizeof *mt);
     mt->table = table;
     shash_add(&m->tables, table->schema->name, mt);
     hmap_init(&mt->changes);
+    mt->columns_index_map =
+        xmalloc(sizeof(unsigned int) * shash_count(&table->schema->columns));
+    for (i = 0; i < shash_count(&table->schema->columns); i++) {
+        mt->columns_index_map[i] = -1;
+    }
 }
 
 void
@@ -367,6 +391,7 @@ ovsdb_monitor_add_column(struct ovsdb_monitor *dbmon,
     }
 
     mt->select |= select;
+    mt->columns_index_map[column->index] = mt->n_columns;
     c = &mt->columns[mt->n_columns++];
     c->column = column;
     c->select = select;
@@ -386,8 +411,7 @@ ovsdb_monitor_table_check_duplicates(struct ovsdb_monitor *m,
 
     if (mt) {
         /* Check for duplicate columns. */
-        qsort(mt->columns, mt->n_columns, sizeof *mt->columns,
-              compare_ovsdb_monitor_column);
+        ovsdb_monitor_table_columns_sort(mt);
         for (i = 1; i < mt->n_columns; i++) {
             if (mt->columns[i].column == mt->columns[i - 1].column) {
                 return mt->columns[i].column->name;
@@ -1106,6 +1130,7 @@ ovsdb_monitor_destroy(struct ovsdb_monitor *dbmon)
         }
         hmap_destroy(&mt->changes);
         free(mt->columns);
+        free(mt->columns_index_map);
         free(mt);
     }
     shash_destroy(&dbmon->tables);
-- 
2.1.4





More information about the dev mailing list