Introduce en_route_exchange_status I-P node to store Last route_exchange netlink operation and immediately trigger en_route_exchange if netlink configuration fails.
Signed-off-by: Lorenzo Bianconi <[email protected]> --- controller/ovn-controller.c | 52 ++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c index 89207bb4b..7578c2b37 100644 --- a/controller/ovn-controller.c +++ b/controller/ovn-controller.c @@ -5288,6 +5288,18 @@ struct ed_type_route_exchange { struct ovsdb_idl *sb_idl; }; +/* Last route_exchange netlink operation. */ +static bool route_exchange_nl_status; + +static bool +route_exchange_status_run(void) +{ + if (route_exchange_nl_status) { + poll_immediate_wake(); + } + return route_exchange_nl_status; +} + static enum engine_node_state en_route_exchange_run(struct engine_node *node, void *data) { @@ -5323,7 +5335,7 @@ en_route_exchange_run(struct engine_node *node, void *data) hmap_init(&r_ctx_out.route_table_watches); - route_exchange_run(&r_ctx_in, &r_ctx_out); + route_exchange_nl_status = !!route_exchange_run(&r_ctx_in, &r_ctx_out); route_table_notify_update_watches(&r_ctx_out.route_table_watches); route_table_watch_request_cleanup(&r_ctx_out.route_table_watches); @@ -5383,6 +5395,38 @@ en_route_table_notify_cleanup(void *data OVS_UNUSED) { } +struct ed_type_route_exchange_status { + bool netlink_trigger_run; +}; + +static void * +en_route_exchange_status_init(struct engine_node *node OVS_UNUSED, + struct engine_arg *arg OVS_UNUSED) +{ + return xzalloc(sizeof(struct ed_type_route_exchange_status)); +} + +static enum engine_node_state +en_route_exchange_status_run(struct engine_node *node OVS_UNUSED, void *data) +{ + struct ed_type_route_exchange_status *res = data; + enum engine_node_state state; + + if (res->netlink_trigger_run) { + state = EN_UPDATED; + } else { + state = EN_UNCHANGED; + } + res->netlink_trigger_run = false; + + return state; +} + +static void +en_route_exchange_status_cleanup(void *data OVS_UNUSED) +{ +} + /* Returns false if the northd internal version stored in SB_Global * and ovn-controller internal version don't match. */ @@ -5690,6 +5734,7 @@ main(int argc, char *argv[]) ENGINE_NODE(route); ENGINE_NODE(route_table_notify); ENGINE_NODE(route_exchange); + ENGINE_NODE(route_exchange_status); #define SB_NODE(NAME) ENGINE_NODE_SB(NAME); SB_NODES @@ -5727,6 +5772,7 @@ main(int argc, char *argv[]) engine_add_input(&en_route_exchange, &en_sb_port_binding, engine_noop_handler); engine_add_input(&en_route_exchange, &en_route_table_notify, NULL); + engine_add_input(&en_route_exchange, &en_route_exchange_status, NULL); engine_add_input(&en_addr_sets, &en_sb_address_set, addr_sets_sb_address_set_handler); @@ -6258,6 +6304,10 @@ main(int argc, char *argv[]) engine_get_internal_data(&en_route_table_notify); rtn->changed = route_table_notify_run(); + struct ed_type_route_exchange_status *res = + engine_get_internal_data(&en_route_exchange_status); + res->netlink_trigger_run = route_exchange_status_run(); + stopwatch_start(CONTROLLER_LOOP_STOPWATCH_NAME, time_msec()); -- 2.49.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
