]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: peers: local peer socket not bound.
authorFrédéric Lécaille <flecaille@haproxy.com>
Mon, 2 Sep 2019 12:02:28 +0000 (14:02 +0200)
committerWilly Tarreau <w@1wt.eu>
Mon, 2 Sep 2019 12:39:38 +0000 (14:39 +0200)
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 <stktables_list>
      * 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.

src/cfgparse.c

index ecf62f997c688f70de40c0142b77ff104380961c..9c2ac141baaf33fbddd43b3bb780ad00d7fe812d 100644 (file)
@@ -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;
+                               }
                        }
                }