[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