]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MINOR: haproxy: Fix option to disable the fast-forward
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 20 Feb 2023 13:06:52 +0000 (14:06 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Tue, 21 Feb 2023 10:44:55 +0000 (11:44 +0100)
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.

doc/configuration.txt
include/haproxy/global-t.h
src/cfgparse-global.c
src/haproxy.c
src/http_ana.c
src/stream.c

index 3b1e29a25cc5d58d35bf590b8bd88bff0f553326..b13b97ced800d0e766cd732949c70376efc90441 100644 (file)
@@ -1123,7 +1123,7 @@ The following keywords are supported in the "global" section :
    - tune.buffers.reserve
    - tune.bufsize
    - tune.comp.maxlevel
-   - tune.fast-forward
+   - tune.disable-fast-forward
    - tune.fd.edge-triggered
    - tune.h2.header-table-size
    - tune.h2.initial-window-size
@@ -2832,23 +2832,22 @@ tune.comp.maxlevel <number>
   Each session using compression initializes the compression algorithm with
   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
   If compiled with DEBUG_FAIL_ALLOC or started with "-dMfail", gives the
   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
   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 ]
   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
index c0ccc812e0ce6107ceb902bc6904b8fe7a25b56f..b7b00bab035ce955ddd0acdcea72c46fd203f1d1 100644 (file)
@@ -80,7 +80,7 @@
 #define GTUNE_QUICK_EXIT         (1<<23)
 #define GTUNE_QUIC_SOCK_PER_CONN (1<<24)
 #define GTUNE_NO_QUIC            (1<<25)
-#define GTUNE_NO_FAST_FWD        (1<<26)
+#define GTUNE_USE_FAST_FWD       (1<<26)
 
 /* SSL server verify mode */
 enum {
index 542ddd0d1805e69b8eb87f170b77f37c78fdb73c..e46672e15961c22c7dd8d4f517be98d84f87f4c1 100644 (file)
@@ -493,7 +493,7 @@ int cfg_parse_global(const char *file, int linenum, char **args, int kwm)
                        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) {
                        ha_alert("parsing [%s:%d] : '%s' directive is experimental, must be allowed via a global 'expose-experimental-directives'",
                                 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);
 
-               if (alertif_too_many_args(1, file, linenum, args, &err_code))
-                       goto out;
-               if (*(args[1]) == 0) {
-                       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;
+               if (alertif_too_many_args(0, file, linenum, args, &err_code))
                        goto out;
-               }
+               global.tune.options &= GTUNE_USE_FAST_FWD;
        }
        else if (strcmp(args[0], "cluster-secret") == 0) {
                if (alertif_too_many_args(1, file, linenum, args, &err_code))
index 804e092d2930942ea4a1c4c6d204f40a216e4a8d..3025d5afe640e4391cd6655475689e82c41bfe73 100644 (file)
@@ -1598,6 +1598,8 @@ static void init_args(int argc, char **argv)
 #endif
        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 */
        old_argv = copy_argv(argc, argv);
        if (!old_argv) {
@@ -1649,7 +1651,7 @@ static void init_args(int argc, char **argv)
                                global.tune.options &= ~GTUNE_USE_REUSEPORT;
 #endif
                        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')
                                global.ssl_server_verify = SSL_SERVER_VERIFY_NONE;
                        else if (*flag == 'V')
index e5b85670693ccf82ab72efec8eb18cb59fd02644..cb7cb27b63e55e38937d5d0da1d1a69b3ddb9015 100644 (file)
@@ -941,7 +941,7 @@ int http_request_forward_body(struct stream *s, struct channel *req, int an_bit)
        }
        else {
                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);
        }
 
@@ -2044,7 +2044,7 @@ int http_response_forward_body(struct stream *s, struct channel *res, int an_bit
        }
        else {
                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);
        }
 
index 3a9784ef53eee18374f6f14b7083b08d2457fe81..8f58e0d67b70d94db18fb5ad52d7c57bd58d9e76 100644 (file)
@@ -2258,7 +2258,7 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
                         * to the consumer.
                         */
                        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);
                }
                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).
                         */
                        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);
                }
        }
@@ -2429,7 +2429,7 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
                         * to the consumer.
                         */
                        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);
                }
                else {
@@ -2437,7 +2437,7 @@ struct task *process_stream(struct task *t, void *context, unsigned int state)
                         * to the consumer.
                         */
                        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);
                }