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.
This commit is contained in:
Willy Tarreau 2019-12-20 17:18:13 +01:00
parent b3814c2ca8
commit 7d6a1fa311

View File

@ -3627,11 +3627,11 @@ void apply_server_state(void)
chunk_printf(&trash, "%s %s", bkname, srvname); chunk_printf(&trash, "%s %s", bkname, srvname);
/* store line in tree */ /* store line in tree */
st = calloc(1, sizeof(*st) + trash.size); st = calloc(1, sizeof(*st) + trash.data + 1);
if (st == NULL) { if (st == NULL) {
goto nextline; 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); ebst_insert(&state_file, &st->name_name);
/* save line */ /* save line */