diff --git a/server/include/server.h b/server/include/server.h index 008d6fbd3..e355e8c49 100644 --- a/server/include/server.h +++ b/server/include/server.h @@ -95,6 +95,11 @@ typedef struct server { #define SERVER_IS_SLAVE(server) \ (((server)->status & (SERVER_RUNNING|SERVER_MASTER|SERVER_SLAVE)) == (SERVER_RUNNING|SERVER_SLAVE)) +/** + * Is the server joined Galera node? The server must be running and joined. + */ +#define SERVER_IS_JOINED(server) \ + (((server)->status & (SERVER_RUNNING|SERVER_MASTER|SERVER_SLAVE|SERVER_JOINED)) == (SERVER_RUNNING|SERVER_JOINED)) extern SERVER *server_alloc(char *, char *, unsigned short); extern int server_free(SERVER *); diff --git a/server/modules/include/readwritesplit.h b/server/modules/include/readwritesplit.h index 477096b76..024a8bd88 100644 --- a/server/modules/include/readwritesplit.h +++ b/server/modules/include/readwritesplit.h @@ -55,6 +55,7 @@ typedef enum rses_property_type_t { typedef enum backend_type_t { BE_UNDEFINED=-1, BE_MASTER, + BE_JOINED = BE_MASTER, BE_SLAVE, BE_COUNT } backend_type_t; diff --git a/server/modules/routing/readwritesplit/readwritesplit.c b/server/modules/routing/readwritesplit/readwritesplit.c index d0579c6d0..4140537c7 100644 --- a/server/modules/routing/readwritesplit/readwritesplit.c +++ b/server/modules/routing/readwritesplit/readwritesplit.c @@ -284,18 +284,8 @@ static ROUTER* createInstance( { for (i = 0; options[i]; i++) { - if (!strcasecmp(options[i], "master")) - { - router->bitmask |= (SERVER_MASTER|SERVER_SLAVE); - router->bitvalue |= SERVER_MASTER; - } - else if (!strcasecmp(options[i], "slave")) - { - router->bitmask |= (SERVER_MASTER|SERVER_SLAVE); - router->bitvalue |= SERVER_SLAVE; - } - else if (!strcasecmp(options[i], "synced")) - { + if (!strcasecmp(options[i], "synced")) + { router->bitmask |= (SERVER_JOINED); router->bitvalue |= SERVER_JOINED; } @@ -303,8 +293,9 @@ static ROUTER* createInstance( { LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR, - "Warning : Unsupported router option %s " - "for readwritesplitrouter.", + "Warning : Unsupported " + "router option \"%s\" " + "for readwritesplit router.", options[i]))); } } @@ -1218,9 +1209,28 @@ static bool search_backend_servers( { local_backend[BE_MASTER] = be; } + else if (p_master != NULL && + local_backend[BE_JOINED] == NULL && + SERVER_IS_JOINED(be->backend_server)) + { + local_backend[BE_JOINED] = be; + } } } + if (router->bitvalue != 0 && + p_master != NULL && + local_backend[BE_JOINED] == NULL) + { + succp = false; + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "Error : Couldn't find a Joined Galera node from %d " + "candidates.", + i))); + goto return_succp; + } + if (p_slave != NULL && local_backend[BE_SLAVE] == NULL) { succp = false; LOGIF(LE, (skygw_log_write_flush( @@ -1262,6 +1272,7 @@ static bool search_backend_servers( local_backend[BE_MASTER]->backend_server->port, i))); } +return_succp: return succp; }