Currently northd incremental processing fails when logical switches are added/removed. The I-P node dependency is:
NB.Logical_Switch -> en_northd -> en_lflow
When a new switch is created/deleted the "en_northd" input handler for logical switches is called:
bool northd_handle_ls_changes(struct ovsdb_idl_txn *ovnsb_idl_txn, const struct northd_input *ni, struct northd_data *nd) { const struct nbrec_logical_switch *changed_ls; struct northd_tracked_data *trk_data = &nd->trk_data; NBREC_LOGICAL_SWITCH_TABLE_FOR_EACH_TRACKED (changed_ls, ni->nbrec_logical_switch_table) { if (nbrec_logical_switch_is_new(changed_ls) || nbrec_logical_switch_is_deleted(changed_ls)) { goto fail; } ... fail: destroy_northd_data_tracked_changes(nd); return false; }
which in turn causes "en_lflow" handler for en_northd data changes to fail:
bool lflow_northd_handler(struct engine_node *node, void *data) { struct northd_data *northd_data = engine_get_input_data("northd", node); if (!northd_has_tracked_data(&northd_data->trk_data)) { return false; } ...
This triggers a full recompute of the "en_lflow" node which can be costly at scale.