]> git.kaiwu.me - haproxy.git/commitdiff
[BUG] ensure that we correctly re-start old process in case of error
authorWilly Tarreau <w@1wt.eu>
Tue, 9 Jun 2009 12:36:00 +0000 (14:36 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 27 Jul 2009 20:01:26 +0000 (22:01 +0200)
When a new process fails to grab some ports, it sends a signal to
the old process in order to release them. Then it tries to bind
again. If it still fails (eg: one of the ports is bound to a
completely different process), it must send the continue signal
to the old process so that this one re-binds to the ports. This
is correctly done, but the newly bound ports are not released
first, which sometimes causes the old process to remain running
with no port bound. The fix simply consists in unbinding all
ports before sending the signal to the old process.
(cherry picked from commit f68da4603a092f35af627c459dbc714d9fa796e9)
(cherry picked from commit f20cad6b3214f2b1b3db7fbeeecc0ef109185c2d)
(cherry picked from commit 83a1540ec51d20697b6c6f86e63dc5e82efc0b72)

src/haproxy.c

index 9aeb79871dd4f4de977b98d733da784e0af8c914..7804872f2fdcf538e77b301d9a427b69681b6683 100644 (file)
@@ -871,8 +871,10 @@ int main(int argc, char **argv)
 
        /* Note: start_proxies() sends an alert when it fails. */
        if ((err & ~ERR_WARN) != ERR_NONE) {
-               if (retry != MAX_START_RETRIES && nb_oldpids)
+               if (retry != MAX_START_RETRIES && nb_oldpids) {
+                       protocol_unbind_all(); /* cleanup everything we can */
                        tell_old_pids(SIGTTIN);
+               }
                exit(1);
        }