From 3a299a9ed86a083999b351401d2935460cd07a00 Mon Sep 17 00:00:00 2001 From: MassimilianoPinto Date: Fri, 27 Jun 2014 17:16:38 +0200 Subject: [PATCH 1/3] get_replication_tree checks for SERVER_IS_DOWN get_replication_tree checks for SERVER_IS_DOWN, this will produce a replication tree even with servers in SERVER_IN_MAINT state --- server/modules/monitor/mysql_mon.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/server/modules/monitor/mysql_mon.c b/server/modules/monitor/mysql_mon.c index 80dc75091..fa5c2357e 100644 --- a/server/modules/monitor/mysql_mon.c +++ b/server/modules/monitor/mysql_mon.c @@ -947,7 +947,8 @@ static void set_slave_heartbeat(MYSQL_MONITOR *handle, MONITOR_SERVERS *database /******* * This function computes the replication tree * from a set of MySQL Master/Slave monitored servers - * and returns the root server with SERVER_MASTER bit + * and returns the root server with SERVER_MASTER bit. + * The tree is computed even for servers in 'maintenance' mode. * * @param handle The monitor handle * @param num_servers The number of servers monitored @@ -967,9 +968,12 @@ static MONITOR_SERVERS *get_replication_tree(MYSQL_MONITOR *handle, int num_serv while (ptr) { - if (SERVER_IN_MAINT(ptr->server) || SERVER_IS_DOWN(ptr->server)) { + /* The server could be in SERVER_IN_MAINT + * that means SERVER_IS_RUNNING returns 0 + * Let's check only for SERVER_IS_DOWN: server is not running + */ + if (SERVER_IS_DOWN(ptr->server)) { ptr = ptr->next; - continue; } depth = 0; @@ -1032,6 +1036,11 @@ static MONITOR_SERVERS *get_replication_tree(MYSQL_MONITOR *handle, int num_serv ptr = ptr->next; } + /* If root master is in MAINT, return NULL */ + if (SERVER_IN_MAINT(handle->master->server)) { + return NULL; + } + return handle->master; } From 5cbc7b9f7d3fdc3884592de90b0bb6e99a57ea00 Mon Sep 17 00:00:00 2001 From: MassimilianoPinto Date: Fri, 27 Jun 2014 17:55:46 +0200 Subject: [PATCH 2/3] root server IN_MAINT returns NULL to caller the replication tree returns NULL if the root server is maintenance mode --- server/modules/routing/readconnroute.c | 19 +++++++++++++++++-- .../routing/readwritesplit/readwritesplit.c | 10 ++++++---- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/server/modules/routing/readconnroute.c b/server/modules/routing/readconnroute.c index 0c4a4e678..482388d2b 100644 --- a/server/modules/routing/readconnroute.c +++ b/server/modules/routing/readconnroute.c @@ -435,6 +435,15 @@ BACKEND *master_host = NULL; candidate = master_host; break; } + } else { + /* master_host is NULL, no master server. + * If requested router_option is 'master' + * candidate wll be NULL. + */ + if (inst->bitvalue & SERVER_MASTER) { + candidate = NULL; + break; + } } /* If no candidate set, set first running server as @@ -882,6 +891,8 @@ static uint8_t getCapabilities( * * (1) find server(s) with lowest replication depth level * (2) check for SERVER_MASTER bitvalue in those servers + * Servers are checked even if they are in 'maintenance' + * SERVER_IS_DOWN is the only status to skip. * * @param servers The list of servers * @return The Master found @@ -894,7 +905,7 @@ static BACKEND *get_root_master(BACKEND **servers) { /* (1) find root server(s) with lowest replication depth level */ for (i = 0; servers[i]; i++) { - if (servers[i] && SERVER_IS_RUNNING(servers[i]->server)) { + if (servers[i] && (! SERVER_IS_DOWN(servers[i]->server))) { if (master_host && servers[i]->server->depth < master_host->server->depth) { master_host = servers[i]; } else { @@ -909,7 +920,7 @@ static BACKEND *get_root_master(BACKEND **servers) { if (master_host) { int found = 0; for (i = 0; servers[i]; i++) { - if (servers[i] && SERVER_IS_RUNNING(servers[i]->server) && (servers[i]->server->depth == master_host->server->depth)) { + if (servers[i] && ( !SERVER_IS_DOWN(servers[i]->server)) && (servers[i]->server->depth == master_host->server->depth)) { if (servers[i]->server->status & SERVER_MASTER) { master_host = servers[i]; found = 1; @@ -918,6 +929,10 @@ static BACKEND *get_root_master(BACKEND **servers) { } if (!found) master_host = NULL; + + /* return NULL is the server is SERVER_IN_MAINT */ + if (found && SERVER_IN_MAINT(master_host->server)) + master_host = NULL; } return master_host; diff --git a/server/modules/routing/readwritesplit/readwritesplit.c b/server/modules/routing/readwritesplit/readwritesplit.c index f7a7fc583..db298db4e 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.c +++ b/server/modules/routing/readwritesplit/readwritesplit.c @@ -869,8 +869,7 @@ static bool get_dcb( for (i=0; irses_nbackends; i++) { BACKEND* b = backend_ref[i].bref_backend; - - /* removed SERVER_IS_MASTER and use master_host */ + if (BREF_IS_IN_USE((&backend_ref[i])) && (master_host && (b->backend_server == master_host->backend_server))) { @@ -3274,7 +3273,7 @@ static BACKEND *get_root_master(backend_ref_t *servers, int router_nservers) { for (i = 0; i< router_nservers; i++) { BACKEND* b = NULL; b = servers[i].bref_backend; - if (b && SERVER_IS_RUNNING(b->backend_server)) { + if (b && (! SERVER_IS_DOWN(b->backend_server))) { if (master_host && b->backend_server->depth < master_host->backend_server->depth) { master_host = b; } else { @@ -3291,7 +3290,7 @@ static BACKEND *get_root_master(backend_ref_t *servers, int router_nservers) { for (i = 0; ibackend_server) && (b->backend_server->depth == master_host->backend_server->depth)) { + if (b && (! SERVER_IS_DOWN(b->backend_server)) && (b->backend_server->depth == master_host->backend_server->depth)) { if (b->backend_server->status & SERVER_MASTER) { master_host = b; found = 1; @@ -3300,6 +3299,9 @@ static BACKEND *get_root_master(backend_ref_t *servers, int router_nservers) { } if (!found) master_host = NULL; + + if (found && SERVER_IN_MAINT(master_host->backend_server)) + master_host = NULL; } return master_host; From 32526d31b6fdc18f353684e00f7fdd59c6a82162 Mon Sep 17 00:00:00 2001 From: MassimilianoPinto Date: Fri, 27 Jun 2014 18:14:46 +0200 Subject: [PATCH 3/3] code cleanup code cleanup --- server/modules/monitor/mysql_mon.c | 8 ++++---- server/modules/routing/readconnroute.c | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/modules/monitor/mysql_mon.c b/server/modules/monitor/mysql_mon.c index fa5c2357e..822e772b5 100644 --- a/server/modules/monitor/mysql_mon.c +++ b/server/modules/monitor/mysql_mon.c @@ -914,7 +914,7 @@ static void set_slave_heartbeat(MYSQL_MONITOR *handle, MONITOR_SERVERS *database LOGIF(LD, (skygw_log_write_flush( LOGFILE_DEBUG, "[mysql_mon]: replication heartbeat: " - "Slave %s:%i is %i seconds lag", + "Slave %s:%i has %i seconds lag", database->server->name, database->server->port, database->server->rlag))); @@ -1039,9 +1039,9 @@ static MONITOR_SERVERS *get_replication_tree(MYSQL_MONITOR *handle, int num_serv /* If root master is in MAINT, return NULL */ if (SERVER_IN_MAINT(handle->master->server)) { return NULL; - } - - return handle->master; + } else { + return handle->master; + } } /******* diff --git a/server/modules/routing/readconnroute.c b/server/modules/routing/readconnroute.c index 482388d2b..804b8b253 100644 --- a/server/modules/routing/readconnroute.c +++ b/server/modules/routing/readconnroute.c @@ -435,7 +435,7 @@ BACKEND *master_host = NULL; candidate = master_host; break; } - } else { + } else { /* master_host is NULL, no master server. * If requested router_option is 'master' * candidate wll be NULL. @@ -920,7 +920,7 @@ static BACKEND *get_root_master(BACKEND **servers) { if (master_host) { int found = 0; for (i = 0; servers[i]; i++) { - if (servers[i] && ( !SERVER_IS_DOWN(servers[i]->server)) && (servers[i]->server->depth == master_host->server->depth)) { + if (servers[i] && (! SERVER_IS_DOWN(servers[i]->server)) && (servers[i]->server->depth == master_host->server->depth)) { if (servers[i]->server->status & SERVER_MASTER) { master_host = servers[i]; found = 1; @@ -930,7 +930,7 @@ static BACKEND *get_root_master(BACKEND **servers) { if (!found) master_host = NULL; - /* return NULL is the server is SERVER_IN_MAINT */ + /* return NULL if the server is SERVER_IN_MAINT */ if (found && SERVER_IN_MAINT(master_host->server)) master_host = NULL; }