[PATCH] s3: Reduce number of memcopy calls for db_ctdb_marshall_add
Swen Schillig
swen at vnet.ibm.com
Mon Apr 30 13:52:57 UTC 2018
Fixed wrong size calculation.
Please review.
Cheers Swen.
-------------- next part --------------
From c4aab84a21c7397e4e2cf7d49dea96567deb27b9 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 | 82 ++++++++++++++--------------------------
1 file changed, 29 insertions(+), 53 deletions(-)
diff --git a/source3/lib/dbwrap/dbwrap_ctdb.c b/source3/lib/dbwrap/dbwrap_ctdb.c
index 2885f4e7fda..10e443752c6 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,46 @@ 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);
+ const uint32_t datalen = h_size + data.dsize;
+ 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) + datalen;
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 + m_size);
+ r->length = r_size + key.dsize;
+ r->reqid = reqid;
+ r->keylen = key.dsize;
+ r->datalen = datalen;
+
+ memcpy(r->data, header, h_size);
+ memcpy(&r->data[h_size], data.dptr, data.dsize);
m2->count++;
-done:
- talloc_free(r);
return m2;
}
--
2.14.3
More information about the samba-technical
mailing list