MINOR: cfgparse: parse tune.recv_enough as a size

Till now this value was parsed as raw integer using atol() and would
silently ignore any trailing suffix, causing unexpected behaviors when
set, e.g. to "512k". Let's make use of parse_size_err() on it so that
units are supported. This requires to turn it to uint as well, and
since it's sometimes compared to an int, we limit its range to
0..INT_MAX.
This commit is contained in:
Willy Tarreau 2024-11-18 19:01:28 +01:00
parent a90a7d4d60
commit 2f0c6ff3a5
3 changed files with 10 additions and 3 deletions

View File

@ -4111,7 +4111,7 @@ tune.rcvbuf.server <size>
order to save kernel memory by preventing it from buffering too large amounts order to save kernel memory by preventing it from buffering too large amounts
of received data. Lower values will significantly increase CPU usage though. of received data. Lower values will significantly increase CPU usage though.
tune.recv_enough <number> tune.recv_enough <size>
HAProxy uses some hints to detect that a short read indicates the end of the HAProxy uses some hints to detect that a short read indicates the end of the
socket buffers. One of them is that a read returns more than <recv_enough> socket buffers. One of them is that a read returns more than <recv_enough>
bytes, which defaults to 10136 (7 segments of 1448 each). This default value bytes, which defaults to 10136 (7 segments of 1448 each). This default value

View File

@ -164,7 +164,7 @@ struct global {
int maxaccept; /* max number of consecutive accept() */ int maxaccept; /* max number of consecutive accept() */
int options; /* various tuning options */ int options; /* various tuning options */
int runqueue_depth;/* max number of tasks to run at once */ int runqueue_depth;/* max number of tasks to run at once */
int recv_enough; /* how many input bytes at once are "enough" */ uint recv_enough; /* how many input bytes at once are "enough" */
int bufsize; /* buffer size in bytes, defaults to BUFSIZE */ int bufsize; /* buffer size in bytes, defaults to BUFSIZE */
int bufsize_small; /* small buffer size in bytes */ int bufsize_small; /* small buffer size in bytes */
int maxrewrite; /* buffer max rewrite size in bytes, defaults to MAXREWRITE */ int maxrewrite; /* buffer max rewrite size in bytes, defaults to MAXREWRITE */

View File

@ -1179,7 +1179,14 @@ static int cfg_parse_global_tune_opts(char **args, int section_type,
memprintf(err, "'%s' expects an integer argument.", args[0]); memprintf(err, "'%s' expects an integer argument.", args[0]);
return -1; return -1;
} }
global.tune.recv_enough = atol(args[1]); res = parse_size_err(args[1], &global.tune.recv_enough);
if (res != NULL)
goto size_err;
if (global.tune.recv_enough > INT_MAX) {
memprintf(err, "'%s' expects a size in bytes from 0 to %d.", args[0], INT_MAX);
return -1;
}
return 0; return 0;
} }