[PATCH] ctdb: Optimize ctdb_call_local memory handling

Swen Schillig swen at vnet.ibm.com
Wed Jan 31 08:31:56 UTC 2018


Hi

Another patch to optimize some memory handling for CTDB.

Please review.

Thanks !

Cheers Swen
-------------- next part --------------
From 1941aa04d1c4cfefa38b846680dd7ef51ceb7c7b Mon Sep 17 00:00:00 2001
From: Swen Schillig <swen at vnet.ibm.com>
Date: Wed, 31 Jan 2018 09:25:04 +0100
Subject: [PATCH] ctdb: Optimize ctdb_call_local memory handling

Use talloc_object_pool for repeating consecutive
memory allocations.
Replace talloc_steal / copy sequences by talloc_move.

Signed-off-by: Swen Schillig <swen at vnet.ibm.com>
---
 ctdb/client/ctdb_client.c | 25 ++++++++++++-------------
 ctdb/server/ctdb_call.c   | 13 +++++++------
 2 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/ctdb/client/ctdb_client.c b/ctdb/client/ctdb_client.c
index df847844176..44c22f58b75 100644
--- a/ctdb/client/ctdb_client.c
+++ b/ctdb/client/ctdb_client.c
@@ -85,15 +85,14 @@ int ctdb_call_local(struct ctdb_db_context *ctdb_db, struct ctdb_call *call,
 	struct ctdb_call_info *c;
 	struct ctdb_registered_call *fn;
 	struct ctdb_context *ctdb = ctdb_db->ctdb;
-	
-	c = talloc(ctdb, struct ctdb_call_info);
+
+	c = talloc(mem_ctx, struct ctdb_call_info);
 	CTDB_NO_MEMORY(ctdb, c);
 
 	c->key = call->key;
 	c->call_data = &call->call_data;
-	c->record_data.dptr = talloc_memdup(c, data->dptr, data->dsize);
+	c->record_data.dptr = talloc_move(c, &data->dptr);
 	c->record_data.dsize = data->dsize;
-	CTDB_NO_MEMORY(ctdb, c->record_data.dptr);
 	c->new_data = NULL;
 	c->reply_data = NULL;
 	c->status = 0;
@@ -129,9 +128,8 @@ int ctdb_call_local(struct ctdb_db_context *ctdb_db, struct ctdb_call *call,
 	}
 
 	if (c->reply_data) {
-		call->reply_data = *c->reply_data;
-
-		talloc_steal(call, call->reply_data.dptr);
+		call->reply_data.dsize = c->reply_data->dsize;
+		call->reply_data.dptr = talloc_move(call, &c->reply_data->dptr);
 		talloc_set_name_const(call->reply_data.dptr, __location__);
 	} else {
 		call->reply_data.dptr = NULL;
@@ -391,16 +389,17 @@ static struct ctdb_client_call_state *ctdb_client_call_local_send(struct ctdb_db
 	struct ctdb_context *ctdb = ctdb_db->ctdb;
 	int ret;
 
-	state = talloc_zero(ctdb_db, struct ctdb_client_call_state);
-	CTDB_NO_MEMORY_NULL(ctdb, state);
-	state->call = talloc_zero(state, struct ctdb_call);
-	CTDB_NO_MEMORY_NULL(ctdb, state->call);
+	state = talloc_pooled_object(ctdb_db, struct ctdb_client_call_state, 3,
+				     sizeof(struct ctdb_call) + data->dsize +
+				     sizeof(struct ctdb_call_info));
 
-	talloc_steal(state, data->dptr);
+	CTDB_NO_MEMORY_NULL(ctdb, state);
+	memset(state, 0, sizeof(struct ctdb_client_call_state));
 
 	state->state   = CTDB_CALL_DONE;
-	*(state->call) = *call;
 	state->ctdb_db = ctdb_db;
+	state->call = talloc_memdup(state, call, sizeof(struct ctdb_call));
+	CTDB_NO_MEMORY_NULL(ctdb, state->call);
 
 	ret = ctdb_call_local(ctdb_db, state->call, header, state, data, true);
 	if (ret != 0) {
diff --git a/ctdb/server/ctdb_call.c b/ctdb/server/ctdb_call.c
index 17d6f98e37c..95b6c53c1d4 100644
--- a/ctdb/server/ctdb_call.c
+++ b/ctdb/server/ctdb_call.c
@@ -1428,16 +1428,17 @@ struct ctdb_call_state *ctdb_call_local_send(struct ctdb_db_context *ctdb_db,
 	struct ctdb_context *ctdb = ctdb_db->ctdb;
 	int ret;
 
-	state = talloc_zero(ctdb_db, struct ctdb_call_state);
-	CTDB_NO_MEMORY_NULL(ctdb, state);
+	state = talloc_pooled_object(ctdb_db, struct ctdb_call_state, 3,
+				     sizeof(struct ctdb_call) + data->dsize +
+				     sizeof(struct ctdb_call_info));
 
-	talloc_steal(state, data->dptr);
+	CTDB_NO_MEMORY_NULL(ctdb, state);
+	memset(state, 0, sizeof(struct ctdb_call_state));
 
 	state->state = CTDB_CALL_DONE;
-	state->call  = talloc(state, struct ctdb_call);
-	CTDB_NO_MEMORY_NULL(ctdb, state->call);
-	*(state->call) = *call;
 	state->ctdb_db = ctdb_db;
+	state->call  = talloc_memdup(state, call, sizeof(struct ctdb_call));
+	CTDB_NO_MEMORY_NULL(ctdb, state->call);
 
 	ret = ctdb_call_local(ctdb_db, state->call, header, state, data, true);
 	if (ret != 0) {
-- 
2.14.3



More information about the samba-technical mailing list