Blob Blame History Raw
From 0ec31292fc29d2c111927382b13ea8af0499f6ac Mon Sep 17 00:00:00 2001
From: Dumitru Ceara <dceara@redhat.com>
Date: Wed, 6 Jan 2021 11:53:14 +0100
Subject: [PATCH] binding: Do not clear container lbinding->pb when parent is
 deleted.

When a parent Port_Binding is deleted we shouldn't clear the children's
'pb' field.  Container port bindings have their own Port_Binding SB
record so the child_lbinding->pb field should be cleared only when
their corresponding SB record is deleted.

Whithout this fix when a parent Port_Binding "remove" followed by "add"
operations are received in the same iteration in ovn-controller,
consider_container_lport() can be called with "pb == NULL" causing a
crash.

Fixes: 354bdba51abf ("ovn-controller: I-P for SB port binding and OVS interface in runtime_data.")
Signed-off-by: Dumitru Ceara <dceara@redhat.com>
Signed-off-by: Numan Siddique <numans@ovn.org>

(cherry-picked from master commit d3245f69dd6ec613ceb193f728946f7e3b9b3de3)
---
 controller/binding.c | 3 +--
 tests/ovn.at         | 7 +++++++
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/controller/binding.c b/controller/binding.c
index cb60c5d..e632203 100644
--- a/controller/binding.c
+++ b/controller/binding.c
@@ -958,8 +958,7 @@ release_local_binding_children(const struct sbrec_chassis *chassis_rec,
             }
         }
 
-        /* Clear the local bindings' 'pb' and 'iface'. */
-        l->pb = NULL;
+        /* Clear the local bindings' 'iface'. */
         l->iface = NULL;
     }
 
diff --git a/tests/ovn.at b/tests/ovn.at
index 8bcfcdf..ce6db86 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -9126,6 +9126,13 @@ OVS_WAIT_UNTIL([test xup = x$(ovn-nbctl lsp-get-up vm1)])
 OVS_WAIT_UNTIL([test xup = x$(ovn-nbctl lsp-get-up foo1)])
 OVS_WAIT_UNTIL([test xup = x$(ovn-nbctl lsp-get-up bar1)])
 
+# Move VM1 to a new logical switch.
+ovn-nbctl ls-add mgmt2
+ovn-nbctl lsp-del vm1 -- lsp-add mgmt2 vm1
+OVS_WAIT_UNTIL([test xup = x$(ovn-nbctl lsp-get-up vm1)])
+OVS_WAIT_UNTIL([test xup = x$(ovn-nbctl lsp-get-up foo1)])
+OVS_WAIT_UNTIL([test xup = x$(ovn-nbctl lsp-get-up bar1)])
+
 as hv1 ovs-vsctl del-port vm1
 OVS_WAIT_UNTIL([test xdown = x$(ovn-nbctl lsp-get-up vm1)])
 OVS_WAIT_UNTIL([test xdown = x$(ovn-nbctl lsp-get-up foo1)])
-- 
1.8.3.1