mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 22:31:28 +02:00
BUG/MEDIUM: resume from LI_ASSIGNED in default_resume_listener()
Since fc974887c ("MEDIUM: protocol: explicitly start the receiver before the listener"), resume from LI_ASSIGNED state does not work anymore. This is because the binding part has been divided into 2 distinct steps since: first bind(), then listen(). This new logic was properly implemented in startup sequence through protocol_bind_all() but wasn't properly reported in default_resume_listener() function. Fixing default_resume_listener() to comply with the new logic. This should help ABNS sockets to properly rebind in resume_listener() after they have been stopped by pause_listener(): See Redmine:4475 for more context. This commit depends on: - "MINOR: listener: workaround for closing a tiny race between resume_listener() and stopping" - "MINOR: listener: make sure we don't pause/resume bypassed listeners" This could be backported up to 2.4 after a reasonable observation period to make sure that this change doesn't cause unwanted side-effects.
This commit is contained in:
parent
3bb2a38f01
commit
046a75e131
@ -427,8 +427,28 @@ int default_resume_listener(struct listener *l)
|
|||||||
|
|
||||||
if (l->state == LI_ASSIGNED) {
|
if (l->state == LI_ASSIGNED) {
|
||||||
char msg[100];
|
char msg[100];
|
||||||
|
char *errmsg;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
/* first, try to bind the receiver */
|
||||||
|
err = l->rx.proto->fam->bind(&l->rx, &errmsg);
|
||||||
|
if (err != ERR_NONE) {
|
||||||
|
if (err & ERR_WARN)
|
||||||
|
ha_warning("Resuming listener: %s\n", errmsg);
|
||||||
|
else if (err & ERR_ALERT)
|
||||||
|
ha_alert("Resuming listener: %s\n", errmsg);
|
||||||
|
ha_free(&errmsg);
|
||||||
|
if (err & (ERR_FATAL | ERR_ABORT)) {
|
||||||
|
ret = 0;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* then, try to listen:
|
||||||
|
* for now there's still always a listening function
|
||||||
|
* (same check performed in protocol_bind_all()
|
||||||
|
*/
|
||||||
|
BUG_ON(!l->rx.proto->listen);
|
||||||
err = l->rx.proto->listen(l, msg, sizeof(msg));
|
err = l->rx.proto->listen(l, msg, sizeof(msg));
|
||||||
if (err & ERR_ALERT)
|
if (err & ERR_ALERT)
|
||||||
ha_alert("Resuming listener: %s\n", msg);
|
ha_alert("Resuming listener: %s\n", msg);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user