Hi Numan Thanks for the patch.
I am wondering whether we could not reduce the length of the ovn.at test and make it easier to follow. As of now, for each hypervisor, we call check_offlows_for_datapath for each expected local datapath and also check a few datapaths expected to be non-local . Then we also check "ovn-appctl -t ovn-controller debug/dump-local-datapaths" listing all local datapaths. Could we have something like "check_local_datapth" e.g. "check_local_datapth gw1 sw0,lr0,public" which would do all expected checks on gw1: - check that it contains flows for the listed datapaths - check that there is no flows for any other datapaths - check that debug/dump-local-datapaths returns exactly those datapaths. So something like (without checking the datapath type): +check_local_datapath() { + hv=$1 + expected_dps=$2 + OVS_WAIT_UNTIL( + [check_expected $hv $expected_dps], [echo "Did not find flows on $expected_dps on $hv"]) + OVS_WAIT_UNTIL( + [check_unexpected $hv $expected_dps], [echo "Found unexpected flows on $hv"]) + found=$(as $hv ovn-appctl -t ovn-controller debug/dump-local-datapaths | grep -v "Local" | sed 's/.*Datapath:\s*\([[a-z0-9-]]*\).*/\1/') + dps=$(echo "$expected_dps" | tr ',' '\n' | sort | tr '\n' ' ') + found=$(echo "$found" | sort | tr '\n' ' ') + check test "$dps" = "$found" +} + +check_unexpected() { + hv=$1 + dps=$2 + flows=$(as $hv ovs-ofctl dump-flows br-int) + + # Check for flows from unexpected datapaths + dps=$(echo "$dps" | tr ',' ' ') + echo "Looking for unexpected flows on $hv" + for dp in $dps + do + if [[ -n "${dp}" ]]; then + key=$(printf '0x%x' $(ovn-sbctl --bare --columns tunnel_key list datapath $dp)) + if [[ -n "${key}" ]]; then + flows=$(echo "$flows" | grep -v "metadata=$key" ) + fi + fi + done + n_flows=$(echo "$flows" | grep "metadata=" | wc -l) + if [[ "${n_flows}" != "0" ]]; then + #echo "hv $hv has $n_flows remaining flows" + return 1 + fi +} + +check_expected() { + # Check for flows from expected datapaths + hv=$1 + dps=$2 + dps=$(echo "$dps" | tr ',' ' ') + for dp in $dps + do + if [[ -n "${dp}" ]]; then + key=$(printf '0x%x' $(ovn-sbctl --bare --columns tunnel_key list datapath $dp)) + if [[ -n "${key}" ]]; then + echo "Looking for expected flows in $hv for $dp i.e. tunnel_key $key" + n_flows=$(as $hv ovs-ofctl dump-flows br-int | grep -c "metadata=$key") + if [[ "${n_flows}" -eq "0" ]]; then + #echo "hv $hv has no flows on dp $dp" + return 1 + fi + fi + fi + done +} + Then we can replace all occurrences of check_offlows_for_datapath and dump-local-datapaths by just four lines (one for each hv) on each nb/sb change. WDYT? Thanks Xavier On Thu, Mar 13, 2025 at 5:36 PM Numan Siddique <num...@ovn.org> wrote: > On Thu, Mar 13, 2025 at 12:21 PM Han Zhou <hz...@ovn.org> wrote: > > > > > > > > On Sat, Mar 1, 2025 at 6:38 AM <num...@ovn.org> wrote: > >> > >> From: Numan Siddique <num...@ovn.org> > >> > >> This patch series optimizes ovn-controller to add only relevant > >> datapaths to its "local datapaths" map if the logical topology > >> has a single flat provider logical switch connected to multiple > >> routers with a distributed gateway port. > >> > >> (Patch 3 has a detailed commit message.) > >> > >> v1 -> v2 > >> ----- > >> * Rebased to resolve the conflicts. > >> > >> Numan Siddique (3): > >> controller: Store local binding lports in local_datapath. > >> northd: Add a flag 'only_dgp_peer_ports' to the SB Datapath. > >> controller: Optimize adding 'dps' to the local datapaths. > >> > >> controller/binding.c | 324 +++++++++++--- > >> controller/binding.h | 2 + > >> controller/local_data.c | 98 ++++- > >> controller/local_data.h | 10 +- > >> controller/lport.c | 12 + > >> controller/lport.h | 4 + > >> controller/ovn-controller.c | 38 ++ > >> northd/northd.c | 31 +- > >> northd/northd.h | 4 + > >> tests/multinode.at | 185 +++++++- > >> tests/ovn-northd.at | 59 +++ > >> tests/ovn-performance.at | 6 +- > >> tests/ovn.at | 853 ++++++++++++++++++++++++++++++++++++ > >> 13 files changed, 1545 insertions(+), 81 deletions(-) > >> > >> -- > >> 2.48.1 > >> > >> _______________________________________________ > >> dev mailing list > >> d...@openvswitch.org > >> https://mail.openvswitch.org/mailman/listinfo/ovs-dev > > > > > > Hi Numan, > > > > Sorry for the slow review. I have a general comment for this series. I > believe the exact same performance optimization is supposed to be achieved > by the below commit: > > > > 22298fd37 ovn-controller: Don't flood fill local datapaths beyond DGP > boundary. > > > > The scenarios are mentioned in detail in the commit message of that > patch, which is very similar to what you described here. > > > > The only exception was when there are distributed NAT or when the > redirection type is set to "bridged". In these cases it will fall back to > add peer datapath as local. See SB:Port_Binding:options:always-redirect. Is > this something that your patch is targeting? Otherwise I wonder why it > didn't work without your patch. > > Hi Han, > > I wanted to mention in the commit message and in the cover letter that > this patch series is an extension of the commit 22298fd37. I somehow > missed it. > > Yes, I'm targeting the scenario of distributed NAT, > > Numan > > > > Could you help clarify? > > > > Thanks, > > Han > > > >> > _______________________________________________ > 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