[PATCH] ctdb-server: Update ctdb_daemon_call_send_remote mem handling
Swen Schillig
swen at vnet.ibm.com
Wed Jan 31 12:30:14 UTC 2018
Please review.
Thanks.
Cheers Swen.
-------------- next part --------------
From d1b257077d9a5ea69266d17e4c0305c0b7e1fbcd Mon Sep 17 00:00:00 2001
From: Swen Schillig <swen at vnet.ibm.com>
Date: Wed, 31 Jan 2018 11:00:52 +0100
Subject: [PATCH] ctdb-server: Update ctdb_daemon_call_send_remote mem handling
Use talloc_object_pool for repeating consecutive memory allocations.
Signed-off-by: Swen Schillig <swen at vnet.ibm.com>
---
ctdb/server/ctdb_call.c | 63 +++++++++++++++++++++++++++----------------------
1 file changed, 35 insertions(+), 28 deletions(-)
diff --git a/ctdb/server/ctdb_call.c b/ctdb/server/ctdb_call.c
index 95b6c53c1d4..97f9850a726 100644
--- a/ctdb/server/ctdb_call.c
+++ b/ctdb/server/ctdb_call.c
@@ -1462,52 +1462,59 @@ struct ctdb_call_state *ctdb_daemon_call_send_remote(struct ctdb_db_context *ctd
struct ctdb_call *call,
struct ctdb_ltdb_header *header)
{
- uint32_t len;
+ uint32_t transport_len;
struct ctdb_call_state *state;
struct ctdb_context *ctdb = ctdb_db->ctdb;
+ struct ctdb_req_call_old *c;
if (ctdb->methods == NULL) {
DEBUG(DEBUG_INFO,(__location__ " Failed send packet. Transport is down\n"));
return NULL;
}
- state = talloc_zero(ctdb_db, struct ctdb_call_state);
+ transport_len = offsetof(struct ctdb_req_call_old, data) +
+ call->key.dsize + call->call_data.dsize;
+
+ state = talloc_pooled_object(ctdb, struct ctdb_call_state, 2,
+ transport_len + sizeof(struct ctdb_call));
+
CTDB_NO_MEMORY_NULL(ctdb, state);
- state->call = talloc(state, struct ctdb_call);
+ memset(state, 0, sizeof(struct ctdb_call_state));
+
+ state->call = talloc_memdup(state, call, sizeof(struct ctdb_call));
CTDB_NO_MEMORY_NULL(ctdb, state->call);
state->reqid = reqid_new(ctdb->idr, state);
state->ctdb_db = ctdb_db;
- talloc_set_destructor(state, ctdb_call_destructor);
+ state->state = CTDB_CALL_WAIT;
+ state->generation = ctdb_db->generation;
- len = offsetof(struct ctdb_req_call_old, data) + call->key.dsize + call->call_data.dsize;
- state->c = ctdb_transport_allocate(ctdb, state, CTDB_REQ_CALL, len,
- struct ctdb_req_call_old);
- CTDB_NO_MEMORY_NULL(ctdb, state->c);
- state->c->hdr.destnode = header->dmaster;
+ c = ctdb_transport_allocate(ctdb, state, CTDB_REQ_CALL, transport_len,
+ struct ctdb_req_call_old);
+ CTDB_NO_MEMORY_NULL(ctdb, c);
+ state->c = c;
- /* this limits us to 16k outstanding messages - not unreasonable */
- state->c->hdr.reqid = state->reqid;
- state->c->hdr.generation = ctdb_db->generation;
- state->c->flags = call->flags;
- state->c->db_id = ctdb_db->db_id;
- state->c->callid = call->call_id;
- state->c->hopcount = 0;
- state->c->keylen = call->key.dsize;
- state->c->calldatalen = call->call_data.dsize;
- memcpy(&state->c->data[0], call->key.dptr, call->key.dsize);
- memcpy(&state->c->data[call->key.dsize],
- call->call_data.dptr, call->call_data.dsize);
- *(state->call) = *call;
- state->call->call_data.dptr = &state->c->data[call->key.dsize];
- state->call->key.dptr = &state->c->data[0];
+ c->hdr.destnode = header->dmaster;
- state->state = CTDB_CALL_WAIT;
- state->generation = ctdb_db->generation;
+ /* this limits us to 16k outstanding messages - not unreasonable */
+ c->hdr.reqid = state->reqid;
+ c->hdr.generation = ctdb_db->generation;
+ c->flags = call->flags;
+ c->db_id = ctdb_db->db_id;
+ c->callid = call->call_id;
+ c->hopcount = 0;
+ c->keylen = call->key.dsize;
+ c->calldatalen = call->call_data.dsize;
+ memcpy(&c->data[0], call->key.dptr, call->key.dsize);
+ memcpy(&c->data[call->key.dsize], call->call_data.dptr,
+ call->call_data.dsize);
+
+ state->call->call_data.dptr = &c->data[call->key.dsize];
+ state->call->key.dptr = &c->data[0];
DLIST_ADD(ctdb_db->pending_calls, state);
-
- ctdb_queue_packet(ctdb, &state->c->hdr);
+ talloc_set_destructor(state, ctdb_call_destructor);
+ ctdb_queue_packet(ctdb, &c->hdr);
return state;
}
--
2.14.3
More information about the samba-technical
mailing list