]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: listener: don't report an error when resuming unbound listeners
authorWilly Tarreau <w@1wt.eu>
Tue, 14 Apr 2015 10:07:16 +0000 (12:07 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 14 Apr 2015 10:10:06 +0000 (12:10 +0200)
Pavlos Parissis reported that a sequence of disable/enable on a frontend
performed on the CLI can result in an error if the frontend has several
"bind" lines each bound to different processes. This is because the
resume_listener() function returns a failure for frontends not part of
the current process instead of returning a success to pretend there was
no failure.

This fix should be backported to 1.5.

src/listener.c

index 86f5d5a99c2c16376268131a53b74134f6072f9b..017dcff4b1b909605639f97ff499d79739bfa426 100644 (file)
@@ -121,9 +121,10 @@ int pause_listener(struct listener *l)
  * may replace enable_listener(). The resulting state will either be LI_READY
  * or LI_FULL. 0 is returned in case of failure to resume (eg: dead socket).
  * Listeners bound to a different process are not woken up unless we're in
- * foreground mode. If the listener was only in the assigned state, it's totally
- * rebound. This can happen if a pause() has completely stopped it. If the
- * resume fails, 0 is returned and an error might be displayed.
+ * foreground mode, and are ignored. If the listener was only in the assigned
+ * state, it's totally rebound. This can happen if a pause() has completely
+ * stopped it. If the resume fails, 0 is returned and an error might be
+ * displayed.
  */
 int resume_listener(struct listener *l)
 {
@@ -147,7 +148,7 @@ int resume_listener(struct listener *l)
        if ((global.mode & (MODE_DAEMON | MODE_SYSTEMD)) &&
            l->bind_conf->bind_proc &&
            !(l->bind_conf->bind_proc & (1UL << (relative_pid - 1))))
-               return 0;
+               return 1;
 
        if (l->proto->sock_prot == IPPROTO_TCP &&
            l->state == LI_PAUSED &&