From 7d6a1fa311312bb99b98f548399fc30fc7802ad7 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Fri, 20 Dec 2019 17:18:13 +0100 Subject: [PATCH] BUG/MEDIUM: state-file: do not allocate a full buffer for each server entry Starting haproxy with a state file of 700k servers eats 11.2 GB of RAM due to a mistake in the function that loads the strings into a tree: it allocates a full buffer for each backend+server name instead of allocating just the required string. By just fixing this we're down to 80 MB. This should be backported to 2.1. --- src/server.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/server.c b/src/server.c index 3465db97c..718ca1c40 100644 --- a/src/server.c +++ b/src/server.c @@ -3627,11 +3627,11 @@ void apply_server_state(void) chunk_printf(&trash, "%s %s", bkname, srvname); /* store line in tree */ - st = calloc(1, sizeof(*st) + trash.size); + st = calloc(1, sizeof(*st) + trash.data + 1); if (st == NULL) { goto nextline; } - memcpy(st->name_name.key, trash.area, trash.size); + memcpy(st->name_name.key, trash.area, trash.data + 1); ebst_insert(&state_file, &st->name_name); /* save line */