On Tue, 15 Aug, 2023, 2:09 pm Dumitru Ceara, <dce...@redhat.com> wrote:
> On 8/14/23 11:07, num...@ovn.org wrote: > > From: Numan Siddique <num...@ovn.org> > > > > When changes to port bindings corresponding to router ports are > > handled by northd engine node, incorrect warning logs (like below) > > are logged. > > > > ---- > > northd|WARN|A port-binding for lrp0 is created but the LSP is not found. > > ---- > > > > Fix these warnings. > > > > Since we are preserving the "lr_ports" data in the northd engine > > across engine runs, it is important to store the port binding > > address in 'op->sb' after the transaction is committed. And this > > patch does that. > > > > Fixes: 3b120ccf7f7c ("northd: Incremental processing of SB port_binding > in "northd" node.") > > > > CC: Han Zhou <hz...@ovn.org> > > Signed-off-by: Numan Siddique <num...@ovn.org> > > --- > > Hi Numan, > > This change seems to break IPv6 prefix delegation (the ovsrobot CI run > failed when running system tests): > > https://github.com/ovsrobot/ovn/actions/runs/5854010538 > > I guess we somehow miss updating the LSP when the port binding update is > handled by I-P handlers but I didn't check closely. > Hi Dumitru, Thanks. I thought I fixed that issue. I'll update v2 fixing that. Numan Regards, > Dumitru > > > controller/binding.c | 75 -------------------------------- > > controller/binding.h | 20 +-------- > > lib/ovn-util.c | 101 +++++++++++++++++++++++++++++++++++++++++++ > > lib/ovn-util.h | 21 +++++++++ > > northd/en-northd.c | 2 +- > > northd/northd.c | 19 ++++++-- > > northd/northd.h | 3 +- > > 7 files changed, 141 insertions(+), 100 deletions(-) > > > > diff --git a/controller/binding.c b/controller/binding.c > > index 3ac0c35df3..a521f2828e 100644 > > --- a/controller/binding.c > > +++ b/controller/binding.c > > @@ -756,7 +756,6 @@ static void binding_lport_clear_port_sec(struct > binding_lport *); > > static bool binding_lport_update_port_sec( > > struct binding_lport *, const struct sbrec_port_binding *); > > > > -static char *get_lport_type_str(enum en_lport_type lport_type); > > static bool ovs_iface_matches_lport_iface_id_ver( > > const struct ovsrec_interface *, > > const struct sbrec_port_binding *); > > @@ -1055,80 +1054,6 @@ binding_dump_local_bindings(struct > local_binding_data *lbinding_data, > > free(nodes); > > } > > > > -static bool > > -is_lport_vif(const struct sbrec_port_binding *pb) > > -{ > > - return !pb->type[0]; > > -} > > - > > -enum en_lport_type > > -get_lport_type(const struct sbrec_port_binding *pb) > > -{ > > - if (is_lport_vif(pb)) { > > - if (pb->parent_port && pb->parent_port[0]) { > > - return LP_CONTAINER; > > - } > > - return LP_VIF; > > - } else if (!strcmp(pb->type, "patch")) { > > - return LP_PATCH; > > - } else if (!strcmp(pb->type, "chassisredirect")) { > > - return LP_CHASSISREDIRECT; > > - } else if (!strcmp(pb->type, "l3gateway")) { > > - return LP_L3GATEWAY; > > - } else if (!strcmp(pb->type, "localnet")) { > > - return LP_LOCALNET; > > - } else if (!strcmp(pb->type, "localport")) { > > - return LP_LOCALPORT; > > - } else if (!strcmp(pb->type, "l2gateway")) { > > - return LP_L2GATEWAY; > > - } else if (!strcmp(pb->type, "virtual")) { > > - return LP_VIRTUAL; > > - } else if (!strcmp(pb->type, "external")) { > > - return LP_EXTERNAL; > > - } else if (!strcmp(pb->type, "remote")) { > > - return LP_REMOTE; > > - } else if (!strcmp(pb->type, "vtep")) { > > - return LP_VTEP; > > - } > > - > > - return LP_UNKNOWN; > > -} > > - > > -static char * > > -get_lport_type_str(enum en_lport_type lport_type) > > -{ > > - switch (lport_type) { > > - case LP_VIF: > > - return "VIF"; > > - case LP_CONTAINER: > > - return "CONTAINER"; > > - case LP_VIRTUAL: > > - return "VIRTUAL"; > > - case LP_PATCH: > > - return "PATCH"; > > - case LP_CHASSISREDIRECT: > > - return "CHASSISREDIRECT"; > > - case LP_L3GATEWAY: > > - return "L3GATEWAY"; > > - case LP_LOCALNET: > > - return "PATCH"; > > - case LP_LOCALPORT: > > - return "LOCALPORT"; > > - case LP_L2GATEWAY: > > - return "L2GATEWAY"; > > - case LP_EXTERNAL: > > - return "EXTERNAL"; > > - case LP_REMOTE: > > - return "REMOTE"; > > - case LP_VTEP: > > - return "VTEP"; > > - case LP_UNKNOWN: > > - return "UNKNOWN"; > > - } > > - > > - OVS_NOT_REACHED(); > > -} > > - > > void > > set_pb_chassis_in_sbrec(const struct sbrec_port_binding *pb, > > const struct sbrec_chassis *chassis_rec, > > diff --git a/controller/binding.h b/controller/binding.h > > index 235e5860d0..24bc840791 100644 > > --- a/controller/binding.h > > +++ b/controller/binding.h > > @@ -22,6 +22,7 @@ > > #include "openvswitch/hmap.h" > > #include "openvswitch/uuid.h" > > #include "openvswitch/list.h" > > +# include "lib/ovn-util.h" > > #include "sset.h" > > #include "lport.h" > > > > @@ -217,25 +218,6 @@ void port_binding_set_down(const struct > sbrec_chassis *chassis_rec, > > const char *iface_id, > > const struct uuid *pb_uuid); > > > > -/* Corresponds to each Port_Binding.type. */ > > -enum en_lport_type { > > - LP_UNKNOWN, > > - LP_VIF, > > - LP_CONTAINER, > > - LP_PATCH, > > - LP_L3GATEWAY, > > - LP_LOCALNET, > > - LP_LOCALPORT, > > - LP_L2GATEWAY, > > - LP_VTEP, > > - LP_CHASSISREDIRECT, > > - LP_VIRTUAL, > > - LP_EXTERNAL, > > - LP_REMOTE > > -}; > > - > > -enum en_lport_type get_lport_type(const struct sbrec_port_binding *); > > - > > /* This structure represents a logical port (or port binding) > > * which is associated with 'struct local_binding'. > > * > > diff --git a/lib/ovn-util.c b/lib/ovn-util.c > > index 080ad4c0ce..3a237b7fe3 100644 > > --- a/lib/ovn-util.c > > +++ b/lib/ovn-util.c > > @@ -1168,3 +1168,104 @@ encode_fqdn_string(const char *fqdn, size_t *len) > > > > return encoded; > > } > > + > > +static bool > > +is_lport_vif(const struct sbrec_port_binding *pb) > > +{ > > + return !pb->type[0]; > > +} > > + > > +enum en_lport_type > > +get_lport_type(const struct sbrec_port_binding *pb) > > +{ > > + if (is_lport_vif(pb)) { > > + if (pb->parent_port && pb->parent_port[0]) { > > + return LP_CONTAINER; > > + } > > + return LP_VIF; > > + } else if (!strcmp(pb->type, "patch")) { > > + return LP_PATCH; > > + } else if (!strcmp(pb->type, "chassisredirect")) { > > + return LP_CHASSISREDIRECT; > > + } else if (!strcmp(pb->type, "l3gateway")) { > > + return LP_L3GATEWAY; > > + } else if (!strcmp(pb->type, "localnet")) { > > + return LP_LOCALNET; > > + } else if (!strcmp(pb->type, "localport")) { > > + return LP_LOCALPORT; > > + } else if (!strcmp(pb->type, "l2gateway")) { > > + return LP_L2GATEWAY; > > + } else if (!strcmp(pb->type, "virtual")) { > > + return LP_VIRTUAL; > > + } else if (!strcmp(pb->type, "external")) { > > + return LP_EXTERNAL; > > + } else if (!strcmp(pb->type, "remote")) { > > + return LP_REMOTE; > > + } else if (!strcmp(pb->type, "vtep")) { > > + return LP_VTEP; > > + } > > + > > + return LP_UNKNOWN; > > +} > > + > > +char * > > +get_lport_type_str(enum en_lport_type lport_type) > > +{ > > + switch (lport_type) { > > + case LP_VIF: > > + return "VIF"; > > + case LP_CONTAINER: > > + return "CONTAINER"; > > + case LP_VIRTUAL: > > + return "VIRTUAL"; > > + case LP_PATCH: > > + return "PATCH"; > > + case LP_CHASSISREDIRECT: > > + return "CHASSISREDIRECT"; > > + case LP_L3GATEWAY: > > + return "L3GATEWAY"; > > + case LP_LOCALNET: > > + return "LOCALNET"; > > + case LP_LOCALPORT: > > + return "LOCALPORT"; > > + case LP_L2GATEWAY: > > + return "L2GATEWAY"; > > + case LP_EXTERNAL: > > + return "EXTERNAL"; > > + case LP_REMOTE: > > + return "REMOTE"; > > + case LP_VTEP: > > + return "VTEP"; > > + case LP_UNKNOWN: > > + return "UNKNOWN"; > > + } > > + > > + OVS_NOT_REACHED(); > > +} > > + > > +bool > > +is_pb_router_type(const struct sbrec_port_binding *pb) > > +{ > > + enum en_lport_type lport_type = get_lport_type(pb); > > + > > + switch (lport_type) { > > + case LP_PATCH: > > + case LP_CHASSISREDIRECT: > > + case LP_L3GATEWAY: > > + case LP_L2GATEWAY: > > + return true; > > + > > + case LP_VIF: > > + case LP_CONTAINER: > > + case LP_VIRTUAL: > > + case LP_LOCALNET: > > + case LP_LOCALPORT: > > + case LP_REMOTE: > > + case LP_VTEP: > > + case LP_EXTERNAL: > > + case LP_UNKNOWN: > > + return false; > > + } > > + > > + return false; > > +} > > diff --git a/lib/ovn-util.h b/lib/ovn-util.h > > index 5ebdd8adb0..b056a6c0ed 100644 > > --- a/lib/ovn-util.h > > +++ b/lib/ovn-util.h > > @@ -409,4 +409,25 @@ void flow_collector_ids_clear(struct > flow_collector_ids *); > > * The returned pointer has to be freed by caller. */ > > char *encode_fqdn_string(const char *fqdn, size_t *len); > > > > +/* Corresponds to each Port_Binding.type. */ > > +enum en_lport_type { > > + LP_UNKNOWN, > > + LP_VIF, > > + LP_CONTAINER, > > + LP_PATCH, > > + LP_L3GATEWAY, > > + LP_LOCALNET, > > + LP_LOCALPORT, > > + LP_L2GATEWAY, > > + LP_VTEP, > > + LP_CHASSISREDIRECT, > > + LP_VIRTUAL, > > + LP_EXTERNAL, > > + LP_REMOTE > > +}; > > + > > +enum en_lport_type get_lport_type(const struct sbrec_port_binding *); > > +char *get_lport_type_str(enum en_lport_type lport_type); > > +bool is_pb_router_type(const struct sbrec_port_binding *); > > + > > #endif /* OVN_UTIL_H */ > > diff --git a/northd/en-northd.c b/northd/en-northd.c > > index 044fa70190..b931f812ab 100644 > > --- a/northd/en-northd.c > > +++ b/northd/en-northd.c > > @@ -198,7 +198,7 @@ northd_sb_port_binding_handler(struct engine_node > *node, > > northd_get_input_data(node, &input_data); > > > > if (!northd_handle_sb_port_binding_changes( > > - input_data.sbrec_port_binding_table, &nd->ls_ports)) { > > + input_data.sbrec_port_binding_table, &nd->ls_ports, > &nd->lr_ports)) { > > return false; > > } > > > > diff --git a/northd/northd.c b/northd/northd.c > > index 9a12a94ae2..d355cf7c68 100644 > > --- a/northd/northd.c > > +++ b/northd/northd.c > > @@ -5262,22 +5262,32 @@ fail: > > bool > > northd_handle_sb_port_binding_changes( > > const struct sbrec_port_binding_table *sbrec_port_binding_table, > > - struct hmap *ls_ports) > > + struct hmap *ls_ports, struct hmap *lr_ports) > > { > > const struct sbrec_port_binding *pb; > > static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5); > > SBREC_PORT_BINDING_TABLE_FOR_EACH_TRACKED (pb, > sbrec_port_binding_table) { > > struct ovn_port *op = ovn_port_find(ls_ports, pb->logical_port); > > + bool is_router_port = false; > > if (op && !op->lsp_can_be_inc_processed) { > > return false; > > } > > + > > + if (!op) { > > + is_router_port = is_pb_router_type(pb); > > + if (is_router_port) { > > + op = ovn_port_find(lr_ports, pb->logical_port); > > + } > > + } > > + > > if (sbrec_port_binding_is_new(pb)) { > > /* Most likely the PB was created by northd and this is the > > * notification of that trasaction. So we just update the sb > > * pointer in northd data. Fallback to recompute otherwise. > */ > > if (!op) { > > VLOG_WARN_RL(&rl, "A port-binding for %s is created but > the " > > - "LSP is not found.", pb->logical_port); > > + "%s is not found.", pb->logical_port, > > + is_router_port ? "LRP" : "LSP"); > > return false; > > } > > op->sb = pb; > > @@ -5288,7 +5298,7 @@ northd_handle_sb_port_binding_changes( > > * sb idl pointers and other unexpected behavior. */ > > if (op) { > > VLOG_WARN_RL(&rl, "A port-binding for %s is deleted but > the " > > - "LSP still exists.", pb->logical_port); > > + "LSP/LRP still exists.", pb->logical_port); > > return false; > > } > > } else { > > @@ -5298,7 +5308,8 @@ northd_handle_sb_port_binding_changes( > > * Fallback to recompute for anything unexpected. */ > > if (!op) { > > VLOG_WARN_RL(&rl, "A port-binding for %s is updated but > the " > > - "LSP is not found.", pb->logical_port); > > + "%s is not found.", pb->logical_port, > > + is_router_port ? "LRP" : "LSP"); > > return false; > > } > > if (op->sb != pb) { > > diff --git a/northd/northd.h b/northd/northd.h > > index f3e63b1e1a..5759a4ee0e 100644 > > --- a/northd/northd.h > > +++ b/northd/northd.h > > @@ -342,7 +342,8 @@ bool lflow_handle_northd_ls_changes(struct > ovsdb_idl_txn *ovnsb_txn, > > struct tracked_ls_changes *, > > struct lflow_input *, struct hmap > *lflows); > > bool northd_handle_sb_port_binding_changes( > > - const struct sbrec_port_binding_table *, struct hmap *ls_ports); > > + const struct sbrec_port_binding_table *, struct hmap *ls_ports, > > + struct hmap *lr_ports); > > > > void build_bfd_table(struct ovsdb_idl_txn *ovnsb_txn, > > const struct nbrec_bfd_table *, > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev