On Wed, May 25, 2022 at 2:52 AM Ales Musil <[email protected]> wrote:
>
> When localport is removed from NB, and it is the last port
> remaining on the host, it is not part of local datapath
> anymore. Which can cause troubles when there is recompute
> happening in between the removal from NB and the removal
> of interface from host. The localport would stay in lport_ids
> set, so any new localport that happens to have the same unique
> lport key wouldn't be initiliazed properly thorugh I-P.
>
> Remove the localport port binding from local datapath
> if it was part of the that said datapath before.
>
> Reported-at: https://bugzilla.redhat.com/2076604
> Signed-off-by: Ales Musil <[email protected]>

Thanks for the v2.

Looks like either the test case added is flaky or some issue with
ovn-controller.

If you run the added test case in a loop continuously, it fails intermittently.
And when it fails I see the below in testsuite.log

----
../../tests/ovn-controller.at:2212: ovn-nbctl ls-add ls0
../../tests/ovn-controller.at:2213: ovn-nbctl lsp-add ls0 vm0
../../tests/ovn-controller.at:2214: ovn-nbctl lsp-set-addresses vm0
"00:00:00:00:10:10 192.168.10.10"
../../tests/ovn-controller.at:2201: ovn-nbctl lsp-add ls0 metadata
../../tests/ovn-controller.at:2202: ovn-nbctl lsp-set-type metadata localport
../../tests/ovn-controller.at:2203: ovn-nbctl lsp-set-addresses
metadata "00:00:00:00:10:25 192.168.10.25"
../../tests/ovn-controller.at:2207: ovs-vsctl add-port br-int vm0 --
set interface vm0 type=internal external_ids:iface-id=vm0
../../tests/ovn-controller.at:2208: ovs-vsctl add-port br-int metadata
-- set interface metadata type=internal external_ids:iface-id=metadata
ovn-controller.at:2222: waiting until test 6 = $(as hv1 ovs-ofctl
dump-flows br-int | grep -c $pb)...
ovn-controller.at:2222: wait succeeded immediately
../../tests/ovn-controller.at:2225: ovs-vsctl del-port br-int vm0
../../tests/ovn-controller.at:2226: ovn-appctl inc-engine/recompute
ovn-controller.at:2229: waiting until test 0 = $(as hv1 ovs-ofctl
dump-flows br-int | grep -c $pb)...
ovn-controller.at:2229: wait succeeded immediately
../../tests/ovn-controller.at:2232: ovn-nbctl lsp-del metadata
../../tests/ovn-controller.at:2233: ovs-vsctl del-port br-int metadata
../../tests/ovn-controller.at:2201: ovn-nbctl lsp-add ls0 metadata
../../tests/ovn-controller.at:2202: ovn-nbctl lsp-set-type metadata localport
../../tests/ovn-controller.at:2203: ovn-nbctl lsp-set-addresses
metadata "00:00:00:00:10:25 192.168.10.25"
../../tests/ovn-controller.at:2207: ovs-vsctl add-port br-int vm0 --
set interface vm0 type=internal external_ids:iface-id=vm0
../../tests/ovn-controller.at:2208: ovs-vsctl add-port br-int metadata
-- set interface metadata type=internal external_ids:iface-id=metadata
ovn-controller.at:2239: waiting until test 6 = $(as hv1 ovs-ofctl
dump-flows br-int | grep -c $pb)...
ovn-controller.at:2239: wait failed after 30 seconds
../../tests/ovs-macros.at:259: hard failure
2220. ovn-controller.at:2190: 2220. ovn-controller - localport can be
recreated (ovn-controller.at:2190): FAILED (ovs-macros.at:259)

------

Can you try testing this locally and see what's causing this failure ?

Below is my run loop script

----
#!/bin/bash

start_time=$(date)
tst="${TST:-2220}"
while true
do
    make check TESTSUITEFLAGS="$tst" 2>&1 | tee log
    grep successful log
    if [ "$?" = "1" ]; then
        echo "Test failed"
echo "Test started at $start_time"
echo "Exiting on "
date
        exit 1
    fi

    if [ -e tst_exit ]; then
        echo "Exiting  !!!"
        rm -f tst_exit
        break
    fi
done

echo "Done testing"
-------------

Thanks
Numan


> ---
> v2: Add a test case for the scenario and rebase on newer main
> ---
>  controller/binding.c    |  9 +++++++
>  tests/ovn-controller.at | 54 +++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 63 insertions(+)
>
> diff --git a/controller/binding.c b/controller/binding.c
> index 92baebd29..a900c9a50 100644
> --- a/controller/binding.c
> +++ b/controller/binding.c
> @@ -2131,6 +2131,15 @@ handle_deleted_lport(const struct sbrec_port_binding 
> *pb,
>          return;
>      }
>
> +    /*
> +     * Remove localport that was part of local datapath that is not
> +     * considered to be local anymore.
> +     */
> +    if (!ld && !strcmp(pb->type, "localport") &&
> +        sset_find(&b_ctx_out->related_lports->lport_names, 
> pb->logical_port)) {
> +        remove_related_lport(pb, b_ctx_out);
> +    }
> +
>      /* If the binding is not local, if 'pb' is a L3 gateway port, we should
>       * remove its peer, if that one is local.
>       */
> diff --git a/tests/ovn-controller.at b/tests/ovn-controller.at
> index 3ca59f7e0..a34740d85 100644
> --- a/tests/ovn-controller.at
> +++ b/tests/ovn-controller.at
> @@ -2186,3 +2186,57 @@ AT_CHECK([grep "Parsing of ovn-chassis-mac-mappings 
> failed" hv1/ovn-controller.l
>
>  OVN_CLEANUP([hv1])
>  AT_CLEANUP
> +
> +AT_SETUP([ovn-controller - localport can be recreated])
> +
> +ovn_start
> +
> +net_add n1
> +sim_add hv1
> +as hv1
> +ovs-vsctl add-br br-phys
> +ovn_attach n1 br-phys 192.168.0.1
> +
> +create_localport() {
> +    AT_CHECK([ovn-nbctl lsp-add ls0 metadata])
> +    AT_CHECK([ovn-nbctl lsp-set-type metadata localport])
> +    AT_CHECK([ovn-nbctl lsp-set-addresses metadata "00:00:00:00:10:25 
> 192.168.10.25"])
> +}
> +
> +bind_ports() {
> +    AT_CHECK([ovs-vsctl add-port br-int vm0 -- set interface vm0 
> type=internal external_ids:iface-id=vm0])
> +    AT_CHECK([ovs-vsctl add-port br-int metadata -- set interface metadata 
> type=internal external_ids:iface-id=metadata])
> +}
> +
> +# Create one VIF and localport and bind it to chassis
> +AT_CHECK([ovn-nbctl ls-add ls0])
> +AT_CHECK([ovn-nbctl lsp-add ls0 vm0])
> +AT_CHECK([ovn-nbctl lsp-set-addresses vm0 "00:00:00:00:10:10 192.168.10.10"])
> +create_localport
> +bind_ports
> +
> +pb=$(ovn-sbctl --bare --columns _uuid find port_binding 
> logical_port=metadata | cut -d '-' -f 1 | tr -d '\n')
> +
> +
> +# Check that localport has all physical flows defined
> +OVS_WAIT_UNTIL([test 6 = $(as hv1 ovs-ofctl dump-flows br-int | grep -c 
> $pb)])
> +
> +# Remove ls0 from local datapaths
> +AT_CHECK([ovs-vsctl del-port br-int vm0])
> +AT_CHECK([ovn-appctl inc-engine/recompute])
> +
> +# Check that localports physical flows are removed
> +OVS_WAIT_UNTIL([test 0 = $(as hv1 ovs-ofctl dump-flows br-int | grep -c 
> $pb)])
> +
> +# The order is impotant, if the port is removed first, the bug wouldn't be 
> triggered
> +AT_CHECK([ovn-nbctl lsp-del metadata])
> +AT_CHECK([ovs-vsctl del-port br-int metadata])
> +create_localport
> +bind_ports
> +
> +pb=$(ovn-sbctl --bare --columns _uuid find port_binding 
> logical_port=metadata | cut -d '-' -f 1 | tr -d '\n')
> +# Check that localport has all physical flows re-defined
> +OVS_WAIT_UNTIL([test 6 = $(as hv1 ovs-ofctl dump-flows br-int | grep -c 
> $pb)])
> +
> +OVN_CLEANUP([hv1])
> +AT_CLEANUP
> --
> 2.35.3
>
> _______________________________________________
> dev mailing list
> [email protected]
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to