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;