1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00

ctdb: calculate queue input buffer size correctly

The queue's input buffer is calculated in an iterative way.
This can result in a few back and forth jumping and
a few memory allocations and mem-free cycles.
This is very time consuming and not required, because the required
memory size can be calculated right away.

Signed-off-by: Swen Schillig <swen@vnet.ibm.com>
Reviewed-by: Martin Schwenke <martin@meltin.net>
Reviewed-by: Jeremy Allison <jra@samba.org>

Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Sat Aug 18 04:58:05 CEST 2018 on sn-devel-144
This commit is contained in:
Swen Schillig 2018-03-07 13:54:45 +01:00 committed by Jeremy Allison
parent 8262efbc96
commit d0ed4a536e

View File

@ -43,7 +43,6 @@ struct ctdb_buffer {
uint8_t *data;
uint32_t length;
uint32_t size;
uint32_t extend;
};
struct ctdb_queue_pkt {
@ -102,16 +101,15 @@ static void queue_process(struct ctdb_queue *queue)
return;
}
/* Did we at least read the size into the buffer */
pkt_size = *(uint32_t *)queue->buffer.data;
if (pkt_size == 0) {
DEBUG(DEBUG_CRIT, ("Invalid packet of length 0\n"));
goto failed;
}
/* the buffer doesn't contain the full packet, return to get the rest */
if (queue->buffer.length < pkt_size) {
if (pkt_size > queue->buffer_size) {
queue->buffer.extend = pkt_size;
}
return;
}
@ -158,6 +156,7 @@ failed:
static void queue_io_read(struct ctdb_queue *queue)
{
int num_ready = 0;
uint32_t pkt_size;
ssize_t nread;
uint8_t *data;
@ -183,18 +182,28 @@ static void queue_io_read(struct ctdb_queue *queue)
goto failed;
}
queue->buffer.size = queue->buffer_size;
} else if (queue->buffer.extend > 0) {
/* extending buffer */
data = talloc_realloc_size(queue, queue->buffer.data, queue->buffer.extend);
goto data_read;
}
if (queue->buffer.length < sizeof(pkt_size)) {
/* data read is not sufficient to gather message size */
goto data_read;
}
pkt_size = *(uint32_t *)queue->buffer.data;
if (pkt_size > queue->buffer.size) {
data = talloc_realloc_size(queue,
queue->buffer.data,
pkt_size);
if (data == NULL) {
DEBUG(DEBUG_ERR, ("read error realloc failed for %u\n", queue->buffer.extend));
DBG_ERR("read error realloc failed for %u\n", pkt_size);
goto failed;
}
queue->buffer.data = data;
queue->buffer.size = queue->buffer.extend;
queue->buffer.extend = 0;
queue->buffer.size = pkt_size;
}
data_read:
num_ready = MIN(num_ready, queue->buffer.size - queue->buffer.length);
if (num_ready > 0) {