summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorIlya Maximets <i.maximets@ovn.org>2021-09-22 09:28:50 +0200
committerIlya Maximets <i.maximets@ovn.org>2021-09-24 15:53:46 +0200
commit429b114c5aadee24ccfb16ad7d824f45cdcea75a (patch)
treef8127a8d5164bcd9571442718b42e41632c09a58 /tests
parent32b51326ef9c307b4acd0bacafb0218dd1372f3d (diff)
downloadopenvswitch-429b114c5aadee24ccfb16ad7d824f45cdcea75a.tar.gz
ovsdb-data: Deduplicate string atoms.
ovsdb-server spends a lot of time cloning atoms for various reasons, e.g. to create a diff of two rows or to clone a row to the transaction. All atoms, except for strings, contains a simple value that could be copied in efficient way, but duplicating strings every time has a significant performance impact. Introducing a new reference-counted structure 'ovsdb_atom_string' that allows to not copy strings every time, but just increase a reference counter. This change allows to increase transaction throughput in benchmarks up to 2x for standalone databases and 3x for clustered databases, i.e. number of transactions that ovsdb-server can handle per second. It also noticeably reduces memory consumption of ovsdb-server. Next step will be to consolidate this structure with json strings, so we will not need to duplicate strings while converting database objects to json and back. Signed-off-by: Ilya Maximets <i.maximets@ovn.org> Acked-by: Dumitru Ceara <dceara@redhat.com> Acked-by: Mark D. Gray <mark.d.gray@redhat.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/test-ovsdb.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/tests/test-ovsdb.c b/tests/test-ovsdb.c
index 86d75dfd9..432977159 100644
--- a/tests/test-ovsdb.c
+++ b/tests/test-ovsdb.c
@@ -2744,13 +2744,15 @@ print_idl_row_simple2(const struct idltest_simple2 *s, int step)
printf("%03d: name=%s smap=[",
step, s->name);
for (i = 0; i < smap->n; i++) {
- printf("[%s : %s]%s", smap->keys[i].string, smap->values[i].string,
- i < smap->n-1? ",": "");
+ printf("[%s : %s]%s",
+ smap->keys[i].s->string, smap->values[i].s->string,
+ i < smap->n - 1 ? "," : "");
}
printf("] imap=[");
for (i = 0; i < imap->n; i++) {
- printf("[%"PRId64" : %s]%s", imap->keys[i].integer, imap->values[i].string,
- i < imap->n-1? ",":"");
+ printf("[%"PRId64" : %s]%s",
+ imap->keys[i].integer, imap->values[i].s->string,
+ i < imap->n - 1 ? "," : "");
}
printf("]\n");
}
@@ -2819,8 +2821,8 @@ do_idl_partial_update_map_column(struct ovs_cmdl_context *ctx)
myTxn = ovsdb_idl_txn_create(idl);
smap = idltest_simple2_get_smap(myRow, OVSDB_TYPE_STRING,
OVSDB_TYPE_STRING);
- strcpy(key_to_delete, smap->keys[0].string);
- idltest_simple2_update_smap_delkey(myRow, smap->keys[0].string);
+ ovs_strlcpy(key_to_delete, smap->keys[0].s->string, sizeof key_to_delete);
+ idltest_simple2_update_smap_delkey(myRow, smap->keys[0].s->string);
ovsdb_idl_txn_commit_block(myTxn);
ovsdb_idl_txn_destroy(myTxn);
ovsdb_idl_get_initial_snapshot(idl);