When a port is added and deleted in the same loop by ovn-controller
this was causing the following warning
if_status|WARN|Trying to release unknown interface
We now avoid the warning in that ascenario.

Reported-at: https://bugzilla.redhat.com/show_bug.cgi?id=2222252
Signed-off-by: Xavier Simonart <[email protected]>
---
 controller/binding.c    | 12 ++++++++++--
 controller/if-status.c  | 12 ++++++++++++
 controller/if-status.h  |  2 ++
 tests/ofproto-macros.at |  4 ++--
 tests/ovn.at            | 27 +++++++++++++++++++++++++++
 5 files changed, 53 insertions(+), 4 deletions(-)

diff --git a/controller/binding.c b/controller/binding.c
index f619aba2e..bc7adb048 100644
--- a/controller/binding.c
+++ b/controller/binding.c
@@ -2682,7 +2682,13 @@ handle_deleted_lport(const struct sbrec_port_binding *pb,
     if (ld) {
         remove_pb_from_local_datapath(pb,
                                       b_ctx_out, ld);
-        if_status_mgr_release_iface(b_ctx_out->if_mgr, pb->logical_port);
+        /* Only try to release the port if it was ever claimed.
+         * If a port was added and deleted within the same ovn-controller loop,
+         * it is seen as never claimed.
+         */
+        if (if_status_is_port_claimed(b_ctx_out->if_mgr, pb->logical_port)) {
+            if_status_mgr_release_iface(b_ctx_out->if_mgr, pb->logical_port);
+        }
         return;
     }
 
@@ -2706,7 +2712,9 @@ handle_deleted_lport(const struct sbrec_port_binding *pb,
             remove_pb_from_local_datapath(pb, b_ctx_out,
                                           ld);
         }
-        if_status_mgr_release_iface(b_ctx_out->if_mgr, pb->logical_port);
+        if (if_status_is_port_claimed(b_ctx_out->if_mgr, pb->logical_port)) {
+            if_status_mgr_release_iface(b_ctx_out->if_mgr, pb->logical_port);
+        }
     }
 }
 
diff --git a/controller/if-status.c b/controller/if-status.c
index b45208746..faf4e1f67 100644
--- a/controller/if-status.c
+++ b/controller/if-status.c
@@ -820,3 +820,15 @@ if_status_mgr_get_memory_usage(struct if_status_mgr *mgr,
     simap_increase(usage, "if_status_mgr_ifaces_state_usage-KB",
                    ROUND_UP(ifaces_state_usage, 1024) / 1024);
 }
+
+bool
+if_status_is_port_claimed(const struct if_status_mgr *mgr,
+                          const char *iface_id)
+{
+    struct ovs_iface *iface = shash_find_data(&mgr->ifaces, iface_id);
+    if (!iface || (iface->state > OIF_INSTALLED)) {
+        return false;
+    } else {
+        return true;
+    }
+}
diff --git a/controller/if-status.h b/controller/if-status.h
index 15624bcfa..9714f6d8d 100644
--- a/controller/if-status.h
+++ b/controller/if-status.h
@@ -62,5 +62,7 @@ uint16_t if_status_mgr_iface_get_mtu(const struct 
if_status_mgr *mgr,
                                      const char *iface_id);
 bool if_status_mgr_iface_update(const struct if_status_mgr *mgr,
                                 const struct ovsrec_interface *iface_rec);
+bool if_status_is_port_claimed(const struct if_status_mgr *mgr,
+                               const char *iface_id);
 
 # endif /* controller/if-status.h */
diff --git a/tests/ofproto-macros.at b/tests/ofproto-macros.at
index b0101330f..07ef1d092 100644
--- a/tests/ofproto-macros.at
+++ b/tests/ofproto-macros.at
@@ -250,11 +250,11 @@ m4_define([OVS_VSWITCHD_START],
 
 # check_logs scans through all *.log files (except '*.log' and 
'*testsuite.log')
 # and reports all WARN, ERR, EMER log entries.  User can add custom sed filters
-# in $1.
+# in $1 and select folder with $2.
 m4_divert_push([PREPARE_TESTS])
 check_logs () {
     local logs
-    for log in *.log; do
+    for log in ./$2/*.log; do
         case ${log} in # (
             '*.log'|*testsuite.log) ;; # (
             *) logs="${logs} ${log}" ;;
diff --git a/tests/ovn.at b/tests/ovn.at
index f2148faac..f57e0f263 100644
--- a/tests/ovn.at
+++ b/tests/ovn.at
@@ -36568,3 +36568,30 @@ OVS_WAIT_UNTIL([test $(as hv-1 ovs-vsctl list qos | 
grep -c linux-htb) -eq 1])
 
 AT_CLEANUP
 ])
+
+OVN_FOR_EACH_NORTHD([
+AT_SETUP([Add and delete port])
+ovn_start
+
+net_add n1
+
+sim_add hv1
+as hv1
+check ovs-vsctl add-br br-phys
+ovn_attach n1 br-phys 192.168.0.11
+
+check ovn-nbctl ls-add ls0
+check ovn-nbctl --wait=hv lsp-add ls0 lsp1
+as hv1 check ovs-vsctl -- add-port br-int lsp1 -- \
+    set Interface lsp1 external-ids:iface-id=lsp1
+
+wait_for_ports_up
+sleep_controller hv1
+check ovn-nbctl --wait=sb lsp-add ls0 lsp0
+check ovn-nbctl --wait=sb lsp-del lsp0
+wake_up_controller hv1
+AT_CHECK([check_logs [""] hv1])
+OVN_CLEANUP([hv1])
+
+AT_CLEANUP
+])
-- 
2.31.1

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to