This is actually more in line with how the callback is used.  It's called
every the incremental engine preparese for the next engine run.

Signed-off-by: Dumitru Ceara <dce...@redhat.com>
---
 controller/ovn-controller.c |   41 ++++++++++++++++++++---------------------
 lib/inc-proc-eng.c          |   19 +++++++++++--------
 lib/inc-proc-eng.h          |   19 ++++++++++---------
 3 files changed, 41 insertions(+), 38 deletions(-)

diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c
index 18a01bbab..f26d6a9e0 100644
--- a/controller/ovn-controller.c
+++ b/controller/ovn-controller.c
@@ -1058,7 +1058,7 @@ en_ofctrl_is_connected_run(struct engine_node *node, void 
*data)
  *    processing to OVS_interface changes but simply mark the node status as
  *    UPDATED (and so the run() and the change handler is the same).
  * 2. The iface_table_external_ids_old is computed/updated in the member
- *    clear_tracked_data(), because that is when the last round of processing
+ *    init_run(), because that is when the last round of processing
  *    has completed but the new IDL data is yet to refresh, so we replace the
  *    old data with the current data. */
 struct ed_type_ovs_interface_shadow {
@@ -1096,7 +1096,8 @@ en_ovs_interface_shadow_cleanup(void *data_)
 }
 
 static void
-en_ovs_interface_shadow_clear_tracked_data(void *data_)
+en_ovs_interface_shadow_init_run(struct engine_node *node OVS_UNUSED,
+                                 void *data_)
 {
     struct ed_type_ovs_interface_shadow *data = data_;
     iface_table_external_ids_old_destroy(&data->iface_table_external_ids_old);
@@ -1163,7 +1164,7 @@ en_activated_ports_cleanup(void *data_)
 }
 
 static void
-en_activated_ports_clear_tracked_data(void *data)
+en_activated_ports_init_run(struct engine_node *node OVS_UNUSED, void *data)
 {
     en_activated_ports_cleanup(data);
 }
@@ -1311,7 +1312,7 @@ struct ed_type_runtime_data {
  */
 
 static void
-en_runtime_data_clear_tracked_data(void *data_)
+en_runtime_data_init_run(struct engine_node *node OVS_UNUSED, void *data_)
 {
     struct ed_type_runtime_data *data = data_;
 
@@ -1669,14 +1670,14 @@ en_addr_sets_init(struct engine_node *node OVS_UNUSED,
 }
 
 static void
-en_addr_sets_clear_tracked_data(void *data)
+en_addr_sets_init_run(struct engine_node *node OVS_UNUSED, void *data)
 {
     struct ed_type_addr_sets *as = data;
     sset_clear(&as->new);
     sset_clear(&as->deleted);
-    struct shash_node *node;
-    SHASH_FOR_EACH_SAFE (node, &as->updated) {
-        struct addr_set_diff *asd = node->data;
+    struct shash_node *as_node;
+    SHASH_FOR_EACH_SAFE (as_node, &as->updated) {
+        struct addr_set_diff *asd = as_node->data;
         expr_constant_set_destroy(asd->added);
         free(asd->added);
         expr_constant_set_destroy(asd->deleted);
@@ -1689,8 +1690,6 @@ en_addr_sets_clear_tracked_data(void *data)
 static void
 en_addr_sets_cleanup(void *data)
 {
-    en_addr_sets_clear_tracked_data(data);
-
     struct ed_type_addr_sets *as = data;
     expr_const_sets_destroy(&as->addr_sets);
     shash_destroy(&as->addr_sets);
@@ -1933,7 +1932,7 @@ port_groups_update(const struct sbrec_port_group_table 
*port_group_table,
 }
 
 static void
-en_port_groups_clear_tracked_data(void *data_)
+en_port_groups_init_run(struct engine_node *node OVS_UNUSED, void *data_)
 {
     struct ed_type_port_groups *pg = data_;
     sset_clear(&pg->new);
@@ -2078,7 +2077,7 @@ en_ct_zones_init(struct engine_node *node, struct 
engine_arg *arg OVS_UNUSED)
 }
 
 static void
-en_ct_zones_clear_tracked_data(void *data_)
+en_ct_zones_init_run(struct engine_node *node OVS_UNUSED, void *data_)
 {
     struct ed_type_ct_zones *data = data_;
     data->recomputed = false;
@@ -2529,7 +2528,7 @@ struct ed_type_lflow_output {
     struct conj_ids conj_ids;
 
     /* lflows processed in the current engine execution.
-     * Cleared by en_lflow_output_clear_tracked_data before each engine
+     * Cleared by en_lflow_output_init_run before each engine
      * execution. */
     struct hmap lflows_processed;
 
@@ -2733,7 +2732,7 @@ en_lflow_output_init(struct engine_node *node OVS_UNUSED,
 }
 
 static void
-en_lflow_output_clear_tracked_data(void *data)
+en_lflow_output_init_run(struct engine_node *node OVS_UNUSED, void *data)
 {
     struct ed_type_lflow_output *flow_output_data = data;
     lflows_processed_destroy(&flow_output_data->lflows_processed);
@@ -3678,20 +3677,20 @@ main(int argc, char *argv[])
 
     /* Define inc-proc-engine nodes. */
     ENGINE_NODE(sb_ro, "sb_ro");
-    ENGINE_NODE_WITH_CLEAR_TRACK_DATA_IS_VALID(ct_zones, "ct_zones");
-    ENGINE_NODE_WITH_CLEAR_TRACK_DATA(ovs_interface_shadow,
+    ENGINE_NODE_WITH_INIT_RUN_IS_VALID(ct_zones, "ct_zones");
+    ENGINE_NODE_WITH_INIT_RUN(ovs_interface_shadow,
                                       "ovs_interface_shadow");
-    ENGINE_NODE_WITH_CLEAR_TRACK_DATA(runtime_data, "runtime_data");
+    ENGINE_NODE_WITH_INIT_RUN(runtime_data, "runtime_data");
     ENGINE_NODE(non_vif_data, "non_vif_data");
     ENGINE_NODE(mff_ovn_geneve, "mff_ovn_geneve");
     ENGINE_NODE(ofctrl_is_connected, "ofctrl_is_connected");
-    ENGINE_NODE_WITH_CLEAR_TRACK_DATA(activated_ports, "activated_ports");
+    ENGINE_NODE_WITH_INIT_RUN(activated_ports, "activated_ports");
     ENGINE_NODE(postponed_ports, "postponed_ports");
     ENGINE_NODE(pflow_output, "physical_flow_output");
-    ENGINE_NODE_WITH_CLEAR_TRACK_DATA(lflow_output, "logical_flow_output");
+    ENGINE_NODE_WITH_INIT_RUN(lflow_output, "logical_flow_output");
     ENGINE_NODE(flow_output, "flow_output");
-    ENGINE_NODE_WITH_CLEAR_TRACK_DATA(addr_sets, "addr_sets");
-    ENGINE_NODE_WITH_CLEAR_TRACK_DATA(port_groups, "port_groups");
+    ENGINE_NODE_WITH_INIT_RUN(addr_sets, "addr_sets");
+    ENGINE_NODE_WITH_INIT_RUN(port_groups, "port_groups");
     ENGINE_NODE(northd_options, "northd_options");
 
 #define SB_NODE(NAME, NAME_STR) ENGINE_NODE_SB(NAME, NAME_STR);
diff --git a/lib/inc-proc-eng.c b/lib/inc-proc-eng.c
index 2e2b31033..30a20bb35 100644
--- a/lib/inc-proc-eng.c
+++ b/lib/inc-proc-eng.c
@@ -196,10 +196,12 @@ void
 engine_cleanup(void)
 {
     for (size_t i = 0; i < engine_n_nodes; i++) {
-        if (engine_nodes[i]->clear_tracked_data) {
-            engine_nodes[i]->clear_tracked_data(engine_nodes[i]->data);
+        if (engine_nodes[i]->init_run) {
+            engine_nodes[i]->init_run(engine_nodes[i], engine_nodes[i]->data);
         }
+    }
 
+    for (size_t i = 0; i < engine_n_nodes; i++) {
         if (engine_nodes[i]->cleanup) {
             engine_nodes[i]->cleanup(engine_nodes[i]->data);
         }
@@ -351,8 +353,8 @@ engine_init_run(void)
     for (size_t i = 0; i < engine_n_nodes; i++) {
         engine_set_node_state(engine_nodes[i], EN_STALE);
 
-        if (engine_nodes[i]->clear_tracked_data) {
-            engine_nodes[i]->clear_tracked_data(engine_nodes[i]->data);
+        if (engine_nodes[i]->init_run) {
+            engine_nodes[i]->init_run(engine_nodes[i], engine_nodes[i]->data);
         }
     }
 }
@@ -377,10 +379,11 @@ engine_recompute(struct engine_node *node, bool allowed,
         goto done;
     }
 
-    /* Clear tracked data before calling run() so that partially tracked data
-     * from some of the change handler executions are cleared. */
-    if (node->clear_tracked_data) {
-        node->clear_tracked_data(node->data);
+    /* Make sure data is properly initialized before calling run(), e.g.,
+     * partially tracked data some of the change handler executions must
+     * be cleared. */
+    if (node->init_run) {
+        node->init_run(node, node->data);
     }
 
     /* Run the node handler which might change state. */
diff --git a/lib/inc-proc-eng.h b/lib/inc-proc-eng.h
index dc365dc18..ab5b91b28 100644
--- a/lib/inc-proc-eng.h
+++ b/lib/inc-proc-eng.h
@@ -150,6 +150,11 @@ struct engine_node {
     /* Method to clean up data. It may be NULL. */
     void (*cleanup)(void *data);
 
+    /* Method to initialize state at every engine run.  It can be used for
+     * example to clear up tracked data maintained by the engine node in the
+     * engine 'data'. It may be NULL. */
+    void (*init_run)(struct engine_node *node, void *data);
+
     /* Fully processes all inputs of this node and regenerates the data
      * of this node. The pointer to the node's data is passed as argument.
      * 'run' handlers can also call engine_get_context() and the
@@ -165,10 +170,6 @@ struct engine_node {
      */
     bool (*is_valid)(struct engine_node *);
 
-    /* Method to clear up tracked data maintained by the engine node in the
-     * engine 'data'. It may be NULL. */
-    void (*clear_tracked_data)(void *tracked_data);
-
     /* Engine stats. */
     struct engine_stats stats;
 };
@@ -311,20 +312,20 @@ void engine_ovsdb_node_add_index(struct engine_node *, 
const char *name,
         .run = en_##NAME##_run, \
         .cleanup = en_##NAME##_cleanup, \
         .is_valid = NULL, \
-        .clear_tracked_data = NULL, \
+        .init_run = NULL, \
     };
 
-#define ENGINE_NODE_WITH_CLEAR_TRACK_DATA_IS_VALID(NAME, NAME_STR) \
+#define ENGINE_NODE_WITH_INIT_RUN_IS_VALID(NAME, NAME_STR) \
     ENGINE_NODE(NAME, NAME_STR) \
-    en_##NAME.clear_tracked_data = en_##NAME##_clear_tracked_data; \
+    en_##NAME.init_run = en_##NAME##_init_run; \
     en_##NAME.is_valid = en_##NAME##_is_valid;
 
 #define ENGINE_NODE(NAME, NAME_STR) \
     ENGINE_NODE_DEF(NAME, NAME_STR)
 
-#define ENGINE_NODE_WITH_CLEAR_TRACK_DATA(NAME, NAME_STR) \
+#define ENGINE_NODE_WITH_INIT_RUN(NAME, NAME_STR) \
     ENGINE_NODE(NAME, NAME_STR) \
-    en_##NAME.clear_tracked_data = en_##NAME##_clear_tracked_data;
+    en_##NAME.init_run = en_##NAME##_init_run;
 
 /* Macro to define member functions of an engine node which represents
  * a table of OVSDB */

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

Reply via email to