- tune.buffers.reserve
- tune.bufsize
- tune.comp.maxlevel
+ - tune.fast-forward
- tune.fd.edge-triggered
- tune.h2.header-table-size
- tune.h2.initial-window-size
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
"tune.idletimer", "tune.rcvbuf.client", "tune.rcvbuf.server",
"tune.sndbuf.client", "tune.sndbuf.server", "tune.pipesize",
"tune.http.cookielen", "tune.http.logurilen", "tune.http.maxhdr",
- "tune.comp.maxlevel", "tune.pattern.cache-size", "uid", "gid",
+ "tune.comp.maxlevel", "tune.pattern.cache-size",
+ "tune.fast-forward", "uid", "gid",
"external-check", "user", "group", "nbproc", "maxconn",
"ssl-server-verify", "maxconnrate", "maxsessrate", "maxsslrate",
"maxcomprate", "maxpipes", "maxzlibmem", "maxcompcpuusage", "ulimit-n",
goto out;
}
}
+ else if (strcmp(args[0], "tune.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]);
+ err_code |= ERR_ALERT | ERR_FATAL;
+ goto out;
+ }
+ 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;
+ goto out;
+ }
+ }
else if (strcmp(args[0], "cluster-secret") == 0) {
if (alertif_too_many_args(1, file, linenum, args, &err_code))
goto out;
}
else {
c_adv(req, htx->data - co_data(req));
- if (msg->flags & HTTP_MSGF_XFER_LEN)
+ if (!(global.tune.options & GTUNE_NO_FAST_FWD) && (msg->flags & HTTP_MSGF_XFER_LEN))
channel_htx_forward_forever(req, htx);
}
}
else {
c_adv(res, htx->data - co_data(res));
- if (msg->flags & HTTP_MSGF_XFER_LEN)
+ if (!(global.tune.options & GTUNE_NO_FAST_FWD) && (msg->flags & HTTP_MSGF_XFER_LEN))
channel_htx_forward_forever(res, htx);
}
* to the consumer.
*/
co_set_data(req, htx->data);
- if (!(req->flags & (CF_SHUTR|CF_SHUTW_NOW)))
+ if (!(global.tune.options & GTUNE_NO_FAST_FWD) && !(req->flags & (CF_SHUTR|CF_SHUTW_NOW)))
channel_htx_forward_forever(req, htx);
}
else {
* to the consumer (which might possibly not be connected yet).
*/
c_adv(req, ci_data(req));
- if (!(req->flags & (CF_SHUTR|CF_SHUTW_NOW)))
+ if (!(global.tune.options & GTUNE_NO_FAST_FWD) && !(req->flags & (CF_SHUTR|CF_SHUTW_NOW)))
channel_forward_forever(req);
}
}
* to the consumer.
*/
co_set_data(res, htx->data);
- if (!(res->flags & (CF_SHUTR|CF_SHUTW_NOW)))
+ if (!(global.tune.options & GTUNE_NO_FAST_FWD) && !(res->flags & (CF_SHUTR|CF_SHUTW_NOW)))
channel_htx_forward_forever(res, htx);
}
else {
* to the consumer.
*/
c_adv(res, ci_data(res));
- if (!(res->flags & (CF_SHUTR|CF_SHUTW_NOW)))
+ if (!(global.tune.options & GTUNE_NO_FAST_FWD) && !(res->flags & (CF_SHUTR|CF_SHUTW_NOW)))
channel_forward_forever(res);
}