[PATCH] s3: Reduce number of memcopy calls for db_ctdb_marshall_add
Swen Schillig
swen at vnet.ibm.com
Mon Apr 30 08:25:27 UTC 2018
Please review and push if happy.
Cheers Swen
-------------- next part --------------
From 6e7634e78d0b0844fd7f9fda942b1687cb319952 Mon Sep 17 00:00:00 2001
From: Swen Schillig <swen at vnet.ibm.com>
Date: Tue, 24 Apr 2018 12:55:10 +0200
Subject: [PATCH] s3: Reduce number of memcopy calls for db_ctdb_marshall_add
Reduce number of memcopy calls for db_ctdb_marshall_add and remove
the now obsoloete function db_ctdb_marshall_record.
Signed-off-by: Swen Schillig <swen at vnet.ibm.com>
---
source3/lib/dbwrap/dbwrap_ctdb.c | 80 ++++++++++++++--------------------------
1 file changed, 27 insertions(+), 53 deletions(-)
diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c
index 2885f4e7fda..51191384b84 100644
--- a/source3/lib/dbwrap/dbwrap_ctdb.c
+++ b/source3/lib/dbwrap/dbwrap_ctdb.c
@@ -198,35 +198,6 @@ static NTSTATUS db_ctdb_ltdb_store(struct db_ctdb_ctx *db,
}
-/*
- form a ctdb_rec_data record from a key/data pair
- */
-static struct ctdb_rec_data_old *db_ctdb_marshall_record(TALLOC_CTX *mem_ctx, uint32_t reqid,
- TDB_DATA key,
- struct ctdb_ltdb_header *header,
- TDB_DATA data)
-{
- size_t length;
- struct ctdb_rec_data_old *d;
-
- length = offsetof(struct ctdb_rec_data_old, data) + key.dsize +
- data.dsize + sizeof(*header);
- d = (struct ctdb_rec_data_old *)talloc_size(mem_ctx, length);
- if (d == NULL) {
- return NULL;
- }
- d->length = length;
- d->reqid = reqid;
- d->keylen = key.dsize;
- memcpy(&d->data[0], key.dptr, key.dsize);
-
- d->datalen = data.dsize + sizeof(*header);
- memcpy(&d->data[key.dsize], header, sizeof(*header));
- memcpy(&d->data[key.dsize+sizeof(*header)], data.dptr, data.dsize);
- return d;
-}
-
-
/* helper function for marshalling multiple records */
static struct ctdb_marshall_buffer *db_ctdb_marshall_add(TALLOC_CTX *mem_ctx,
struct ctdb_marshall_buffer *m,
@@ -236,41 +207,44 @@ static struct ctdb_marshall_buffer *db_ctdb_marshall_add(TALLOC_CTX *mem_ctx,
struct ctdb_ltdb_header *header,
TDB_DATA data)
{
- struct ctdb_rec_data_old *r;
- size_t m_size, r_size;
struct ctdb_marshall_buffer *m2 = NULL;
+ struct ctdb_rec_data_old *r = NULL;
+ const size_t h_size = sizeof(*header);
+ size_t m_size;
+ size_t r_size;
- r = db_ctdb_marshall_record(talloc_tos(), reqid, key, header, data);
- if (r == NULL) {
- talloc_free(m);
- return NULL;
- }
+ r_size = offsetof(struct ctdb_rec_data_old, data) + data.dsize + h_size;
if (m == NULL) {
- m = (struct ctdb_marshall_buffer *)talloc_zero_size(
- mem_ctx, offsetof(struct ctdb_marshall_buffer, data));
- if (m == NULL) {
- goto done;
- }
- m->db_id = db_id;
- }
+ m_size = offsetof(struct ctdb_marshall_buffer, data);
+ m2 = (struct ctdb_marshall_buffer *)
+ talloc_zero_size(mem_ctx, m_size + r_size);
- m_size = talloc_get_size(m);
- r_size = talloc_get_size(r);
+ if (m2 == NULL) {
+ return NULL;
+ }
+ m2->db_id = db_id;
+ } else {
+ m_size = talloc_get_size(m);
+ m2 = (struct ctdb_marshall_buffer *)
+ talloc_realloc_size(mem_ctx, m, m_size + r_size);
- m2 = (struct ctdb_marshall_buffer *)talloc_realloc_size(
- mem_ctx, m, m_size + r_size);
- if (m2 == NULL) {
- talloc_free(m);
- goto done;
+ if (m2 == NULL) {
+ TALLOC_FREE(m);
+ return NULL;
+ }
}
- memcpy(m_size + (uint8_t *)m2, r, r_size);
+ r = (struct ctdb_rec_data_old *)m2->data;
+ r->length += data.dsize + h_size;
+ r->reqid = reqid;
+ r->keylen = key.dsize;
+
+ memcpy(m2 + m_size, header, h_size);
+ memcpy(m2 + m_size + h_size, r, r_size);
m2->count++;
-done:
- talloc_free(r);
return m2;
}
--
2.14.3
More information about the samba-technical
mailing list