ctdb: Adding memory pool for queue callback
authorSwen Schillig <swen@vnet.ibm.com>
Mon, 12 Mar 2018 16:56:21 +0000 (17:56 +0100)
committerChristof Schmitt <cs@samba.org>
Fri, 7 Dec 2018 22:27:16 +0000 (23:27 +0100)
The received packet is copied into a newly allocated memory chunk for further
processing by the assigned callback. Once this is done, the memory is free'd.
This is repeated for each received packet making the memory allocation / free
an expensive task. To optimize this process, a memory pool is defined which
is sized identically to the queue's buffer.
During tests it could be seen that more than 95% of all messages were sized
below the standard buffer_size of 1k.

Signed-off-by: Swen Schillig <swen@vnet.ibm.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Christof Schmitt <cs@samba.org>
Autobuild-User(master): Christof Schmitt <cs@samba.org>
Autobuild-Date(master): Fri Dec  7 23:27:16 CET 2018 on sn-devel-144

ctdb/common/ctdb_io.c

index 5bed7a6..d865407 100644 (file)
@@ -65,6 +65,7 @@ struct ctdb_queue {
        size_t alignment;
        void *private_data;
        ctdb_queue_cb_fn_t callback;
+       TALLOC_CTX *data_pool;
        const char *name;
        uint32_t buffer_size;
 };
@@ -115,7 +116,7 @@ static void queue_process(struct ctdb_queue *queue)
        }
 
        /* Extract complete packet */
-       data = talloc_memdup(queue,
+       data = talloc_memdup(queue->data_pool,
                             queue->buffer.data + queue->buffer.offset,
                             pkt_size);
 
@@ -479,5 +480,11 @@ struct ctdb_queue *ctdb_queue_setup(struct ctdb_context *ctdb,
                queue->buffer_size = 1024;
        }
 
+       queue->data_pool = talloc_pool(queue, queue->buffer_size);
+       if (queue->data_pool == NULL) {
+               TALLOC_FREE(queue);
+               return NULL;
+       }
+
        return queue;
 }