From 557370ad7a68d6a9676d3d029262f481b85be181 Mon Sep 17 00:00:00 2001 From: Bin Liu Date: Mon, 10 Apr 2017 10:45:10 +0800 Subject: [PATCH] totemip.c: Fixed Evicted from CPG membership In a two-node cluster, I 've one node configured with open-vswtich: 5: br-fixed: mtu 1500 qdisc noqueue state UNKNOWN group default inet 192.168.124.88/24 scope global br-fixed inet 192.168.124.87/24 scope global secondary br-fixed inet 192.168.124.83/24 brd 192.168.124.255 scope global secondary tentative br-fixed inet 192.168.124.89/24 scope global secondary br-fixed while I use 192.168.124.83 in node list of corosync.conf with udpu, and the bind_addr is 192.168.124.0. After upgrading corosync on this node, the it uses 192.168.124.88 instead of 192.168.124.83. As we can see: corosync-cfgtool -s Printing ring status. Local node ID 1084783704 corosync-quorumtool -s Membership information: Nodeid Votes Name 1084783697 1 d52-54-77-77-01-02 1084783699 1 d52-54-77-77-01-01 (local) while the other node can only see itself: corosync-cfgtool -s Printing ring status. Local node ID 1084783697 RING ID 0 id = 192.168.124.81 status = ring 0 active with no faults corosync-quorumtool -s Membership information: Nodeid Votes Name 1084783697 1 d52-54-77-77-01-02.virtual.cloud.suse.de (local) this patch will check if there are both nodelist and bindnetaddr and if so, display warning and use nodelist information. --- exec/main.c | 4 ++++ exec/totemconfig.c | 18 ++++++++++++++++-- exec/totemconfig.h | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/exec/main.c b/exec/main.c index 0ca5634a..d5403dc8 100644 --- a/exec/main.c +++ b/exec/main.c @@ -1262,6 +1262,10 @@ int main (int argc, char **argv, char **envp) log_printf (LOGSYS_LEVEL_WARNING, "nodeid appears both in totem section and nodelist. Nodelist one is used."); } + if (totem_config_warnings & TOTEM_CONFIG_BINDNETADDR_NODELIST_SET) { + log_printf (LOGSYS_LEVEL_WARNING, "%s", error_string); + } + if (totem_config_warnings != 0) { log_printf (LOGSYS_LEVEL_WARNING, "Please migrate config file to nodelist."); } diff --git a/exec/totemconfig.c b/exec/totemconfig.c index f232ea8f..4b4d22c7 100644 --- a/exec/totemconfig.c +++ b/exec/totemconfig.c @@ -975,7 +975,8 @@ extern int totem_config_read ( uint64_t *warnings) { int res = 0; - char *str; + char *str, *bind_addr_str, *ring0_addr_str; + char msg[128]; unsigned int ringnumber = 0; int member_count = 0; icmap_iter_t iter, member_iter; @@ -1042,7 +1043,20 @@ extern int totem_config_read ( totem_config->ip_version = totem_config_get_ip_version(); - if (icmap_get_string("totem.interface.0.bindnetaddr", &str) != CS_OK) { + if((icmap_get_string("totem.interface.0.bindnetaddr", &bind_addr_str) == CS_OK) && + (icmap_get_string("nodelist.node.0.ring0_addr", &ring0_addr_str) == CS_OK)) { + /* check to see if both bindnetaddr and ring0_addr are set, if yes, log warning information + * if yes, log warning information, and use nodelist instead + * if no, no change at all */ + if (bind_addr_str && ring0_addr_str) { + *warnings |= TOTEM_CONFIG_BINDNETADDR_NODELIST_SET; + sprintf(msg, "Both bindnetaddr %s and nodelist %s set, we will use nodelist instead", + bind_addr_str, ring0_addr_str); + *error_string = msg; + } + + config_convert_nodelist_to_interface(totem_config); + } else if (icmap_get_string("totem.interface.0.bindnetaddr", &str) != CS_OK) { /* * We were not able to find ring 0 bindnet addr. Try to use nodelist informations */ diff --git a/exec/totemconfig.h b/exec/totemconfig.h index 10607cc2..9792cb7d 100644 --- a/exec/totemconfig.h +++ b/exec/totemconfig.h @@ -46,6 +46,7 @@ #define TOTEM_CONFIG_WARNING_MEMBERS_IGNORED (1<<1) #define TOTEM_CONFIG_WARNING_MEMBERS_DEPRECATED (1<<2) #define TOTEM_CONFIG_WARNING_TOTEM_NODEID_IGNORED (1<<3) +#define TOTEM_CONFIG_BINDNETADDR_NODELIST_SET (1<<4) extern int totem_config_read ( struct totem_config *totem_config, -- 2.12.0