From: Frédéric Lécaille Date: Mon, 2 Sep 2019 12:02:28 +0000 (+0200) Subject: BUG/MEDIUM: peers: local peer socket not bound. X-Git-Tag: v2.1-dev2~122 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c3a0ceeacebbe9182a5b253e55d37611b98a809;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: peers: local peer socket not bound. This bug came with 015e4d7 commit: "MINOR: stick-tables: Add peers process binding computing" where the "stick" rules cases were missing when computing the peer local listener process binding. At parsing time we store in the stick-table struct ->proxies_list the proxies which refer to this stick-table. The process binding is computed after having parsed the entire configuration file with this simple loop in cfgparse.c: /* compute the required process bindings for the peers from * for all the stick-tables, the ones coming with "peers" sections included. */ for (t = stktables_list; t; t = t->next) { struct proxy *p; for (p = t->proxies_list; p; p = p->next_stkt_ref) { if (t->peers.p && t->peers.p->peers_fe) { t->peers.p->peers_fe->bind_proc |= p->bind_proc; } } } Note that if this process binding is not correctly initialized, the child forked by the master-worker stops the peer local listener. Should be also the case when daemonizing haproxy. Must be backported to 2.0. --- diff --git a/src/cfgparse.c b/src/cfgparse.c index ecf62f997c..9c2ac141ba 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -2726,6 +2726,10 @@ int check_config_validity() mrule->table.t = target; stktable_alloc_data_type(target, STKTABLE_DT_SERVER_ID, NULL); stktable_alloc_data_type(target, STKTABLE_DT_SERVER_NAME, NULL); + if (!in_proxies_list(target->proxies_list, curproxy)) { + curproxy->next_stkt_ref = target->proxies_list; + target->proxies_list = curproxy; + } } } @@ -2760,6 +2764,10 @@ int check_config_validity() mrule->table.t = target; stktable_alloc_data_type(target, STKTABLE_DT_SERVER_ID, NULL); stktable_alloc_data_type(target, STKTABLE_DT_SERVER_NAME, NULL); + if (!in_proxies_list(target->proxies_list, curproxy)) { + curproxy->next_stkt_ref = target->proxies_list; + target->proxies_list = curproxy; + } } }