From: Willy Tarreau Date: Fri, 20 Dec 2019 16:18:13 +0000 (+0100) Subject: BUG/MEDIUM: state-file: do not allocate a full buffer for each server entry X-Git-Tag: v2.2-dev1~161 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d6a1fa311312bb99b98f548399fc30fc7802ad7;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/server.c b/src/server.c index 3465db97c3..718ca1c400 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 */