MEDIUM: backend: implement "http-reuse safe"
The "safe" mode consists in picking existing connections only when processing a request that's not the first one from a connection. This ensures that in case where the server finally times out and closes, the client can decide to replay idempotent requests.
This commit is contained in:
parent
efb90f9dd3
commit
161d45ffc7
@ -1046,8 +1046,9 @@ int connect_server(struct stream *s)
|
||||
*/
|
||||
}
|
||||
|
||||
if ((s->be->options & PR_O_REUSE_MASK) == PR_O_REUSE_ALWS &&
|
||||
!LIST_ISEMPTY(&srv->idle_conns)) {
|
||||
if (((s->be->options & PR_O_REUSE_MASK) == PR_O_REUSE_ALWS ||
|
||||
((s->be->options & PR_O_REUSE_MASK) == PR_O_REUSE_SAFE && s->txn && (s->txn->flags & TX_NOT_FIRST)))
|
||||
&& !LIST_ISEMPTY(&srv->idle_conns)) {
|
||||
/* We're going to have to pick the first connection
|
||||
* from this pool and use it for our purposes. We may
|
||||
* have to get rid of the current idle connection, so
|
||||
|
@ -5035,6 +5035,13 @@ stats_error_parsing:
|
||||
if (alertif_too_many_args_idx(0, 1, file, linenum, args, &err_code))
|
||||
goto out;
|
||||
}
|
||||
else if (strcmp(args[1], "safe") == 0) {
|
||||
/* enable a graceful server shutdown on an HTTP 404 response */
|
||||
curproxy->options &= ~PR_O_REUSE_MASK;
|
||||
curproxy->options |= PR_O_REUSE_SAFE;
|
||||
if (alertif_too_many_args_idx(0, 1, file, linenum, args, &err_code))
|
||||
goto out;
|
||||
}
|
||||
else if (strcmp(args[1], "always") == 0) {
|
||||
/* enable a graceful server shutdown on an HTTP 404 response */
|
||||
curproxy->options &= ~PR_O_REUSE_MASK;
|
||||
@ -5043,7 +5050,7 @@ stats_error_parsing:
|
||||
goto out;
|
||||
}
|
||||
else {
|
||||
Alert("parsing [%s:%d] : '%s' only supports 'never', 'always'.\n", file, linenum, args[0]);
|
||||
Alert("parsing [%s:%d] : '%s' only supports 'never', 'safe', 'always'.\n", file, linenum, args[0]);
|
||||
err_code |= ERR_ALERT | ERR_FATAL;
|
||||
goto out;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user