When external-ids:ovn-monitor-all is set to true, patch ports for non-local datapaths may be created, which is unnecessary and confusing. This patch avoids that by checking if a localnet port belongs to local datapaths before creating the patch port. It also moves patch_run() in mainloop after engine_run(), so that local_datapaths already reflects the up-to-date situation when patch_run() is called.
Reported-by: Girish Moodalbail <[email protected]> Signed-off-by: Han Zhou <[email protected]> --- controller/ovn-controller.c | 12 ++++++------ controller/patch.c | 16 +++++++++++++--- controller/patch.h | 3 ++- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/controller/ovn-controller.c b/controller/ovn-controller.c index 4d245ca..d8e2a0e 100644 --- a/controller/ovn-controller.c +++ b/controller/ovn-controller.c @@ -2011,12 +2011,6 @@ main(int argc, char *argv[]) } if (chassis) { - patch_run(ovs_idl_txn, - ovsrec_bridge_table_get(ovs_idl_loop.idl), - ovsrec_open_vswitch_table_get(ovs_idl_loop.idl), - ovsrec_port_table_get(ovs_idl_loop.idl), - sbrec_port_binding_table_get(ovnsb_idl_loop.idl), - br_int, chassis); encaps_run(ovs_idl_txn, bridge_table, br_int, sbrec_chassis_table_get(ovnsb_idl_loop.idl), @@ -2079,6 +2073,12 @@ main(int argc, char *argv[]) } runtime_data = engine_get_data(&en_runtime_data); if (runtime_data) { + patch_run(ovs_idl_txn, + ovsrec_bridge_table_get(ovs_idl_loop.idl), + ovsrec_open_vswitch_table_get(ovs_idl_loop.idl), + ovsrec_port_table_get(ovs_idl_loop.idl), + sbrec_port_binding_table_get(ovnsb_idl_loop.idl), + br_int, chassis, &runtime_data->local_datapaths); pinctrl_run(ovnsb_idl_txn, sbrec_datapath_binding_by_key, sbrec_port_binding_by_datapath, diff --git a/controller/patch.c b/controller/patch.c index f2053de..349faae 100644 --- a/controller/patch.c +++ b/controller/patch.c @@ -181,7 +181,8 @@ add_bridge_mappings(struct ovsdb_idl_txn *ovs_idl_txn, const struct sbrec_port_binding_table *port_binding_table, const struct ovsrec_bridge *br_int, struct shash *existing_ports, - const struct sbrec_chassis *chassis) + const struct sbrec_chassis *chassis, + const struct hmap *local_datapaths) { /* Get ovn-bridge-mappings. */ struct shash bridge_mappings = SHASH_INITIALIZER(&bridge_mappings); @@ -190,6 +191,13 @@ add_bridge_mappings(struct ovsdb_idl_txn *ovs_idl_txn, const struct sbrec_port_binding *binding; SBREC_PORT_BINDING_TABLE_FOR_EACH (binding, port_binding_table) { + /* When ovn-monitor-all is true, there can be port-bindings + * on datapaths that are not related to this chassis. Ignore them. */ + if (!get_local_datapath(local_datapaths, + binding->datapath->tunnel_key)) { + continue; + } + const char *patch_port_id; if (!strcmp(binding->type, "localnet")) { patch_port_id = "ovn-localnet-port"; @@ -242,7 +250,8 @@ patch_run(struct ovsdb_idl_txn *ovs_idl_txn, const struct ovsrec_port_table *port_table, const struct sbrec_port_binding_table *port_binding_table, const struct ovsrec_bridge *br_int, - const struct sbrec_chassis *chassis) + const struct sbrec_chassis *chassis, + const struct hmap *local_datapaths) { if (!ovs_idl_txn) { return; @@ -269,7 +278,8 @@ patch_run(struct ovsdb_idl_txn *ovs_idl_txn, * 'existing_ports' any patch ports that do exist in the database and * should be there. */ add_bridge_mappings(ovs_idl_txn, bridge_table, ovs_table, - port_binding_table, br_int, &existing_ports, chassis); + port_binding_table, br_int, &existing_ports, chassis, + local_datapaths); /* Now 'existing_ports' only still contains patch ports that exist in the * database but shouldn't. Delete them from the database. */ diff --git a/controller/patch.h b/controller/patch.h index 49b0b2e..81a43bc 100644 --- a/controller/patch.h +++ b/controller/patch.h @@ -41,6 +41,7 @@ void patch_run(struct ovsdb_idl_txn *ovs_idl_txn, const struct ovsrec_port_table *, const struct sbrec_port_binding_table *, const struct ovsrec_bridge *br_int, - const struct sbrec_chassis *); + const struct sbrec_chassis *, + const struct hmap *local_datapaths); #endif /* controller/patch.h */ -- 2.1.0 _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
