diff --git a/server/include/server.h b/server/include/server.h index 81392243c..f6d146ccd 100644 --- a/server/include/server.h +++ b/server/include/server.h @@ -123,7 +123,15 @@ typedef struct server { */ #define SERVER_IS_MASTER(server) \ (((server)->status & (SERVER_RUNNING|SERVER_MASTER|SERVER_SLAVE|SERVER_MAINT)) == (SERVER_RUNNING|SERVER_MASTER)) + /** + * Is the server valid candidate for root master. The server must be running, + * marked as master and not have maintenance bit set. + */ +#define SERVER_IS_ROOT_MASTER(server) \ +(((server)->status & (SERVER_RUNNING|SERVER_MASTER|SERVER_MAINT)) == (SERVER_RUNNING|SERVER_MASTER)) + + /** * Is the server a slave? The server must be both running and marked as a slave * in order for the macro to return true */ diff --git a/server/modules/routing/readwritesplit/readwritesplit.c b/server/modules/routing/readwritesplit/readwritesplit.c index 3f3b8516f..967f332a1 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.c +++ b/server/modules/routing/readwritesplit/readwritesplit.c @@ -4382,13 +4382,17 @@ static backend_ref_t* get_root_master_bref( while (irses_nbackends) { - if (SERVER_IS_MASTER(bref->bref_backend->backend_server)) + if ((bref->bref_backend->backend_server->status & + (SERVER_MASTER|SERVER_MAINT)) == SERVER_MASTER) { - if (candidate_bref == NULL || - (bref->bref_backend->backend_server->depth < - candidate_bref->bref_backend->backend_server->depth)) + if (bref->bref_backend->backend_server->status & SERVER_MASTER) { - candidate_bref = bref; + if (candidate_bref == NULL || + (bref->bref_backend->backend_server->depth < + candidate_bref->bref_backend->backend_server->depth)) + { + candidate_bref = bref; + } } } bref++;