On 12/29/23 17:28, Mike Pattrick wrote:
> On Sun, Dec 17, 2023 at 9:03 PM Ilya Maximets <[email protected]> wrote:
>>
>> While reassessing weak references the code attempts to collect added
>> and removed atoms, even if the column didn't change. In case the
>> column contains a large set, it may take significant amount of time
>> to process.
>>
>> Add a check for the column actually being changed either by removing
>> references to deleted rows or by direct removal.
>>
>> For example, rows in OVN Port_Group tables frequently have two large
>> sets - 'ports' and 'acls'. In case a new ACL is added to the set
>> without changing the ports, ports don't need to be reassessed.
>>
>> Fixes: 4dbff9f0a685 ("ovsdb: transaction: Incremental reassessment of weak
>> refs.")
>> Signed-off-by: Ilya Maximets <[email protected]>
>> ---
>> ovsdb/transaction.c | 18 +++++++++++-------
>> 1 file changed, 11 insertions(+), 7 deletions(-)
>>
>> diff --git a/ovsdb/transaction.c b/ovsdb/transaction.c
>> index bbe4cddc1..a482588a0 100644
>> --- a/ovsdb/transaction.c
>> +++ b/ovsdb/transaction.c
>> @@ -745,13 +745,17 @@ assess_weak_refs(struct ovsdb_txn *txn, struct
>> ovsdb_txn_row *txn_row)
>> ovsdb_datum_destroy(&deleted_refs, &column->type);
>>
>> /* Generating the difference between old and new data. */
>> - if (txn_row->old) {
>> - ovsdb_datum_added_removed(&added, &removed,
>> - &txn_row->old->fields[column->index],
>> - datum, &column->type);
>> - } else {
>> - ovsdb_datum_init_empty(&removed);
>> - ovsdb_datum_clone(&added, datum);
>> + ovsdb_datum_init_empty(&added);
>> + ovsdb_datum_init_empty(&removed);
>
> Nit: Why init these here if they will be overwritten in
> ovsdb_datum_added_removed and ovsdb_datum_clone? Couldn't this be
> included in an else?
We could do that, it just seems a little less error-prone this way.
We'll need to initialize both in the common 'else' and also initialize
'removed' in the clone case, i.e.:
if (datum->n != orig_n
|| bitmap_is_set(txn_row->changed, column->index)) {
if (txn_row->old) {
ovsdb_datum_added_removed(&added, &removed,
&txn_row->old->fields[column->index],
datum, &column->type);
} else {
ovsdb_datum_init_empty(&removed);
ovsdb_datum_clone(&added, datum);
}
} else {
ovsdb_datum_init_empty(&added);
ovsdb_datum_init_empty(&removed);
}
I don't think the initialization here is performance-critical, so
I went with a slightly easier to read solution, that also saves
a couple lines of code. But I have no real objections for the
'else' variant above, if you think it is better.
What's your opinion?
>
> Otherwise, looks good!
>
> Acked-by: Mike Pattrick <[email protected]>
>
>> + if (datum->n != orig_n
>> + || bitmap_is_set(txn_row->changed, column->index)) {
>> + if (txn_row->old) {
>> + ovsdb_datum_added_removed(&added, &removed,
>> +
>> &txn_row->old->fields[column->index],
>> + datum, &column->type);
>> + } else {
>> + ovsdb_datum_clone(&added, datum);
>> + }
>> }
>>
>> /* Checking added data and creating new references. */
>> --
>> 2.43.0
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev