diff options
author | Ilya Maximets <i.maximets@ovn.org> | 2021-12-19 15:09:40 +0100 |
---|---|---|
committer | Ilya Maximets <i.maximets@ovn.org> | 2022-03-03 15:25:55 +0100 |
commit | 015994d37fa441844f9c0890109074b06e64e7d0 (patch) | |
tree | 3d26a19b1ff3ee6853bb226af61bbd12be2334c2 /ovsdb | |
parent | a3e97b1af1bdcaa802c6caa9e73087df7077d2b1 (diff) | |
download | openvswitch-015994d37fa441844f9c0890109074b06e64e7d0.tar.gz |
ovsdb: row: Optimize row updates by applying diffs in-place.
ovsdb_datum_apply_diff_in_place() is much faster than the usual
ovsdb_datum_apply_diff() in most cases, because it doesn't clone or
compare unnecessary data. Since the original destination datum is
destroyed anyway, we might use the faster function here to speed up
transaction processing.
ovsdb_row_update_columns() with xor is mainly used by relay databases.
So, this change should improve their performance.
Acked-by: Mike Pattrick <mkp@redhat.com>
Acked-by: Han Zhou <hzhou@ovn.org>
Signed-off-by: Ilya Maximets <i.maximets@ovn.org>
Diffstat (limited to 'ovsdb')
-rw-r--r-- | ovsdb/row.c | 16 |
1 files changed, 5 insertions, 11 deletions
diff --git a/ovsdb/row.c b/ovsdb/row.c index e83c60a21..40f53b0a5 100644 --- a/ovsdb/row.c +++ b/ovsdb/row.c @@ -244,24 +244,18 @@ ovsdb_row_update_columns(struct ovsdb_row *dst, for (i = 0; i < columns->n_columns; i++) { const struct ovsdb_column *column = columns->columns[i]; - struct ovsdb_datum xor_datum; struct ovsdb_error *error; if (xor) { - error = ovsdb_datum_apply_diff(&xor_datum, - &dst->fields[column->index], - &src->fields[column->index], - &column->type); + error = ovsdb_datum_apply_diff_in_place( + &dst->fields[column->index], + &src->fields[column->index], + &column->type); if (error) { return error; } - } - - ovsdb_datum_destroy(&dst->fields[column->index], &column->type); - - if (xor) { - ovsdb_datum_swap(&dst->fields[column->index], &xor_datum); } else { + ovsdb_datum_destroy(&dst->fields[column->index], &column->type); ovsdb_datum_clone(&dst->fields[column->index], &src->fields[column->index], &column->type); |