[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