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

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

Reply via email to