diff --git a/server/modules/monitor/mysql_mon.c b/server/modules/monitor/mysql_mon.c index 80dc75091..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))); @@ -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,7 +1036,12 @@ static MONITOR_SERVERS *get_replication_tree(MYSQL_MONITOR *handle, int num_serv ptr = ptr->next; } - return handle->master; + /* If root master is in MAINT, return NULL */ + if (SERVER_IN_MAINT(handle->master->server)) { + return NULL; + } else { + return handle->master; + } } /******* diff --git a/server/modules/routing/readconnroute.c b/server/modules/routing/readconnroute.c index 0c4a4e678..804b8b253 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 if 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;