Accepting request 602894 from network:ha-clustering:Factory
OBS-URL: https://build.opensuse.org/request/show/602894 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/corosync?expand=0&rev=59
This commit is contained in:
commit
7fdcbec5b5
289
0012-cpg-Inform-clients-about-left-nodes-during-pause.patch
Normal file
289
0012-cpg-Inform-clients-about-left-nodes-during-pause.patch
Normal file
@ -0,0 +1,289 @@
|
|||||||
|
Subject: [PATCH] cpg: Inform clients about left nodes during pause
|
||||||
|
|
||||||
|
Patch tries to fix incorrect behaviour during following test-case:
|
||||||
|
- 3 nodes
|
||||||
|
- Node 1 is paused
|
||||||
|
- Node 2 and 3 detects node 1 as failed and informs CPG clients
|
||||||
|
- Node 1 is unpaused
|
||||||
|
- Node 1 clients are informed about new membership, but not about Node 1
|
||||||
|
being paused, so from Node 1 point-of-view, Node 2 and 3 failure
|
||||||
|
|
||||||
|
Solution is to:
|
||||||
|
- Remove downlist master choose and always choose local node downlist.
|
||||||
|
For Node 1 in example above, downlist contains Node 2 and 3.
|
||||||
|
- Keep code which informs clients about left nodes
|
||||||
|
- Use joinlist as a authoritative source of nodes/clients which exists
|
||||||
|
in membership
|
||||||
|
|
||||||
|
---
|
||||||
|
exec/cpg.c | 164 +++++--------------------------------------------------------
|
||||||
|
1 file changed, 11 insertions(+), 153 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/exec/cpg.c b/exec/cpg.c
|
||||||
|
index 78ac1e9e..b851cba3 100644
|
||||||
|
--- a/exec/cpg.c
|
||||||
|
+++ b/exec/cpg.c
|
||||||
|
@@ -139,13 +139,6 @@ enum cpg_sync_state {
|
||||||
|
CPGSYNC_JOINLIST
|
||||||
|
};
|
||||||
|
|
||||||
|
-enum cpg_downlist_state_e {
|
||||||
|
- CPG_DOWNLIST_NONE,
|
||||||
|
- CPG_DOWNLIST_WAITING_FOR_MESSAGES,
|
||||||
|
- CPG_DOWNLIST_APPLYING,
|
||||||
|
-};
|
||||||
|
-static enum cpg_downlist_state_e downlist_state;
|
||||||
|
-static struct list_head downlist_messages_head;
|
||||||
|
static struct list_head joinlist_messages_head;
|
||||||
|
|
||||||
|
struct cpg_pd {
|
||||||
|
@@ -295,9 +288,7 @@ static int cpg_exec_send_downlist(void);
|
||||||
|
|
||||||
|
static int cpg_exec_send_joinlist(void);
|
||||||
|
|
||||||
|
-static void downlist_messages_delete (void);
|
||||||
|
-
|
||||||
|
-static void downlist_master_choose_and_send (void);
|
||||||
|
+static void downlist_inform_clients (void);
|
||||||
|
|
||||||
|
static void joinlist_inform_clients (void);
|
||||||
|
|
||||||
|
@@ -499,14 +490,6 @@ struct req_exec_cpg_downlist {
|
||||||
|
mar_uint32_t nodeids[PROCESSOR_COUNT_MAX] __attribute__((aligned(8)));
|
||||||
|
};
|
||||||
|
|
||||||
|
-struct downlist_msg {
|
||||||
|
- mar_uint32_t sender_nodeid;
|
||||||
|
- mar_uint32_t old_members __attribute__((aligned(8)));
|
||||||
|
- mar_uint32_t left_nodes __attribute__((aligned(8)));
|
||||||
|
- mar_uint32_t nodeids[PROCESSOR_COUNT_MAX] __attribute__((aligned(8)));
|
||||||
|
- struct list_head list;
|
||||||
|
-};
|
||||||
|
-
|
||||||
|
struct joinlist_msg {
|
||||||
|
mar_uint32_t sender_nodeid;
|
||||||
|
uint32_t pid;
|
||||||
|
@@ -566,8 +549,6 @@ static void cpg_sync_init (
|
||||||
|
last_sync_ring_id.nodeid = ring_id->rep.nodeid;
|
||||||
|
last_sync_ring_id.seq = ring_id->seq;
|
||||||
|
|
||||||
|
- downlist_state = CPG_DOWNLIST_WAITING_FOR_MESSAGES;
|
||||||
|
-
|
||||||
|
entries = 0;
|
||||||
|
/*
|
||||||
|
* Determine list of nodeids for downlist message
|
||||||
|
@@ -611,14 +592,10 @@ static void cpg_sync_activate (void)
|
||||||
|
my_member_list_entries * sizeof (unsigned int));
|
||||||
|
my_old_member_list_entries = my_member_list_entries;
|
||||||
|
|
||||||
|
- if (downlist_state == CPG_DOWNLIST_WAITING_FOR_MESSAGES) {
|
||||||
|
- downlist_master_choose_and_send ();
|
||||||
|
- }
|
||||||
|
+ downlist_inform_clients ();
|
||||||
|
|
||||||
|
joinlist_inform_clients ();
|
||||||
|
|
||||||
|
- downlist_messages_delete ();
|
||||||
|
- downlist_state = CPG_DOWNLIST_NONE;
|
||||||
|
joinlist_messages_delete ();
|
||||||
|
|
||||||
|
notify_lib_totem_membership (NULL, my_member_list_entries, my_member_list);
|
||||||
|
@@ -626,8 +603,7 @@ static void cpg_sync_activate (void)
|
||||||
|
|
||||||
|
static void cpg_sync_abort (void)
|
||||||
|
{
|
||||||
|
- downlist_state = CPG_DOWNLIST_NONE;
|
||||||
|
- downlist_messages_delete ();
|
||||||
|
+
|
||||||
|
joinlist_messages_delete ();
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -800,76 +776,17 @@ static int notify_lib_joinlist(
|
||||||
|
return CS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void downlist_log(const char *msg, struct downlist_msg* dl)
|
||||||
|
+static void downlist_log(const char *msg, struct req_exec_cpg_downlist *dl)
|
||||||
|
{
|
||||||
|
log_printf (LOG_DEBUG,
|
||||||
|
- "%s: sender %s; members(old:%d left:%d)",
|
||||||
|
+ "%s: members(old:%d left:%d)",
|
||||||
|
msg,
|
||||||
|
- api->totem_ifaces_print(dl->sender_nodeid),
|
||||||
|
dl->old_members,
|
||||||
|
dl->left_nodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static struct downlist_msg* downlist_master_choose (void)
|
||||||
|
+static void downlist_inform_clients (void)
|
||||||
|
{
|
||||||
|
- struct downlist_msg *cmp;
|
||||||
|
- struct downlist_msg *best = NULL;
|
||||||
|
- struct list_head *iter;
|
||||||
|
- uint32_t cmp_members;
|
||||||
|
- uint32_t best_members;
|
||||||
|
- uint32_t i;
|
||||||
|
- int ignore_msg;
|
||||||
|
-
|
||||||
|
- for (iter = downlist_messages_head.next;
|
||||||
|
- iter != &downlist_messages_head;
|
||||||
|
- iter = iter->next) {
|
||||||
|
-
|
||||||
|
- cmp = list_entry(iter, struct downlist_msg, list);
|
||||||
|
- downlist_log("comparing", cmp);
|
||||||
|
-
|
||||||
|
- ignore_msg = 0;
|
||||||
|
- for (i = 0; i < cmp->left_nodes; i++) {
|
||||||
|
- if (cmp->nodeids[i] == api->totem_nodeid_get()) {
|
||||||
|
- log_printf (LOG_DEBUG, "Ignoring this entry because I'm in the left list\n");
|
||||||
|
-
|
||||||
|
- ignore_msg = 1;
|
||||||
|
- break;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (ignore_msg) {
|
||||||
|
- continue ;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- if (best == NULL) {
|
||||||
|
- best = cmp;
|
||||||
|
- continue;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- best_members = best->old_members - best->left_nodes;
|
||||||
|
- cmp_members = cmp->old_members - cmp->left_nodes;
|
||||||
|
-
|
||||||
|
- if (cmp_members > best_members) {
|
||||||
|
- best = cmp;
|
||||||
|
- } else if (cmp_members == best_members) {
|
||||||
|
- if (cmp->old_members > best->old_members) {
|
||||||
|
- best = cmp;
|
||||||
|
- } else if (cmp->old_members == best->old_members) {
|
||||||
|
- if (cmp->sender_nodeid < best->sender_nodeid) {
|
||||||
|
- best = cmp;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- assert (best != NULL);
|
||||||
|
-
|
||||||
|
- return best;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static void downlist_master_choose_and_send (void)
|
||||||
|
-{
|
||||||
|
- struct downlist_msg *stored_msg;
|
||||||
|
struct list_head *iter;
|
||||||
|
struct process_info *left_pi;
|
||||||
|
qb_map_t *group_map;
|
||||||
|
@@ -884,14 +801,7 @@ static void downlist_master_choose_and_send (void)
|
||||||
|
qb_map_iter_t *miter;
|
||||||
|
int i, size;
|
||||||
|
|
||||||
|
- downlist_state = CPG_DOWNLIST_APPLYING;
|
||||||
|
-
|
||||||
|
- stored_msg = downlist_master_choose ();
|
||||||
|
- if (!stored_msg) {
|
||||||
|
- log_printf (LOGSYS_LEVEL_DEBUG, "NO chosen downlist");
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
- downlist_log("chosen downlist", stored_msg);
|
||||||
|
+ downlist_log("my downlist", &g_req_exec_cpg_downlist);
|
||||||
|
|
||||||
|
group_map = qb_skiplist_create();
|
||||||
|
|
||||||
|
@@ -905,9 +815,9 @@ static void downlist_master_choose_and_send (void)
|
||||||
|
iter = iter->next;
|
||||||
|
|
||||||
|
left_pi = NULL;
|
||||||
|
- for (i = 0; i < stored_msg->left_nodes; i++) {
|
||||||
|
+ for (i = 0; i < g_req_exec_cpg_downlist.left_nodes; i++) {
|
||||||
|
|
||||||
|
- if (pi->nodeid == stored_msg->nodeids[i]) {
|
||||||
|
+ if (pi->nodeid == g_req_exec_cpg_downlist.nodeids[i]) {
|
||||||
|
left_pi = pi;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
@@ -1039,23 +949,6 @@ static void joinlist_inform_clients (void)
|
||||||
|
joinlist_remove_zombie_pi_entries ();
|
||||||
|
}
|
||||||
|
|
||||||
|
-static void downlist_messages_delete (void)
|
||||||
|
-{
|
||||||
|
- struct downlist_msg *stored_msg;
|
||||||
|
- struct list_head *iter, *iter_next;
|
||||||
|
-
|
||||||
|
- for (iter = downlist_messages_head.next;
|
||||||
|
- iter != &downlist_messages_head;
|
||||||
|
- iter = iter_next) {
|
||||||
|
-
|
||||||
|
- iter_next = iter->next;
|
||||||
|
-
|
||||||
|
- stored_msg = list_entry(iter, struct downlist_msg, list);
|
||||||
|
- list_del (&stored_msg->list);
|
||||||
|
- free (stored_msg);
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
static void joinlist_messages_delete (void)
|
||||||
|
{
|
||||||
|
struct joinlist_msg *stored_msg;
|
||||||
|
@@ -1076,7 +969,6 @@ static void joinlist_messages_delete (void)
|
||||||
|
|
||||||
|
static char *cpg_exec_init_fn (struct corosync_api_v1 *corosync_api)
|
||||||
|
{
|
||||||
|
- list_init (&downlist_messages_head);
|
||||||
|
list_init (&joinlist_messages_head);
|
||||||
|
api = corosync_api;
|
||||||
|
return (NULL);
|
||||||
|
@@ -1338,43 +1230,9 @@ static void message_handler_req_exec_cpg_downlist(
|
||||||
|
unsigned int nodeid)
|
||||||
|
{
|
||||||
|
const struct req_exec_cpg_downlist *req_exec_cpg_downlist = message;
|
||||||
|
- int i;
|
||||||
|
- struct list_head *iter;
|
||||||
|
- struct downlist_msg *stored_msg;
|
||||||
|
- int found;
|
||||||
|
-
|
||||||
|
- if (downlist_state != CPG_DOWNLIST_WAITING_FOR_MESSAGES) {
|
||||||
|
- log_printf (LOGSYS_LEVEL_WARNING, "downlist left_list: %d received in state %d",
|
||||||
|
- req_exec_cpg_downlist->left_nodes, downlist_state);
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- stored_msg = malloc (sizeof (struct downlist_msg));
|
||||||
|
- stored_msg->sender_nodeid = nodeid;
|
||||||
|
- stored_msg->old_members = req_exec_cpg_downlist->old_members;
|
||||||
|
- stored_msg->left_nodes = req_exec_cpg_downlist->left_nodes;
|
||||||
|
- memcpy (stored_msg->nodeids, req_exec_cpg_downlist->nodeids,
|
||||||
|
- req_exec_cpg_downlist->left_nodes * sizeof (mar_uint32_t));
|
||||||
|
- list_init (&stored_msg->list);
|
||||||
|
- list_add (&stored_msg->list, &downlist_messages_head);
|
||||||
|
-
|
||||||
|
- for (i = 0; i < my_member_list_entries; i++) {
|
||||||
|
- found = 0;
|
||||||
|
- for (iter = downlist_messages_head.next;
|
||||||
|
- iter != &downlist_messages_head;
|
||||||
|
- iter = iter->next) {
|
||||||
|
-
|
||||||
|
- stored_msg = list_entry(iter, struct downlist_msg, list);
|
||||||
|
- if (my_member_list[i] == stored_msg->sender_nodeid) {
|
||||||
|
- found = 1;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
- if (!found) {
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
- }
|
||||||
|
|
||||||
|
- downlist_master_choose_and_send ();
|
||||||
|
+ log_printf (LOGSYS_LEVEL_WARNING, "downlist left_list: %d received",
|
||||||
|
+ req_exec_cpg_downlist->left_nodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
--
|
||||||
|
2.13.6
|
||||||
|
|
@ -1,3 +1,9 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Wed May 2 02:36:56 UTC 2018 - bliu@suse.com
|
||||||
|
|
||||||
|
- cpg: Inform clients about left nodes during pause(bsc#1091593)
|
||||||
|
Added: 0012-cpg-Inform-clients-about-left-nodes-during-pause.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Thu Apr 26 06:43:54 UTC 2018 - bliu@suse.com
|
Thu Apr 26 06:43:54 UTC 2018 - bliu@suse.com
|
||||||
|
|
||||||
|
@ -73,6 +73,7 @@ Patch15: 0008-bsc#1083561-upgrade-from-1-x-y.patch
|
|||||||
Patch16: 0009-bsc#1088619-add-version.patch
|
Patch16: 0009-bsc#1088619-add-version.patch
|
||||||
Patch17: 0010-qdevice-net-instance.c-optarg-should-be-str.patch
|
Patch17: 0010-qdevice-net-instance.c-optarg-should-be-str.patch
|
||||||
Patch18: 0011-NSS_NoDB_Init-the-parameter-is-reserved-must-be-NULL.patch
|
Patch18: 0011-NSS_NoDB_Init-the-parameter-is-reserved-must-be-NULL.patch
|
||||||
|
Patch19: 0012-cpg-Inform-clients-about-left-nodes-during-pause.patch
|
||||||
|
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
# openais is indeed gone and should be uninstalled. Yes, we do not
|
# openais is indeed gone and should be uninstalled. Yes, we do not
|
||||||
@ -156,6 +157,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
|||||||
%patch16 -p1
|
%patch16 -p1
|
||||||
%patch17 -p1
|
%patch17 -p1
|
||||||
%patch18 -p1
|
%patch18 -p1
|
||||||
|
%patch19 -p1
|
||||||
|
|
||||||
%build
|
%build
|
||||||
%if %{with runautogen}
|
%if %{with runautogen}
|
||||||
|
Loading…
Reference in New Issue
Block a user