Message ID | 20240809171037.1369742-1-roriorden@redhat.com |
---|---|
State | Superseded |
Headers | show |
Series | [ovs-dev,v2] northd: Clean up SB MAC bindings for deleted ports. | expand |
Context | Check | Description |
---|---|---|
ovsrobot/apply-robot | warning | apply and check: warning |
ovsrobot/github-robot-_Build_and_Test | success | github build: passed |
ovsrobot/github-robot-_ovn-kubernetes | fail | github build: failed |
Sorry I forgot to add: v2: - Simplified/neatened code in northd/northd.c, kept logic the same. On 8/9/24 1:10 PM, Rosemarie O'Riorden wrote: > Static_MAC_Binding (SMB) records are only deleted from the > southbound-db via ovn-northd when there is no such SMB found in the > northbound-db. This leads to problems when a port becomes stale (ex. > through lr deletion), because the Logical_Router and Logical_Router_Port > records are removed from the nb-db, but not the Static_MAC_Binding record. > > So, when ovn-northd attempts to remove the corresponding > Datapath_Binding and Port_Binding records from sb-db, it fails because > of a referential integrity violation: the Static_MAC_Binding record > contains a reference to Datapath_Binding. > > The corrected behavior is that SMB's are now deleted: > 1. when there's no such SMB in the nb-db, and > 2. when there is no port in the nb-db with the SMB's associated port name. > Thus, all three records, Datapath_Binding, Port_Binding, and > Static_MAC_Binding, are removed within the same transaction. > > Also added a unit test to verify correct behavior. > > Fixes: b22684d4e37c ("Add a northbound interface to program MAC_Binding table") > Reported-at: https://issues.redhat.com/browse/FDP-723 > Signed-off-by: Rosemarie O'Riorden <roriorden@redhat.com> > --- > northd/northd.c | 9 ++++++++- > tests/ovn-northd.at | 13 +++++++++++++ > 2 files changed, 21 insertions(+), 1 deletion(-) > > diff --git a/northd/northd.c b/northd/northd.c > index 0c73e70df..70a9d1984 100644 > --- a/northd/northd.c > +++ b/northd/northd.c > @@ -18336,7 +18336,8 @@ build_static_mac_binding_table( > struct hmap *lr_ports) > { > /* Cleanup SB Static_MAC_Binding entries which do not have corresponding > - * NB Static_MAC_Binding entries. */ > + * NB Static_MAC_Binding entries, and SB Static_MAC_Binding entries for > + * which there is not a NB Port_Binding of the same name. */ > const struct nbrec_static_mac_binding *nb_smb; > const struct sbrec_static_mac_binding *sb_smb; > SBREC_STATIC_MAC_BINDING_TABLE_FOR_EACH_SAFE (sb_smb, > @@ -18346,6 +18347,12 @@ build_static_mac_binding_table( > sb_smb->ip); > if (!nb_smb) { > sbrec_static_mac_binding_delete(sb_smb); > + continue; > + } > + > + struct ovn_port *op = op = ovn_port_find(lr_ports, nb_smb->logical_port); > + if (!op || !op->nbrp || !op->od || !op->od->sb) { > + sbrec_static_mac_binding_delete(sb_smb); > } > } > > diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at > index f2f42275a..8d0ac6c3c 100644 > --- a/tests/ovn-northd.at > +++ b/tests/ovn-northd.at > @@ -8080,6 +8080,19 @@ wait_row_count Static_MAC_Binding 1 logical_port=lr0-p0 ip=192.168.10.100 mac="0 > AT_CLEANUP > ]) > > +OVN_FOR_EACH_NORTHD_NO_HV([ > +AT_SETUP([LR NB Static_MAC_Binding garbage collection]) > +ovn_start > + > +check ovn-nbctl lr-add lr -- lrp-add lr lr-lrp 00:00:00:00:00:01 1.1.1.1/24 > +check ovn-nbctl static-mac-binding-add lr-lrp 1.1.1.2 00:00:00:00:00:02 > +wait_row_count sb:Static_MAC_Binding 1 logical_port=lr-lrp ip=1.1.1.2 mac="00\:00\:00\:00\:00\:02" > +check ovn-nbctl lr-del lr > +wait_row_count sb:Static_MAC_Binding 0 > + > +AT_CLEANUP > +]) > + > OVN_FOR_EACH_NORTHD_NO_HV([ > AT_SETUP([LR neighbor lookup and learning flows]) > ovn_start
diff --git a/northd/northd.c b/northd/northd.c index 0c73e70df..70a9d1984 100644 --- a/northd/northd.c +++ b/northd/northd.c @@ -18336,7 +18336,8 @@ build_static_mac_binding_table( struct hmap *lr_ports) { /* Cleanup SB Static_MAC_Binding entries which do not have corresponding - * NB Static_MAC_Binding entries. */ + * NB Static_MAC_Binding entries, and SB Static_MAC_Binding entries for + * which there is not a NB Port_Binding of the same name. */ const struct nbrec_static_mac_binding *nb_smb; const struct sbrec_static_mac_binding *sb_smb; SBREC_STATIC_MAC_BINDING_TABLE_FOR_EACH_SAFE (sb_smb, @@ -18346,6 +18347,12 @@ build_static_mac_binding_table( sb_smb->ip); if (!nb_smb) { sbrec_static_mac_binding_delete(sb_smb); + continue; + } + + struct ovn_port *op = op = ovn_port_find(lr_ports, nb_smb->logical_port); + if (!op || !op->nbrp || !op->od || !op->od->sb) { + sbrec_static_mac_binding_delete(sb_smb); } } diff --git a/tests/ovn-northd.at b/tests/ovn-northd.at index f2f42275a..8d0ac6c3c 100644 --- a/tests/ovn-northd.at +++ b/tests/ovn-northd.at @@ -8080,6 +8080,19 @@ wait_row_count Static_MAC_Binding 1 logical_port=lr0-p0 ip=192.168.10.100 mac="0 AT_CLEANUP ]) +OVN_FOR_EACH_NORTHD_NO_HV([ +AT_SETUP([LR NB Static_MAC_Binding garbage collection]) +ovn_start + +check ovn-nbctl lr-add lr -- lrp-add lr lr-lrp 00:00:00:00:00:01 1.1.1.1/24 +check ovn-nbctl static-mac-binding-add lr-lrp 1.1.1.2 00:00:00:00:00:02 +wait_row_count sb:Static_MAC_Binding 1 logical_port=lr-lrp ip=1.1.1.2 mac="00\:00\:00\:00\:00\:02" +check ovn-nbctl lr-del lr +wait_row_count sb:Static_MAC_Binding 0 + +AT_CLEANUP +]) + OVN_FOR_EACH_NORTHD_NO_HV([ AT_SETUP([LR neighbor lookup and learning flows]) ovn_start
Static_MAC_Binding (SMB) records are only deleted from the southbound-db via ovn-northd when there is no such SMB found in the northbound-db. This leads to problems when a port becomes stale (ex. through lr deletion), because the Logical_Router and Logical_Router_Port records are removed from the nb-db, but not the Static_MAC_Binding record. So, when ovn-northd attempts to remove the corresponding Datapath_Binding and Port_Binding records from sb-db, it fails because of a referential integrity violation: the Static_MAC_Binding record contains a reference to Datapath_Binding. The corrected behavior is that SMB's are now deleted: 1. when there's no such SMB in the nb-db, and 2. when there is no port in the nb-db with the SMB's associated port name. Thus, all three records, Datapath_Binding, Port_Binding, and Static_MAC_Binding, are removed within the same transaction. Also added a unit test to verify correct behavior. Fixes: b22684d4e37c ("Add a northbound interface to program MAC_Binding table") Reported-at: https://issues.redhat.com/browse/FDP-723 Signed-off-by: Rosemarie O'Riorden <roriorden@redhat.com> --- northd/northd.c | 9 ++++++++- tests/ovn-northd.at | 13 +++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-)