Hi,Eelco,

Which kernel version you have tested on?
I've also tested the #50 for several hundreds times, but only get 0 packets
once.

I have put your patches upon on commits 49efc63ad: ofproto-dpif-xlate: Fix
error messages for nonexistent ports/recirc_ids.
not sure if it's related to the modification on master branch.




Eelco Chaudron <[email protected]> 于2022年10月7日周五 18:54写道:

> Hi hepeng,
>
> I tried your changes, but I also do get a lot of zero packet failures on
> test 50. Not sure what happened, maybe it was related to syncing to the
> latest master.
>
> However I focused on test 49, and I can replicate it every x test, but
> within 40 tries:
>
> ## ------------------------------ ##
> ## openvswitch 3.0.90 test suite. ##
> ## ------------------------------ ##
> 49: datapath - truncate and output to gre tunnel by simulated packets
> FAILED (ovs-macros.at:247)
>
> ...
> ...
> system-traffic.at:1663: waiting until ovs-ofctl dump-flows br-underlay |
> grep "in_port=LOCAL" | sed -n 's/.*\(n\_bytes=[0-9]*\).*/\1/p' | grep
> "n_bytes=138"...
> system-traffic.at:1663: wait failed after 30 seconds
> n_bytes=18446744073707612670
> ./ovs-macros.at:247: hard failure
>
> I’ll try to dig into this later once I get some time...
>
> //Eelco
>
> On 2 Oct 2022, at 8:40, Peng He wrote:
>
> Hi,
>
> I have tried test #50 for 200 times, the overflow as well as stats of 0
> did not show up.
>
> the command line is:
> for i in {1..100}; do echo $i; make check-offloads TESTSUITEFLAGS="-v 50"
> || break; done
>
> I am using Debian 10, and my kernel version is
> root@ubuntu:~/ovs# uname -r
> 5.4.0-121-generic
>
> I doubt the overflow might be related to kernel datapath.
> IIRC, the kernel datapath does not support some IPv6 ND/NA match.
>
> In the logs, there are some warning saying that "failed to get/del/put
> some datapath flow", which is all
> related the ICMPv6. It seems to prove the missing of the support of NA/ND
> match in datapath.
>
> since the ICMPv6 is not related to the test itself. I did some
> modification to the test to drop all IPv6 traffic.
>
> Below is my complete diff to the #50:
>
> diff --git a/tests/system-traffic.at b/tests/system-traffic.at
> index dfbc30e47..b759c4bb9 100644
> --- a/tests/system-traffic.at
> +++ b/tests/system-traffic.at
> @@ -1762,7 +1762,7 @@ on_exit 'rm -f payload200.bin'
>
>  AT_CHECK([ovs-ofctl del-flows br0])
>  AT_DATA([flows.txt], [dnl
>
> -priority=99,in_port=1,actions=output(port=2,max_len=100),output(port=3,max_len=100)
>
> +priority=99,in_port=1,ip,actions=output(port=2,max_len=100),output(port=3,max_len=100)
>  priority=99,in_port=2,udp,actions=output(port=1,max_len=100)
>  priority=1,in_port=4,ip,actions=drop
>  priority=1,actions=drop
> @@ -1771,6 +1771,8 @@ AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
>
>  AT_CHECK([ovs-ofctl del-flows br-underlay])
>  AT_DATA([flows-underlay.txt], [dnl
> +priority=99,arp,in_port=1,actions=LOCAL
> +priority=99,arp,in_port=LOCAL,actions=1
>  priority=99,dl_type=0x0800,nw_proto=47,in_port=1,actions=LOCAL
>  priority=99,dl_type=0x0800,nw_proto=47,in_port=LOCAL,ip_dst=
> 172.31.1.1/24,actions=1
>  priority=1,actions=drop
> @@ -1787,7 +1789,7 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep
> "in_port=2" | sed -n 's/.*\(n\_bytes=[
>  n_bytes=242
>  ])
>  dnl After truncation = outer ETH(14) + outer IP(20) + GRE(4) + 100 = 138B
> -AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "in_port=LOCAL" | sed
> -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
> +AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "ip,in_port=LOCAL" |
> sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
>  n_bytes=138
>  ])
>
> @@ -1822,7 +1824,7 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep
> "in_port=2" | sed -n 's/.*\(n\_bytes=[
>  n_bytes=242
>  ])
>  dnl After truncation = outer ETH(14) + outer IP(20) + GRE(4) + 100 = 138B
> -AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "in_port=LOCAL" | sed
> -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
> +AT_CHECK([ovs-ofctl dump-flows br-underlay | grep "ip,in_port=LOCAL" |
> sed -n 's/.*\(n\_bytes=[[0-9]]*\).*/\1/p'], [0], [dnl
>  n_bytes=138
>  ])
>
> @@ -1834,7 +1836,11 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep
> "in_port=4" | ofctl_strip], [0], [dnl
>   n_packets=1, n_bytes=100, priority=1,ip,in_port=4 actions=drop
>  ])
>
> -OVS_TRAFFIC_VSWITCHD_STOP
> +OVS_TRAFFIC_VSWITCHD_STOP(["dnl
> +/.*lost packet on port.*/d
> +/.failed to flow_get.*/d
> +/.failed to flow_del.*/d
> +/.*Failed to acquire udpif_key corresponding to unexpected flow.*/d"])
>  AT_CLEANUP
>
>
> It seems that the overflow here is not related to the race in
> revalidators, but it is related to the design of
> the testsuite and also the missing of the support of NA/ND in kernel
> datapath.
>
>
>
> Eelco Chaudron <[email protected]> 于2022年9月30日周五 23:47写道:
>
>> On 30 Sep 2022, at 17:41, Peng He wrote:
>>
>> > It's so easy to reproduce ?
>> >
>> > Thanks! then I should have to dig it again.
>>
>> It’s been on my to-do for a while but did not get to it. Sometimes it
>> reproduced easily, and sometimes it takes 100+ runs :(
>>
>> If you apply the following series:
>>
>>   https://patchwork.ozlabs.org/project/openvswitch/list/?series=316861
>>
>> And then the diff below you can run something like:
>>
>>   sudo bash -c 'for i in {1..100}; do make check-offloads
>> TESTSUITEFLAGS="49 50"
>>
>>  49: datapath - truncate and output to gre tunnel by simulated packets ok
>>  50: datapath - truncate and output to gre tunnel    ok
>>
>> And after a while, it will fail with the error (sometimes also 0 bytes, I
>> hope it’s the same issue :):
>>
>> system-traffic.at:1663: wait failed after 30 seconds
>> n_bytes=18446744073709393054
>>
>>
>>
>> $ git diff
>> diff --git a/ofproto/ofproto-dpif-upcall.c b/ofproto/ofproto-dpif-upcall.c
>> index 57f94df54..52d61d0a4 100644
>> --- a/ofproto/ofproto-dpif-upcall.c
>> +++ b/ofproto/ofproto-dpif-upcall.c
>> @@ -1868,6 +1868,7 @@ try_ukey_replace(struct umap *umap, struct
>> udpif_key *old_ukey,
>>              ovs_mutex_lock(&new_ukey->mutex);
>>              cmap_replace(&umap->cmap, &old_ukey->cmap_node,
>>                           &new_ukey->cmap_node, new_ukey->hash);
>> +            new_ukey->dump_seq = old_ukey->dump_seq;
>>              ovsrcu_postpone(ukey_delete__, old_ukey);
>>              transition_ukey(old_ukey, UKEY_DELETED);
>>              transition_ukey(new_ukey, UKEY_VISIBLE);
>> diff --git a/tests/system-offloads-testsuite.at b/tests/
>> system-offloads-testsuite.at
>> index 318e6d1e6..4d546011d 100644
>> --- a/tests/system-offloads-testsuite.at
>> +++ b/tests/system-offloads-testsuite.at
>> @@ -114,8 +114,8 @@ conntrack - DNAT load balancing with NC
>>
>>  # Occasionalt we fail with extreme high byte counters, i.e.
>>  # n_bytes=18446744073705804134
>> -datapath - truncate and output to gre tunnel by simulated packets
>> -datapath - truncate and output to gre tunnel
>> +#datapath - truncate and output to gre tunnel by simulated packets
>> +#datapath - truncate and output to gre tunnel
>>  "
>>  echo "$ovs_test_skip_list" | sed "s/<SPC>/ /g"])
>>
>> diff --git a/tests/system-traffic.at b/tests/system-traffic.at
>> index 528d2ca64..e86699d1d 100644
>> --- a/tests/system-traffic.at
>> +++ b/tests/system-traffic.at
>> @@ -1708,7 +1708,10 @@ OVS_REVALIDATOR_PURGE()
>>  OVS_WAIT_UNTIL([ovs-ofctl dump-flows br0 | grep "in_port=4" |
>> ofctl_strip | grep "n_packets=1, n_bytes=100, priority=1,ip,in_port=4
>> actions=drop"],
>>                 [ovs-ofctl dump-flows br0 | grep "in_port=4" |
>> ofctl_strip])
>>
>> -OVS_TRAFFIC_VSWITCHD_STOP
>> +OVS_TRAFFIC_VSWITCHD_STOP(["dnl
>> +/.*lost packet on handler.*/d
>> +/.failed to flow_get.*/d
>> +/.*Failed to acquire udpif_key corresponding to unexpected flow.*/d"])
>>  AT_CLEANUP
>>
>>  dnl Create 2 bridges and 2 namespaces to test truncate over
>> @@ -1834,7 +1837,10 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep
>> "in_port=4" | ofctl_strip], [0], [dnl
>>   n_packets=1, n_bytes=100, priority=1,ip,in_port=4 actions=drop
>>  ])
>>
>> -OVS_TRAFFIC_VSWITCHD_STOP
>> +OVS_TRAFFIC_VSWITCHD_STOP(["dnl
>> +/.*lost packet on handler.*/d
>> +/.failed to flow_get.*/d
>> +/.*Failed to acquire udpif_key corresponding to unexpected flow.*/d"])
>>  AT_CLEANUP
>>
>>  AT_SETUP([datapath - configure cache size])
>>
>>
>>
>> > Eelco Chaudron <[email protected]> 于2022年9月30日周五 23:39写道:
>> >
>> >>
>> >>
>> >> On 30 Sep 2022, at 17:26, Peng He wrote:
>> >>
>> >>> Eelco Chaudron <[email protected]> 于2022年9月30日周五 23:01写道:
>> >>>
>> >>>>
>> >>>>
>> >>>> On 23 Sep 2022, at 18:29, Peng He wrote:
>> >>>>
>> >>>>> The userspace datapath mananges all the magaflows by a cmap. The
>> cmap
>> >>>>> data structrue will grow/shrink during the datapath processing and
>> it
>> >>>>> will re-position megaflows. This might result in two revalidator
>> >> threads
>> >>>>> might process a same megaflow during one dump stage.
>> >>>>>
>> >>>>> Consider a situation that, revalidator 1 processes a megaflow A, and
>> >>>>> decides to delete it from the datapath, at the mean time, this
>> megaflow
>> >>>>> A is also queued in the process batch of revalidator 2. Normally
>> it's
>> >> ok
>> >>>>> for revalidators to process the same megaflow multiple times, as the
>> >>>>> dump_seq shows it's already dumped and the stats will not be
>> >> contributed
>> >>>>> twice.
>> >>>>>
>> >>>>> Assume that right after A is deleted, a PMD thread generates again
>> >>>>> a new megaflow B which has the same match and action of A. The ukey
>> >>>>> of megaflow B will replace the one of megaflow A. Now the ukey B is
>> >>>>> new to the revalidator system and its dump seq is 0.
>> >>>>>
>> >>>>> Now since the dump seq of ukey B is 0, when processing megaflow A,
>> >>>>> the revalidator 2 will not identify this megaflow A has already been
>> >>>>> dumped by revalidator 1 and will contribute the old megaflow A's
>> stats
>> >>>>> again, this results in an inconsistent stats between ukeys and
>> >> megaflows.
>> >>>>>
>> >>>>> To fix this, the newly generated the ukey B should take the dump_seq
>> >>>>> of the replaced ukey A to avoid a same megaflow being revalidated
>> >>>>> twice in one dump stage.
>> >>>>>
>> >>>>> We observe in the production environment, the OpenFlow rules' stats
>> >>>>> sometimes are amplified compared to the actual value. I believe this
>> >>>>> is also the reason that why somtimes there is mismatch between the
>> >>>>> ukey and megaflow in stats value. The Eelco's patch
>> >>>>> [ovs-dev] [PATCH v2 09/10] revalidator: Fix datapath statistics
>> update
>> >>>>> tried to fix it in the past.
>> >>>>
>> >>>> This sounds plausible, are your statistics extremely elevated?
>> >>>> Mine are in the likes of n_bytes=18446744073705804134 where it
>> should be
>> >>>> around 100.
>> >>>>
>> >>>> It looks more like an overflow.
>> >>> I just get the report from another team, I need to ask them, we will
>> >> have a
>> >>> 7 days off due to the national day.
>> >>> so it will take time to get the value. :(
>> >>
>> >> Enjoy your time off!! This fix is not solving my problem;
>> >>
>> >> Still get the error once out of X runs, n_bytes=18446744073709393054
>> >>
>> >>> I’ll try to get my old setup up and run it continuously over the
>> weekend
>> >>>> and see if it’s replicated again.
>> >>>>
>> >>>> thanks!
>> >>>
>> >>>
>> >>>>> Signed-off-by: Peng He <[email protected]>
>> >>>>> ---
>> >>>>>  ofproto/ofproto-dpif-upcall.c | 1 +
>> >>>>>  1 file changed, 1 insertion(+)
>> >>>>>
>> >>>>> diff --git a/ofproto/ofproto-dpif-upcall.c
>> >>>> b/ofproto/ofproto-dpif-upcall.c
>> >>>>> index e8bbcfeaf..89fad1bdf 100644
>> >>>>> --- a/ofproto/ofproto-dpif-upcall.c
>> >>>>> +++ b/ofproto/ofproto-dpif-upcall.c
>> >>>>> @@ -1877,6 +1877,7 @@ try_ukey_replace(struct umap *umap, struct
>> >>>> udpif_key *old_ukey,
>> >>>>>              ovs_mutex_lock(&new_ukey->mutex);
>> >>>>>              cmap_replace(&umap->cmap, &old_ukey->cmap_node,
>> >>>>>                           &new_ukey->cmap_node, new_ukey->hash);
>> >>>>> +            new_ukey->dump_seq = old_ukey->dump_seq;
>> >>>>>              ovsrcu_postpone(ukey_delete__, old_ukey);
>> >>>>>              transition_ukey(old_ukey, UKEY_DELETED);
>> >>>>>              transition_ukey(new_ukey, UKEY_VISIBLE);
>> >>>>> --
>> >>>>> 2.25.1
>> >>>>>
>> >>>>> _______________________________________________
>> >>>>> dev mailing list
>> >>>>> [email protected]
>> >>>>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>> >>>>
>> >>>>
>> >>>
>> >>> --
>> >>> hepeng
>> >>
>> >>
>> >
>> > --
>> > hepeng
>>
>>
>
> --
> hepeng
>
>

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

Reply via email to