On 8/23/21 10:20 PM, Anton Ivanov wrote:
> Should not be the case.
> 
> The map is pre-sized for the size from the previous iterations.
> 
> Line 12861 in my tree which is probably a few commits out of date:
> 
>     fast_hmap_size_for(&lflows, max_seen_lflow_size);
> 
> And immediately after building the lflows:
> 
>     if (hmap_count(&lflows) > max_seen_lflow_size) {
>         max_seen_lflow_size = hmap_count(&lflows);
>     }
> 
> So the map SHOULD be sized correctly - to the most recent seen lflow count.

Please, re-read the commit message.  It's a first run of the loop
and the 'max_seen_lflow_size' is default 128 at this point.

> 
> A.
> 
> On 23/08/2021 21:02, Ilya Maximets wrote:
>> 'lflow_map' is never expanded because northd always uses fast
>> insertion.  This leads to the case where we have a hash map
>> with only 128 initial buckets and every ovn_lflow_find() ends
>> up iterating over n_lflows / 128 entries.  It's thousands of
>> logical flows or even more.  For example, it takes forever for
>> ovn-northd to start up with the Northbound Db from the 120 node
>> density-heavy test from ovn-heater, because every lookup is slower
>> than previous one.  I aborted the process after 15 minutes of
>> waiting, because there was no sign that it will converge.  With
>> this change applied the loop completes in only 11 seconds.
>>
>> Hash map will be pre-allocated to the maximum seen number of
>> logical flows on a second iteration, but this doesn't help for
>> the first iteration when northd first time connects to a big
>> Northbound database, which is a common case during failover or
>> cluster upgrade.  And there is an even trickier case where big
>> NbDB transaction that explodes the number of logical flows received
>> on not the first run.
>>
>> We can't expand the hash map in case of parallel build, so this
>> should be fixed separately.
>>
>> CC: Anton Ivanov <[email protected]>
>> Fixes: 74daa0607c7f ("ovn-northd: Introduce parallel lflow build")
>> Signed-off-by: Ilya Maximets <[email protected]>
>> ---
>>   northd/ovn-northd.c | 6 +++++-
>>   1 file changed, 5 insertions(+), 1 deletion(-)
>>
>> diff --git a/northd/ovn-northd.c b/northd/ovn-northd.c
>> index 3d8e21a4f..40cf957c0 100644
>> --- a/northd/ovn-northd.c
>> +++ b/northd/ovn-northd.c
>> @@ -4387,7 +4387,11 @@ do_ovn_lflow_add(struct hmap *lflow_map, struct 
>> ovn_datapath *od,
>>                      nullable_xstrdup(ctrl_meter),
>>                      ovn_lflow_hint(stage_hint), where);
>>       hmapx_add(&lflow->od_group, od);
>> -    hmap_insert_fast(lflow_map, &lflow->hmap_node, hash);
>> +    if (!use_parallel_build) {
>> +        hmap_insert(lflow_map, &lflow->hmap_node, hash);
>> +    } else {
>> +        hmap_insert_fast(lflow_map, &lflow->hmap_node, hash);
>> +    }
>>   }
>>     /* Adds a row with the specified contents to the Logical_Flow table. */
> 
> 

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

Reply via email to