From 2fcfc102beca2e7f16ab04bbe31866e332a50b34 Mon Sep 17 00:00:00 2001 From: Markus Makela Date: Fri, 11 Nov 2016 11:05:13 +0200 Subject: [PATCH] Abstract server active checks The checks for the server active status are now hidden behind a macro. This allows for the conditions of the activity to change without having to alter the code that uses it. --- include/maxscale/server.h | 5 ++ include/maxscale/service.h | 2 +- server/core/server.c | 104 +++++++++++++++++-------------------- server/core/service.c | 2 +- 4 files changed, 55 insertions(+), 58 deletions(-) diff --git a/include/maxscale/server.h b/include/maxscale/server.h index 883fb909a..eb28e1271 100644 --- a/include/maxscale/server.h +++ b/include/maxscale/server.h @@ -140,6 +140,11 @@ typedef struct server #define SERVER_STALE_SLAVE 0x2000 /**<< Slave status is possible even without a master */ #define SERVER_RELAY_MASTER 0x4000 /**<< Server is a relay master */ +/** + * Is the server valid and active + */ +#define SERVER_IS_ACTIVE(server) (server->is_active) + /** * Is the server running - the macro returns true if the server is marked as running * regardless of it's state as a master or slave diff --git a/include/maxscale/service.h b/include/maxscale/service.h index 9fce33362..e8fd7850e 100644 --- a/include/maxscale/service.h +++ b/include/maxscale/service.h @@ -105,7 +105,7 @@ typedef struct server_ref_t } SERVER_REF; /** Macro to check whether a SERVER_REF is active */ -#define SERVER_REF_IS_ACTIVE(ref) (ref->active) +#define SERVER_REF_IS_ACTIVE(ref) (ref->active && SERVER_IS_ACTIVE(ref->server)) #define SERVICE_MAX_RETRY_INTERVAL 3600 /*< The maximum interval between service start retries */ diff --git a/server/core/server.c b/server/core/server.c index 9bda4fa0e..77accd29b 100644 --- a/server/core/server.c +++ b/server/core/server.c @@ -250,6 +250,16 @@ server_get_persistent(SERVER *server, char *user, const char *protocol) return NULL; } +static inline SERVER* next_active_server(SERVER *server) +{ + while (server && !server->is_active) + { + server = server->next; + } + + return server; +} + /** * @brief Find a server with the specified name * @@ -259,16 +269,17 @@ server_get_persistent(SERVER *server, char *user, const char *protocol) SERVER * server_find_by_unique_name(const char *name) { spinlock_acquire(&server_spin); - SERVER *server = allServers; + SERVER *server = next_active_server(allServers); while (server) { - if (server->is_active && server->unique_name && strcmp(server->unique_name, name) == 0) + if (server->unique_name && strcmp(server->unique_name, name) == 0) { break; } - server = server->next; + server = next_active_server(server->next); } + spinlock_release(&server_spin); return server; @@ -284,19 +295,20 @@ SERVER * server_find_by_unique_name(const char *name) SERVER * server_find(char *servname, unsigned short port) { - SERVER *server; - spinlock_acquire(&server_spin); - server = allServers; + SERVER *server = next_active_server(allServers); + while (server) { - if (server->is_active && strcmp(server->name, servname) == 0 && server->port == port) + if (strcmp(server->name, servname) == 0 && server->port == port) { break; } - server = server->next; + server = next_active_server(server->next); } + spinlock_release(&server_spin); + return server; } @@ -327,18 +339,15 @@ printServer(SERVER *server) void printAllServers() { - SERVER *server; - spinlock_acquire(&server_spin); - server = allServers; + SERVER *server = next_active_server(allServers); + while (server) { - if (server->is_active) - { - printServer(server); - } - server = server->next; + printServer(server); + server = next_active_server(server->next); } + spinlock_release(&server_spin); } @@ -351,18 +360,15 @@ printAllServers() void dprintAllServers(DCB *dcb) { - SERVER *server; - spinlock_acquire(&server_spin); - server = allServers; + SERVER *server = next_active_server(allServers); + while (server) { - if (server->is_active) - { - dprintServer(dcb, server); - } - server = server->next; + dprintServer(dcb, server); + server = next_active_server(server->next); } + spinlock_release(&server_spin); } @@ -375,27 +381,23 @@ dprintAllServers(DCB *dcb) void dprintAllServersJson(DCB *dcb) { - SERVER *server; char *stat; int len = 0; int el = 1; spinlock_acquire(&server_spin); - server = allServers; + SERVER *server = next_active_server(allServers); while (server) { - server = server->next; + server = next_active_server(server->next); len++; } - server = allServers; + + server = next_active_server(allServers); + dcb_printf(dcb, "[\n"); while (server) { - if (!server->is_active) - { - server = server->next; - continue; - } dcb_printf(dcb, " {\n \"server\": \"%s\",\n", server->name); stat = server_status(server); @@ -459,9 +461,10 @@ dprintAllServersJson(DCB *dcb) { dcb_printf(dcb, " }\n"); } - server = server->next; + server = next_active_server(server->next); el++; } + dcb_printf(dcb, "]\n"); spinlock_release(&server_spin); } @@ -476,7 +479,7 @@ dprintAllServersJson(DCB *dcb) void dprintServer(DCB *dcb, SERVER *server) { - if (!server->is_active) + if (!SERVER_IS_ACTIVE(server)) { return; } @@ -610,17 +613,8 @@ dprintPersistentDCBs(DCB *pdcb, SERVER *server) void dListServers(DCB *dcb) { - SERVER *server; - char *stat; - spinlock_acquire(&server_spin); - server = allServers; - - while (server && !server->is_active) - { - server = server->next; - } - + SERVER *server = next_active_server(allServers); bool have_servers = false; if (server) @@ -635,17 +629,15 @@ dListServers(DCB *dcb) while (server) { - if (server->is_active) - { - stat = server_status(server); - dcb_printf(dcb, "%-18s | %-15s | %5d | %11d | %s\n", - server->unique_name, server->name, - server->port, - server->stats.n_current, stat); - MXS_FREE(stat); - } - server = server->next; + char *stat = server_status(server); + dcb_printf(dcb, "%-18s | %-15s | %5d | %11d | %s\n", + server->unique_name, server->name, + server->port, + server->stats.n_current, stat); + MXS_FREE(stat); + server = next_active_server(server->next); } + if (have_servers) { dcb_printf(dcb, "-------------------+-----------------+-------+-------------+--------------------\n"); @@ -935,7 +927,7 @@ serverRowCallback(RESULTSET *set, void *data) return NULL; } (*rowno)++; - if (server->is_active) + if (SERVER_IS_ACTIVE(server)) { row = resultset_make_row(set); resultset_row_set(row, 0, server->unique_name); diff --git a/server/core/service.c b/server/core/service.c index bd2f596e1..7fe22d93e 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -1365,7 +1365,7 @@ void dprintService(DCB *dcb, SERVICE *service) dcb_printf(dcb, "\tBackend databases:\n"); while (server) { - if (server->active && server->server->is_active) + if (SERVER_REF_IS_ACTIVE(server)) { dcb_printf(dcb, "\t\t%s:%d Protocol: %s\n", server->server->name, server->server->port, server->server->protocol);