From fa73e6b0d5f64eb8a6fd8a1706d7ec03293a943e Mon Sep 17 00:00:00 2001
|
|
From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20L=C3=A9caille?= <flecaille@haproxy.com>
|
|
Date: Thu, 13 Jul 2017 09:07:09 +0200
|
|
Subject: [PATCH 01/18] BUG/MINOR: peers: peer synchronization issue (with
|
|
several peers sections).
|
|
|
|
When several stick-tables were configured with several peers sections,
|
|
only a part of them could be synchronized: the ones attached to the last
|
|
parsed 'peers' section. This was due to the fact that, at least, the peer I/O handler
|
|
refered to the wrong peer section list, in fact always the same: the last one parsed.
|
|
|
|
The fact that the global peer section list was named "struct peers *peers"
|
|
lead to this issue. This variable name is dangerous ;).
|
|
|
|
So this patch renames global 'peers' variable to 'cfg_peers' to ensure that
|
|
no such wrong references are still in use, then all the functions wich used
|
|
old 'peers' variable have been modified to refer to the correct peer list.
|
|
|
|
Must be backported to 1.6 and 1.7.
|
|
(cherry picked from commit ed2b4a6b793d062000518e51ed71e014c649c313)
|
|
|
|
Signed-off-by: Willy Tarreau <w@1wt.eu>
|
|
---
|
|
include/types/peers.h | 2 +-
|
|
src/cfgparse.c | 18 +++++++++---------
|
|
src/haproxy.c | 10 +++++-----
|
|
src/peers.c | 40 ++++++++++++++++++++--------------------
|
|
src/proxy.c | 6 +++---
|
|
5 files changed, 38 insertions(+), 38 deletions(-)
|
|
|
|
diff --git a/include/types/peers.h b/include/types/peers.h
|
|
index 105dffb0..a77a0942 100644
|
|
--- a/include/types/peers.h
|
|
+++ b/include/types/peers.h
|
|
@@ -91,7 +91,7 @@ struct peers {
|
|
};
|
|
|
|
|
|
-extern struct peers *peers;
|
|
+extern struct peers *cfg_peers;
|
|
|
|
#endif /* _TYPES_PEERS_H */
|
|
|
|
diff --git a/src/cfgparse.c b/src/cfgparse.c
|
|
index 8c0906bf..1b53006b 100644
|
|
--- a/src/cfgparse.c
|
|
+++ b/src/cfgparse.c
|
|
@@ -2124,7 +2124,7 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm)
|
|
goto out;
|
|
}
|
|
|
|
- for (curpeers = peers; curpeers != NULL; curpeers = curpeers->next) {
|
|
+ for (curpeers = cfg_peers; curpeers != NULL; curpeers = curpeers->next) {
|
|
/*
|
|
* If there are two proxies with the same name only following
|
|
* combinations are allowed:
|
|
@@ -2142,8 +2142,8 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm)
|
|
goto out;
|
|
}
|
|
|
|
- curpeers->next = peers;
|
|
- peers = curpeers;
|
|
+ curpeers->next = cfg_peers;
|
|
+ cfg_peers = curpeers;
|
|
curpeers->conf.file = strdup(file);
|
|
curpeers->conf.line = linenum;
|
|
curpeers->last_change = now.tv_sec;
|
|
@@ -2223,7 +2223,7 @@ int cfg_parse_peers(const char *file, int linenum, char **args, int kwm)
|
|
if (strcmp(newpeer->id, localpeer) == 0) {
|
|
/* Current is local peer, it define a frontend */
|
|
newpeer->local = 1;
|
|
- peers->local = newpeer;
|
|
+ cfg_peers->local = newpeer;
|
|
|
|
if (!curpeers->peers_fe) {
|
|
if ((curpeers->peers_fe = calloc(1, sizeof(struct proxy))) == NULL) {
|
|
@@ -8189,9 +8189,9 @@ int check_config_validity()
|
|
}
|
|
|
|
if (curproxy->table.peers.name) {
|
|
- struct peers *curpeers = peers;
|
|
+ struct peers *curpeers;
|
|
|
|
- for (curpeers = peers; curpeers; curpeers = curpeers->next) {
|
|
+ for (curpeers = cfg_peers; curpeers; curpeers = curpeers->next) {
|
|
if (strcmp(curpeers->id, curproxy->table.peers.name) == 0) {
|
|
free((void *)curproxy->table.peers.name);
|
|
curproxy->table.peers.p = curpeers;
|
|
@@ -9279,15 +9279,15 @@ out_uri_auth_compat:
|
|
if (curproxy->table.peers.p)
|
|
curproxy->table.peers.p->peers_fe->bind_proc |= curproxy->bind_proc;
|
|
|
|
- if (peers) {
|
|
- struct peers *curpeers = peers, **last;
|
|
+ if (cfg_peers) {
|
|
+ struct peers *curpeers = cfg_peers, **last;
|
|
struct peer *p, *pb;
|
|
|
|
/* Remove all peers sections which don't have a valid listener,
|
|
* which are not used by any table, or which are bound to more
|
|
* than one process.
|
|
*/
|
|
- last = &peers;
|
|
+ last = &cfg_peers;
|
|
while (*last) {
|
|
curpeers = *last;
|
|
|
|
diff --git a/src/haproxy.c b/src/haproxy.c
|
|
index 6d09aed4..25cea0cd 100644
|
|
--- a/src/haproxy.c
|
|
+++ b/src/haproxy.c
|
|
@@ -988,7 +988,7 @@ void init(int argc, char **argv)
|
|
struct peers *pr;
|
|
struct proxy *px;
|
|
|
|
- for (pr = peers; pr; pr = pr->next)
|
|
+ for (pr = cfg_peers; pr; pr = pr->next)
|
|
if (pr->peers_fe)
|
|
break;
|
|
|
|
@@ -1217,11 +1217,11 @@ void init(int argc, char **argv)
|
|
if (global.stats_fe)
|
|
global.maxsock += global.stats_fe->maxconn;
|
|
|
|
- if (peers) {
|
|
+ if (cfg_peers) {
|
|
/* peers also need to bypass global maxconn */
|
|
- struct peers *p = peers;
|
|
+ struct peers *p = cfg_peers;
|
|
|
|
- for (p = peers; p; p = p->next)
|
|
+ for (p = cfg_peers; p; p = p->next)
|
|
if (p->peers_fe)
|
|
global.maxsock += p->peers_fe->maxconn;
|
|
}
|
|
@@ -2067,7 +2067,7 @@ int main(int argc, char **argv)
|
|
}
|
|
|
|
/* we might have to unbind some peers sections from some processes */
|
|
- for (curpeers = peers; curpeers; curpeers = curpeers->next) {
|
|
+ for (curpeers = cfg_peers; curpeers; curpeers = curpeers->next) {
|
|
if (!curpeers->peers_fe)
|
|
continue;
|
|
|
|
diff --git a/src/peers.c b/src/peers.c
|
|
index 543c84c1..5b8a287a 100644
|
|
--- a/src/peers.c
|
|
+++ b/src/peers.c
|
|
@@ -171,7 +171,7 @@ enum {
|
|
#define PEER_MINOR_VER 1
|
|
#define PEER_DWNGRD_MINOR_VER 0
|
|
|
|
-struct peers *peers = NULL;
|
|
+struct peers *cfg_peers = NULL;
|
|
static void peer_session_forceshutdown(struct appctx *appctx);
|
|
|
|
/* This function encode an uint64 to 'dynamic' length format.
|
|
@@ -727,19 +727,19 @@ switchstate:
|
|
/* if current peer is local */
|
|
if (curpeer->local) {
|
|
/* if current host need resyncfrom local and no process assined */
|
|
- if ((peers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMLOCAL &&
|
|
- !(peers->flags & PEERS_F_RESYNC_ASSIGN)) {
|
|
+ if ((curpeers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMLOCAL &&
|
|
+ !(curpeers->flags & PEERS_F_RESYNC_ASSIGN)) {
|
|
/* assign local peer for a lesson, consider lesson already requested */
|
|
curpeer->flags |= PEER_F_LEARN_ASSIGN;
|
|
- peers->flags |= (PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
|
|
+ curpeers->flags |= (PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
|
|
}
|
|
|
|
}
|
|
- else if ((peers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMREMOTE &&
|
|
- !(peers->flags & PEERS_F_RESYNC_ASSIGN)) {
|
|
+ else if ((curpeers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMREMOTE &&
|
|
+ !(curpeers->flags & PEERS_F_RESYNC_ASSIGN)) {
|
|
/* assign peer for a lesson */
|
|
curpeer->flags |= PEER_F_LEARN_ASSIGN;
|
|
- peers->flags |= PEERS_F_RESYNC_ASSIGN;
|
|
+ curpeers->flags |= PEERS_F_RESYNC_ASSIGN;
|
|
}
|
|
|
|
|
|
@@ -807,7 +807,7 @@ switchstate:
|
|
curpeer->statuscode = atoi(trash.str);
|
|
|
|
/* Awake main task */
|
|
- task_wakeup(peers->sync_task, TASK_WOKEN_MSG);
|
|
+ task_wakeup(curpeers->sync_task, TASK_WOKEN_MSG);
|
|
|
|
/* If status code is success */
|
|
if (curpeer->statuscode == PEER_SESS_SC_SUCCESSCODE) {
|
|
@@ -830,14 +830,14 @@ switchstate:
|
|
curpeer->flags |= PEER_F_TEACH_PROCESS;
|
|
|
|
}
|
|
- else if ((peers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMREMOTE &&
|
|
- !(peers->flags & PEERS_F_RESYNC_ASSIGN)) {
|
|
+ else if ((curpeers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FROMREMOTE &&
|
|
+ !(curpeers->flags & PEERS_F_RESYNC_ASSIGN)) {
|
|
/* If peer is remote and resync from remote is needed,
|
|
and no peer currently assigned */
|
|
|
|
/* assign peer for a lesson */
|
|
curpeer->flags |= PEER_F_LEARN_ASSIGN;
|
|
- peers->flags |= PEERS_F_RESYNC_ASSIGN;
|
|
+ curpeers->flags |= PEERS_F_RESYNC_ASSIGN;
|
|
}
|
|
|
|
}
|
|
@@ -950,8 +950,8 @@ switchstate:
|
|
|
|
if (curpeer->flags & PEER_F_LEARN_ASSIGN) {
|
|
curpeer->flags &= ~PEER_F_LEARN_ASSIGN;
|
|
- peers->flags &= ~(PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
|
|
- peers->flags |= (PEERS_F_RESYNC_LOCAL|PEERS_F_RESYNC_REMOTE);
|
|
+ curpeers->flags &= ~(PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
|
|
+ curpeers->flags |= (PEERS_F_RESYNC_LOCAL|PEERS_F_RESYNC_REMOTE);
|
|
}
|
|
curpeer->confirm++;
|
|
}
|
|
@@ -959,11 +959,11 @@ switchstate:
|
|
|
|
if (curpeer->flags & PEER_F_LEARN_ASSIGN) {
|
|
curpeer->flags &= ~PEER_F_LEARN_ASSIGN;
|
|
- peers->flags &= ~(PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
|
|
+ curpeers->flags &= ~(PEERS_F_RESYNC_ASSIGN|PEERS_F_RESYNC_PROCESS);
|
|
|
|
curpeer->flags |= PEER_F_LEARN_NOTUP2DATE;
|
|
- peers->resync_timeout = tick_add(now_ms, MS_TO_TICKS(5000));
|
|
- task_wakeup(peers->sync_task, TASK_WOKEN_MSG);
|
|
+ curpeers->resync_timeout = tick_add(now_ms, MS_TO_TICKS(5000));
|
|
+ task_wakeup(curpeers->sync_task, TASK_WOKEN_MSG);
|
|
}
|
|
curpeer->confirm++;
|
|
}
|
|
@@ -1334,8 +1334,8 @@ incomplete:
|
|
|
|
/* Need to request a resync */
|
|
if ((curpeer->flags & PEER_F_LEARN_ASSIGN) &&
|
|
- (peers->flags & PEERS_F_RESYNC_ASSIGN) &&
|
|
- !(peers->flags & PEERS_F_RESYNC_PROCESS)) {
|
|
+ (curpeers->flags & PEERS_F_RESYNC_ASSIGN) &&
|
|
+ !(curpeers->flags & PEERS_F_RESYNC_PROCESS)) {
|
|
unsigned char msg[2];
|
|
|
|
/* Current peer was elected to request a resync */
|
|
@@ -1351,7 +1351,7 @@ incomplete:
|
|
appctx->st0 = PEER_SESS_ST_END;
|
|
goto switchstate;
|
|
}
|
|
- peers->flags |= PEERS_F_RESYNC_PROCESS;
|
|
+ curpeers->flags |= PEERS_F_RESYNC_PROCESS;
|
|
}
|
|
|
|
/* Nothing to read, now we start to write */
|
|
@@ -1624,7 +1624,7 @@ incomplete:
|
|
|
|
/* Current peer was elected to request a resync */
|
|
msg[0] = PEER_MSG_CLASS_CONTROL;
|
|
- msg[1] = ((peers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FINISHED) ? PEER_MSG_CTRL_RESYNCFINISHED : PEER_MSG_CTRL_RESYNCPARTIAL;
|
|
+ msg[1] = ((curpeers->flags & PEERS_RESYNC_STATEMASK) == PEERS_RESYNC_FINISHED) ? PEER_MSG_CTRL_RESYNCFINISHED : PEER_MSG_CTRL_RESYNCPARTIAL;
|
|
/* process final lesson message */
|
|
repl = bi_putblk(si_ic(si), (char *)msg, sizeof(msg));
|
|
if (repl <= 0) {
|
|
diff --git a/src/proxy.c b/src/proxy.c
|
|
index 78120d9b..bedc7ae0 100644
|
|
--- a/src/proxy.c
|
|
+++ b/src/proxy.c
|
|
@@ -1007,7 +1007,7 @@ void soft_stop(void)
|
|
p = p->next;
|
|
}
|
|
|
|
- prs = peers;
|
|
+ prs = cfg_peers;
|
|
while (prs) {
|
|
if (prs->peers_fe)
|
|
stop_proxy(prs->peers_fe);
|
|
@@ -1142,7 +1142,7 @@ void pause_proxies(void)
|
|
p = p->next;
|
|
}
|
|
|
|
- prs = peers;
|
|
+ prs = cfg_peers;
|
|
while (prs) {
|
|
if (prs->peers_fe)
|
|
err |= !pause_proxy(prs->peers_fe);
|
|
@@ -1176,7 +1176,7 @@ void resume_proxies(void)
|
|
p = p->next;
|
|
}
|
|
|
|
- prs = peers;
|
|
+ prs = cfg_peers;
|
|
while (prs) {
|
|
if (prs->peers_fe)
|
|
err |= !resume_proxy(prs->peers_fe);
|
|
--
|
|
2.13.0
|
|
|