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.
This commit is contained in:
Markus Makela 2016-11-11 11:05:13 +02:00
parent ae7981f147
commit 2fcfc102be
4 changed files with 55 additions and 58 deletions

View File

@ -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

View File

@ -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 */

View File

@ -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);

View File

@ -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);