mirror of
https://github.com/haproxy/haproxy.git
synced 2026-02-27 03:40:39 -05:00
BUG/MINOR: haproxy: Fix option to disable the fast-forward
The option was renamed to only permit to disable the fast-forward. First there is no reason to enable it because it is the default behavior. Then it introduced a bug because there is no way to be sure the command line has precedence over the configuration this way. So, the option is now named "tune.disable-fast-forward" and does not support any argument. And of course, the commande line option "-dF" has now precedence over the configuration. No backport needed.
This commit is contained in:
parent
d17dd848c4
commit
2f7c82bfdf
6 changed files with 24 additions and 38 deletions
|
|
@ -1123,7 +1123,7 @@ The following keywords are supported in the "global" section :
|
||||||
- tune.buffers.reserve
|
- tune.buffers.reserve
|
||||||
- tune.bufsize
|
- tune.bufsize
|
||||||
- tune.comp.maxlevel
|
- tune.comp.maxlevel
|
||||||
- tune.fast-forward
|
- tune.disable-fast-forward
|
||||||
- tune.fd.edge-triggered
|
- tune.fd.edge-triggered
|
||||||
- tune.h2.header-table-size
|
- tune.h2.header-table-size
|
||||||
- tune.h2.initial-window-size
|
- tune.h2.initial-window-size
|
||||||
|
|
@ -2832,23 +2832,22 @@ tune.comp.maxlevel <number>
|
||||||
Each session using compression initializes the compression algorithm with
|
Each session using compression initializes the compression algorithm with
|
||||||
this value. The default value is 1.
|
this value. The default value is 1.
|
||||||
|
|
||||||
|
tune.disable-fast-forward [ EXPERIMENTAL ]
|
||||||
|
Disables the data fast-forwarding. It is a mechanism to optimize the data
|
||||||
|
forwarding by passing data directly from a side to the other one without
|
||||||
|
waking the stream up. Thanks to this directive, it is possible to disable
|
||||||
|
this optimization. Note it also disable any kernel tcp splicing. This command
|
||||||
|
is not meant for regular use, it will generally only be suggested by
|
||||||
|
developers along complex debugging sessions. For this reason it is internally
|
||||||
|
marked as experimental, meaning that "expose-experimental-directives" must
|
||||||
|
appear on a line before this directive.
|
||||||
|
|
||||||
tune.fail-alloc
|
tune.fail-alloc
|
||||||
If compiled with DEBUG_FAIL_ALLOC or started with "-dMfail", gives the
|
If compiled with DEBUG_FAIL_ALLOC or started with "-dMfail", gives the
|
||||||
percentage of chances an allocation attempt fails. Must be between 0 (no
|
percentage of chances an allocation attempt fails. Must be between 0 (no
|
||||||
failure) and 100 (no success). This is useful to debug and make sure memory
|
failure) and 100 (no success). This is useful to debug and make sure memory
|
||||||
failures are handled gracefully.
|
failures are handled gracefully.
|
||||||
|
|
||||||
tune.fast-forward { on | off } [ EXPERIMENTAL ]
|
|
||||||
|
|
||||||
Enabled ('on') or disables ('off') the data fast-forwarding. It is a
|
|
||||||
mechanism to optimize the data forwarding by passing data directly from a
|
|
||||||
side to the other one without waking the stream up. Thanks to this directive,
|
|
||||||
it is possible to disable this optimization. Note it also disable any kernel
|
|
||||||
tcp splicing. This command is not meant for regular use, it will generally
|
|
||||||
only be suggested by developers along complex debugging sessions. For this
|
|
||||||
reason it is internally marked as experimental, meaning that
|
|
||||||
"expose-experimental-directives" must appear on a line before this directive.
|
|
||||||
|
|
||||||
tune.fd.edge-triggered { on | off } [ EXPERIMENTAL ]
|
tune.fd.edge-triggered { on | off } [ EXPERIMENTAL ]
|
||||||
Enables ('on') or disables ('off') the edge-triggered polling mode for FDs
|
Enables ('on') or disables ('off') the edge-triggered polling mode for FDs
|
||||||
that support it. This is currently only support with epoll. It may noticeably
|
that support it. This is currently only support with epoll. It may noticeably
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@
|
||||||
#define GTUNE_QUICK_EXIT (1<<23)
|
#define GTUNE_QUICK_EXIT (1<<23)
|
||||||
#define GTUNE_QUIC_SOCK_PER_CONN (1<<24)
|
#define GTUNE_QUIC_SOCK_PER_CONN (1<<24)
|
||||||
#define GTUNE_NO_QUIC (1<<25)
|
#define GTUNE_NO_QUIC (1<<25)
|
||||||
#define GTUNE_NO_FAST_FWD (1<<26)
|
#define GTUNE_USE_FAST_FWD (1<<26)
|
||||||
|
|
||||||
/* SSL server verify mode */
|
/* SSL server verify mode */
|
||||||
enum {
|
enum {
|
||||||
|
|
|
||||||
|
|
@ -493,7 +493,7 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (strcmp(args[0], "tune.fast-forward") == 0) {
|
else if (strcmp(args[0], "tune.disable-fast-forward") == 0) {
|
||||||
if (!experimental_directives_allowed) {
|
if (!experimental_directives_allowed) {
|
||||||
ha_alert("parsing [%s:%d] : '%s' directive is experimental, must be allowed via a global 'expose-experimental-directives'",
|
ha_alert("parsing [%s:%d] : '%s' directive is experimental, must be allowed via a global 'expose-experimental-directives'",
|
||||||
file, linenum, args[0]);
|
file, linenum, args[0]);
|
||||||
|
|
@ -502,24 +502,9 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm)
|
||||||
}
|
}
|
||||||
mark_tainted(TAINTED_CONFIG_EXP_KW_DECLARED);
|
mark_tainted(TAINTED_CONFIG_EXP_KW_DECLARED);
|
||||||
|
|
||||||
if (alertif_too_many_args(1, file, linenum, args, &err_code))
|
if (alertif_too_many_args(0, file, linenum, args, &err_code))
|
||||||
goto out;
|
goto out;
|
||||||
if (*(args[1]) == 0) {
|
global.tune.options &= GTUNE_USE_FAST_FWD;
|
||||||
ha_alert("parsing [%s:%d] : '%s' expects either 'on' or 'off' as argument.",
|
|
||||||
file, linenum, args[0]);
|
|
||||||
err_code |= ERR_ALERT | ERR_FATAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
if (strcmp(args[1], "on") == 0)
|
|
||||||
global.tune.options &= ~GTUNE_NO_FAST_FWD;
|
|
||||||
else if (strcmp(args[1], "off") == 0)
|
|
||||||
global.tune.options |= GTUNE_NO_FAST_FWD;
|
|
||||||
else {
|
|
||||||
ha_alert("parsing [%s:%d] : '%s' expects either 'on' or 'off' but got '%s'.",
|
|
||||||
file, linenum, args[0], args[1]);
|
|
||||||
err_code |= ERR_ALERT | ERR_FATAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (strcmp(args[0], "cluster-secret") == 0) {
|
else if (strcmp(args[0], "cluster-secret") == 0) {
|
||||||
if (alertif_too_many_args(1, file, linenum, args, &err_code))
|
if (alertif_too_many_args(1, file, linenum, args, &err_code))
|
||||||
|
|
|
||||||
|
|
@ -1598,6 +1598,8 @@ static void init_args(int argc, char **argv)
|
||||||
#endif
|
#endif
|
||||||
global.tune.options |= GTUNE_STRICT_LIMITS;
|
global.tune.options |= GTUNE_STRICT_LIMITS;
|
||||||
|
|
||||||
|
global.tune.options |= GTUNE_USE_FAST_FWD; /* Use fast-forward by default */
|
||||||
|
|
||||||
/* keep a copy of original arguments for the master process */
|
/* keep a copy of original arguments for the master process */
|
||||||
old_argv = copy_argv(argc, argv);
|
old_argv = copy_argv(argc, argv);
|
||||||
if (!old_argv) {
|
if (!old_argv) {
|
||||||
|
|
@ -1649,7 +1651,7 @@ static void init_args(int argc, char **argv)
|
||||||
global.tune.options &= ~GTUNE_USE_REUSEPORT;
|
global.tune.options &= ~GTUNE_USE_REUSEPORT;
|
||||||
#endif
|
#endif
|
||||||
else if (*flag == 'd' && flag[1] == 'F')
|
else if (*flag == 'd' && flag[1] == 'F')
|
||||||
global.tune.options |= GTUNE_NO_FAST_FWD;
|
global.tune.options &= ~GTUNE_USE_FAST_FWD;
|
||||||
else if (*flag == 'd' && flag[1] == 'V')
|
else if (*flag == 'd' && flag[1] == 'V')
|
||||||
global.ssl_server_verify = SSL_SERVER_VERIFY_NONE;
|
global.ssl_server_verify = SSL_SERVER_VERIFY_NONE;
|
||||||
else if (*flag == 'V')
|
else if (*flag == 'V')
|
||||||
|
|
|
||||||
|
|
@ -941,7 +941,7 @@ int http_request_forward_body(struct stream *s, struct channel *req, int an_bit)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
c_adv(req, htx->data - co_data(req));
|
c_adv(req, htx->data - co_data(req));
|
||||||
if (!(global.tune.options & GTUNE_NO_FAST_FWD) && (msg->flags & HTTP_MSGF_XFER_LEN))
|
if ((global.tune.options & GTUNE_USE_FAST_FWD) && (msg->flags & HTTP_MSGF_XFER_LEN))
|
||||||
channel_htx_forward_forever(req, htx);
|
channel_htx_forward_forever(req, htx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2044,7 +2044,7 @@ int http_response_forward_body(struct stream *s, struct channel *res, int an_bit
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
c_adv(res, htx->data - co_data(res));
|
c_adv(res, htx->data - co_data(res));
|
||||||
if (!(global.tune.options & GTUNE_NO_FAST_FWD) && (msg->flags & HTTP_MSGF_XFER_LEN))
|
if ((global.tune.options & GTUNE_USE_FAST_FWD) && (msg->flags & HTTP_MSGF_XFER_LEN))
|
||||||
channel_htx_forward_forever(res, htx);
|
channel_htx_forward_forever(res, htx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2258,7 +2258,7 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
|
||||||
* to the consumer.
|
* to the consumer.
|
||||||
*/
|
*/
|
||||||
co_set_data(req, htx->data);
|
co_set_data(req, htx->data);
|
||||||
if (!(global.tune.options & GTUNE_NO_FAST_FWD) && !(req->flags & (CF_SHUTR|CF_SHUTW_NOW)))
|
if ((global.tune.options & GTUNE_USE_FAST_FWD) && !(req->flags & (CF_SHUTR|CF_SHUTW_NOW)))
|
||||||
channel_htx_forward_forever(req, htx);
|
channel_htx_forward_forever(req, htx);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -2266,7 +2266,7 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
|
||||||
* to the consumer (which might possibly not be connected yet).
|
* to the consumer (which might possibly not be connected yet).
|
||||||
*/
|
*/
|
||||||
c_adv(req, ci_data(req));
|
c_adv(req, ci_data(req));
|
||||||
if (!(global.tune.options & GTUNE_NO_FAST_FWD) && !(req->flags & (CF_SHUTR|CF_SHUTW_NOW)))
|
if ((global.tune.options & GTUNE_USE_FAST_FWD) && !(req->flags & (CF_SHUTR|CF_SHUTW_NOW)))
|
||||||
channel_forward_forever(req);
|
channel_forward_forever(req);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2429,7 +2429,7 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
|
||||||
* to the consumer.
|
* to the consumer.
|
||||||
*/
|
*/
|
||||||
co_set_data(res, htx->data);
|
co_set_data(res, htx->data);
|
||||||
if (!(global.tune.options & GTUNE_NO_FAST_FWD) && !(res->flags & (CF_SHUTR|CF_SHUTW_NOW)))
|
if ((global.tune.options & GTUNE_USE_FAST_FWD) && !(res->flags & (CF_SHUTR|CF_SHUTW_NOW)))
|
||||||
channel_htx_forward_forever(res, htx);
|
channel_htx_forward_forever(res, htx);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
@ -2437,7 +2437,7 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
|
||||||
* to the consumer.
|
* to the consumer.
|
||||||
*/
|
*/
|
||||||
c_adv(res, ci_data(res));
|
c_adv(res, ci_data(res));
|
||||||
if (!(global.tune.options & GTUNE_NO_FAST_FWD) && !(res->flags & (CF_SHUTR|CF_SHUTW_NOW)))
|
if ((global.tune.options & GTUNE_USE_FAST_FWD) && !(res->flags & (CF_SHUTR|CF_SHUTW_NOW)))
|
||||||
channel_forward_forever(res);
|
channel_forward_forever(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue