Merge branch 'develop' into MAX-11
This commit is contained in:
@ -284,7 +284,11 @@ unsigned int
|
|||||||
gwbuf_length(GWBUF *head)
|
gwbuf_length(GWBUF *head)
|
||||||
{
|
{
|
||||||
int rval = 0;
|
int rval = 0;
|
||||||
|
|
||||||
|
if (head)
|
||||||
|
{
|
||||||
CHK_GWBUF(head);
|
CHK_GWBUF(head);
|
||||||
|
}
|
||||||
while (head)
|
while (head)
|
||||||
{
|
{
|
||||||
rval += GWBUF_LENGTH(head);
|
rval += GWBUF_LENGTH(head);
|
||||||
|
|||||||
@ -759,7 +759,10 @@ int below_water;
|
|||||||
* the routine that drains the queue data, so we should
|
* the routine that drains the queue data, so we should
|
||||||
* not have a race condition on the event.
|
* not have a race condition on the event.
|
||||||
*/
|
*/
|
||||||
|
if (queue)
|
||||||
qlen = gwbuf_length(queue);
|
qlen = gwbuf_length(queue);
|
||||||
|
else
|
||||||
|
qlen = 0;
|
||||||
atomic_add(&dcb->writeqlen, qlen);
|
atomic_add(&dcb->writeqlen, qlen);
|
||||||
dcb->writeq = gwbuf_append(dcb->writeq, queue);
|
dcb->writeq = gwbuf_append(dcb->writeq, queue);
|
||||||
dcb->stats.n_buffered++;
|
dcb->stats.n_buffered++;
|
||||||
@ -873,7 +876,14 @@ int below_water;
|
|||||||
* for suspended write.
|
* for suspended write.
|
||||||
*/
|
*/
|
||||||
dcb->writeq = queue;
|
dcb->writeq = queue;
|
||||||
|
if (queue)
|
||||||
|
{
|
||||||
qlen = gwbuf_length(queue);
|
qlen = gwbuf_length(queue);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
qlen = 0;
|
||||||
|
}
|
||||||
atomic_add(&dcb->writeqlen, qlen);
|
atomic_add(&dcb->writeqlen, qlen);
|
||||||
|
|
||||||
if (queue != NULL)
|
if (queue != NULL)
|
||||||
@ -1076,6 +1086,7 @@ printDCB(DCB *dcb)
|
|||||||
printf("\tDCB state: %s\n", gw_dcb_state2string(dcb->state));
|
printf("\tDCB state: %s\n", gw_dcb_state2string(dcb->state));
|
||||||
if (dcb->remote)
|
if (dcb->remote)
|
||||||
printf("\tConnected to: %s\n", dcb->remote);
|
printf("\tConnected to: %s\n", dcb->remote);
|
||||||
|
if (dcb->writeq)
|
||||||
printf("\tQueued write data: %d\n",gwbuf_length(dcb->writeq));
|
printf("\tQueued write data: %d\n",gwbuf_length(dcb->writeq));
|
||||||
printf("\tStatistics:\n");
|
printf("\tStatistics:\n");
|
||||||
printf("\t\tNo. of Reads: %d\n", dcb->stats.n_reads);
|
printf("\t\tNo. of Reads: %d\n", dcb->stats.n_reads);
|
||||||
@ -1151,6 +1162,7 @@ dprintDCB(DCB *pdcb, DCB *dcb)
|
|||||||
if (dcb->remote)
|
if (dcb->remote)
|
||||||
dcb_printf(pdcb, "\tConnected to: %s\n", dcb->remote);
|
dcb_printf(pdcb, "\tConnected to: %s\n", dcb->remote);
|
||||||
dcb_printf(pdcb, "\tOwning Session: %d\n", dcb->session);
|
dcb_printf(pdcb, "\tOwning Session: %d\n", dcb->session);
|
||||||
|
if (dcb->writeq)
|
||||||
dcb_printf(pdcb, "\tQueued write data: %d\n", gwbuf_length(dcb->writeq));
|
dcb_printf(pdcb, "\tQueued write data: %d\n", gwbuf_length(dcb->writeq));
|
||||||
dcb_printf(pdcb, "\tStatistics:\n");
|
dcb_printf(pdcb, "\tStatistics:\n");
|
||||||
dcb_printf(pdcb, "\t\tNo. of Reads: %d\n", dcb->stats.n_reads);
|
dcb_printf(pdcb, "\t\tNo. of Reads: %d\n", dcb->stats.n_reads);
|
||||||
@ -1553,7 +1565,7 @@ int rval = 1;
|
|||||||
/**
|
/**
|
||||||
* Remove a callback from the callback list for the DCB
|
* Remove a callback from the callback list for the DCB
|
||||||
*
|
*
|
||||||
* Searches down the linked list to find he callback with a matching reason, function
|
* Searches down the linked list to find the callback with a matching reason, function
|
||||||
* and userdata.
|
* and userdata.
|
||||||
*
|
*
|
||||||
* @param dcb The DCB to add the callback to
|
* @param dcb The DCB to add the callback to
|
||||||
|
|||||||
@ -26,6 +26,7 @@
|
|||||||
* 18/06/13 Mark Riddoch Initial implementation
|
* 18/06/13 Mark Riddoch Initial implementation
|
||||||
* 17/05/14 Mark Riddoch Addition of unique_name
|
* 17/05/14 Mark Riddoch Addition of unique_name
|
||||||
* 20/05/14 Massimiliano Pinto Addition of server_string
|
* 20/05/14 Massimiliano Pinto Addition of server_string
|
||||||
|
* 21/05/14 Massimiliano Pinto Addition of node_id
|
||||||
*
|
*
|
||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
@ -71,6 +72,7 @@ SERVER *server;
|
|||||||
server->monpw = NULL;
|
server->monpw = NULL;
|
||||||
server->unique_name = NULL;
|
server->unique_name = NULL;
|
||||||
server->server_string = NULL;
|
server->server_string = NULL;
|
||||||
|
server->node_id = -1;
|
||||||
|
|
||||||
spinlock_acquire(&server_spin);
|
spinlock_acquire(&server_spin);
|
||||||
server->next = allServers;
|
server->next = allServers;
|
||||||
@ -244,8 +246,9 @@ char *stat;
|
|||||||
dcb_printf(dcb, "\tPort: %d\n", ptr->port);
|
dcb_printf(dcb, "\tPort: %d\n", ptr->port);
|
||||||
if (ptr->server_string)
|
if (ptr->server_string)
|
||||||
dcb_printf(dcb, "\tServer Version:\t\t%s\n", ptr->server_string);
|
dcb_printf(dcb, "\tServer Version:\t\t%s\n", ptr->server_string);
|
||||||
|
dcb_printf(dcb, "\tNode Id: %d\n", ptr->node_id);
|
||||||
dcb_printf(dcb, "\tNumber of connections: %d\n", ptr->stats.n_connections);
|
dcb_printf(dcb, "\tNumber of connections: %d\n", ptr->stats.n_connections);
|
||||||
dcb_printf(dcb, "\tCurrent no. of connections: %d\n", ptr->stats.n_current);
|
dcb_printf(dcb, "\tCurrent no. of conns: %d\n", ptr->stats.n_current);
|
||||||
ptr = ptr->next;
|
ptr = ptr->next;
|
||||||
}
|
}
|
||||||
spinlock_release(&server_spin);
|
spinlock_release(&server_spin);
|
||||||
@ -271,8 +274,9 @@ char *stat;
|
|||||||
dcb_printf(dcb, "\tPort: %d\n", server->port);
|
dcb_printf(dcb, "\tPort: %d\n", server->port);
|
||||||
if (server->server_string)
|
if (server->server_string)
|
||||||
dcb_printf(dcb, "\tServer Version:\t\t%s\n", server->server_string);
|
dcb_printf(dcb, "\tServer Version:\t\t%s\n", server->server_string);
|
||||||
|
dcb_printf(dcb, "\tNode Id: %d\n", server->node_id);
|
||||||
dcb_printf(dcb, "\tNumber of connections: %d\n", server->stats.n_connections);
|
dcb_printf(dcb, "\tNumber of connections: %d\n", server->stats.n_connections);
|
||||||
dcb_printf(dcb, "\tCurrent No. of connections: %d\n", server->stats.n_current);
|
dcb_printf(dcb, "\tCurrent No. of conns: %d\n", server->stats.n_current);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -33,6 +33,7 @@
|
|||||||
* 22/07/13 Mark Riddoch Addition of JOINED status for Galera
|
* 22/07/13 Mark Riddoch Addition of JOINED status for Galera
|
||||||
* 18/05/14 Mark Riddoch Addition of unique_name field
|
* 18/05/14 Mark Riddoch Addition of unique_name field
|
||||||
* 20/05/14 Massimiliano Pinto Addition of server_string field
|
* 20/05/14 Massimiliano Pinto Addition of server_string field
|
||||||
|
* 20/05/14 Massimiliano Pinto Addition of node_id field
|
||||||
*
|
*
|
||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
@ -64,6 +65,7 @@ typedef struct server {
|
|||||||
struct server *next; /**< Next server */
|
struct server *next; /**< Next server */
|
||||||
struct server *nextdb; /**< Next server in list attached to a service */
|
struct server *nextdb; /**< Next server in list attached to a service */
|
||||||
char *server_string; /**< Server version string, i.e. MySQL server version */
|
char *server_string; /**< Server version string, i.e. MySQL server version */
|
||||||
|
long node_id; /**< Node id, server_id for M/S or local_index for Galera */
|
||||||
} SERVER;
|
} SERVER;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -103,7 +105,7 @@ typedef struct server {
|
|||||||
* Is the server joined Galera node? The server must be running and joined.
|
* Is the server joined Galera node? The server must be running and joined.
|
||||||
*/
|
*/
|
||||||
#define SERVER_IS_JOINED(server) \
|
#define SERVER_IS_JOINED(server) \
|
||||||
(((server)->status & (SERVER_RUNNING|SERVER_MASTER|SERVER_SLAVE|SERVER_JOINED)) == (SERVER_RUNNING|SERVER_JOINED))
|
(((server)->status & (SERVER_RUNNING|SERVER_JOINED)) == (SERVER_RUNNING|SERVER_JOINED))
|
||||||
|
|
||||||
extern SERVER *server_alloc(char *, char *, unsigned short);
|
extern SERVER *server_alloc(char *, char *, unsigned short);
|
||||||
extern int server_free(SERVER *);
|
extern int server_free(SERVER *);
|
||||||
|
|||||||
@ -24,6 +24,8 @@
|
|||||||
*
|
*
|
||||||
* Date Who Description
|
* Date Who Description
|
||||||
* 22/07/13 Mark Riddoch Initial implementation
|
* 22/07/13 Mark Riddoch Initial implementation
|
||||||
|
* 21/05/14 Massimiliano Pinto Monitor sets a master server
|
||||||
|
* that has the lowest value of wsrep_local_index
|
||||||
*
|
*
|
||||||
* @endverbatim
|
* @endverbatim
|
||||||
*/
|
*/
|
||||||
@ -45,7 +47,7 @@ extern int lm_enabled_logfiles_bitmask;
|
|||||||
|
|
||||||
static void monitorMain(void *);
|
static void monitorMain(void *);
|
||||||
|
|
||||||
static char *version_str = "V1.0.0";
|
static char *version_str = "V1.1.0";
|
||||||
|
|
||||||
static void *startMonitor(void *);
|
static void *startMonitor(void *);
|
||||||
static void stopMonitor(void *);
|
static void stopMonitor(void *);
|
||||||
@ -121,7 +123,7 @@ MYSQL_MONITOR *handle;
|
|||||||
handle->defaultPasswd = NULL;
|
handle->defaultPasswd = NULL;
|
||||||
spinlock_init(&handle->lock);
|
spinlock_init(&handle->lock);
|
||||||
}
|
}
|
||||||
handle->tid = thread_start(monitorMain, handle);
|
handle->tid = (THREAD)thread_start(monitorMain, handle);
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,7 +138,7 @@ stopMonitor(void *arg)
|
|||||||
MYSQL_MONITOR *handle = (MYSQL_MONITOR *)arg;
|
MYSQL_MONITOR *handle = (MYSQL_MONITOR *)arg;
|
||||||
|
|
||||||
handle->shutdown = 1;
|
handle->shutdown = 1;
|
||||||
thread_wait(handle->tid);
|
thread_wait((void *)handle->tid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -280,6 +282,8 @@ MYSQL_RES *result;
|
|||||||
int num_fields;
|
int num_fields;
|
||||||
int isjoined = 0;
|
int isjoined = 0;
|
||||||
char *uname = defaultUser, *passwd = defaultPasswd;
|
char *uname = defaultUser, *passwd = defaultPasswd;
|
||||||
|
unsigned long int server_version = 0;
|
||||||
|
char *server_string;
|
||||||
|
|
||||||
if (database->server->monuser != NULL)
|
if (database->server->monuser != NULL)
|
||||||
{
|
{
|
||||||
@ -297,6 +301,7 @@ char *uname = defaultUser, *passwd = defaultPasswd;
|
|||||||
uname, dpwd, NULL, database->server->port, NULL, 0) == NULL)
|
uname, dpwd, NULL, database->server->port, NULL, 0) == NULL)
|
||||||
{
|
{
|
||||||
server_clear_status(database->server, SERVER_RUNNING);
|
server_clear_status(database->server, SERVER_RUNNING);
|
||||||
|
database->server->node_id = -1;
|
||||||
free(dpwd);
|
free(dpwd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -306,6 +311,15 @@ char *uname = defaultUser, *passwd = defaultPasswd;
|
|||||||
/* If we get this far then we have a working connection */
|
/* If we get this far then we have a working connection */
|
||||||
server_set_status(database->server, SERVER_RUNNING);
|
server_set_status(database->server, SERVER_RUNNING);
|
||||||
|
|
||||||
|
/* get server version from current server */
|
||||||
|
server_version = mysql_get_server_version(database->con);
|
||||||
|
|
||||||
|
/* get server version string */
|
||||||
|
server_string = (char *)mysql_get_server_info(database->con);
|
||||||
|
if (server_string) {
|
||||||
|
database->server->server_string = strdup(server_string);
|
||||||
|
}
|
||||||
|
|
||||||
/* Check if the the Galera FSM shows this node is joined to the cluster */
|
/* Check if the the Galera FSM shows this node is joined to the cluster */
|
||||||
if (mysql_query(database->con, "SHOW STATUS LIKE 'wsrep_local_state_comment'") == 0
|
if (mysql_query(database->con, "SHOW STATUS LIKE 'wsrep_local_state_comment'") == 0
|
||||||
&& (result = mysql_store_result(database->con)) != NULL)
|
&& (result = mysql_store_result(database->con)) != NULL)
|
||||||
@ -319,6 +333,25 @@ char *uname = defaultUser, *passwd = defaultPasswd;
|
|||||||
mysql_free_result(result);
|
mysql_free_result(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Check the the Galera node index in the cluster */
|
||||||
|
if (mysql_query(database->con, "SHOW STATUS LIKE 'wsrep_local_index'") == 0
|
||||||
|
&& (result = mysql_store_result(database->con)) != NULL)
|
||||||
|
{
|
||||||
|
long local_index = -1;
|
||||||
|
num_fields = mysql_num_fields(result);
|
||||||
|
while ((row = mysql_fetch_row(result)))
|
||||||
|
{
|
||||||
|
local_index = strtol(row[1], NULL, 10);
|
||||||
|
if ((errno == ERANGE && (local_index == LONG_MAX
|
||||||
|
|| local_index == LONG_MIN)) || (errno != 0 && local_index == 0))
|
||||||
|
{
|
||||||
|
local_index = -1;
|
||||||
|
}
|
||||||
|
database->server->node_id = local_index;
|
||||||
|
}
|
||||||
|
mysql_free_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
if (isjoined)
|
if (isjoined)
|
||||||
server_set_status(database->server, SERVER_JOINED);
|
server_set_status(database->server, SERVER_JOINED);
|
||||||
else
|
else
|
||||||
@ -335,6 +368,7 @@ monitorMain(void *arg)
|
|||||||
{
|
{
|
||||||
MYSQL_MONITOR *handle = (MYSQL_MONITOR *)arg;
|
MYSQL_MONITOR *handle = (MYSQL_MONITOR *)arg;
|
||||||
MONITOR_SERVERS *ptr;
|
MONITOR_SERVERS *ptr;
|
||||||
|
long master_id;
|
||||||
|
|
||||||
if (mysql_thread_init())
|
if (mysql_thread_init())
|
||||||
{
|
{
|
||||||
@ -347,6 +381,8 @@ MONITOR_SERVERS *ptr;
|
|||||||
handle->status = MONITOR_RUNNING;
|
handle->status = MONITOR_RUNNING;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
master_id = -1;
|
||||||
|
|
||||||
if (handle->shutdown)
|
if (handle->shutdown)
|
||||||
{
|
{
|
||||||
handle->status = MONITOR_STOPPING;
|
handle->status = MONITOR_STOPPING;
|
||||||
@ -354,10 +390,48 @@ MONITOR_SERVERS *ptr;
|
|||||||
handle->status = MONITOR_STOPPED;
|
handle->status = MONITOR_STOPPED;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr = handle->databases;
|
ptr = handle->databases;
|
||||||
|
|
||||||
while (ptr)
|
while (ptr)
|
||||||
{
|
{
|
||||||
monitorDatabase(ptr, handle->defaultUser, handle->defaultPasswd);
|
monitorDatabase(ptr, handle->defaultUser, handle->defaultPasswd);
|
||||||
|
|
||||||
|
/* set master_id to the lowest value of ptr->server->node_id */
|
||||||
|
|
||||||
|
if (ptr->server->node_id >= 0 && SERVER_IS_JOINED(ptr->server)) {
|
||||||
|
if (ptr->server->node_id < master_id && master_id >= 0) {
|
||||||
|
master_id = ptr->server->node_id;
|
||||||
|
} else {
|
||||||
|
if (master_id < 0) {
|
||||||
|
master_id = ptr->server->node_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* clear M/S status */
|
||||||
|
server_clear_status(ptr->server, SERVER_SLAVE);
|
||||||
|
server_clear_status(ptr->server, SERVER_MASTER);
|
||||||
|
}
|
||||||
|
ptr = ptr->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
ptr = handle->databases;
|
||||||
|
|
||||||
|
/* this server loop sets Master and Slave roles */
|
||||||
|
while (ptr)
|
||||||
|
{
|
||||||
|
if (ptr->server->node_id >= 0 && master_id >= 0) {
|
||||||
|
/* set the Master role */
|
||||||
|
if (SERVER_IS_JOINED(ptr->server) && (ptr->server->node_id == master_id)) {
|
||||||
|
server_set_status(ptr->server, SERVER_MASTER);
|
||||||
|
server_clear_status(ptr->server, SERVER_SLAVE);
|
||||||
|
} else if (SERVER_IS_JOINED(ptr->server) && (ptr->server->node_id > master_id)) {
|
||||||
|
/* set the Slave role */
|
||||||
|
server_set_status(ptr->server, SERVER_SLAVE);
|
||||||
|
server_clear_status(ptr->server, SERVER_MASTER);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ptr = ptr->next;
|
ptr = ptr->next;
|
||||||
}
|
}
|
||||||
thread_millisleep(MONITOR_INTERVAL);
|
thread_millisleep(MONITOR_INTERVAL);
|
||||||
|
|||||||
@ -334,6 +334,25 @@ char *server_string;
|
|||||||
database->server->server_string = strdup(server_string);
|
database->server->server_string = strdup(server_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get server_id form current node */
|
||||||
|
if (mysql_query(database->con, "SELECT @@server_id") == 0
|
||||||
|
&& (result = mysql_store_result(database->con)) != NULL)
|
||||||
|
{
|
||||||
|
long server_id = -1;
|
||||||
|
num_fields = mysql_num_fields(result);
|
||||||
|
while ((row = mysql_fetch_row(result)))
|
||||||
|
{
|
||||||
|
server_id = strtol(row[0], NULL, 10);
|
||||||
|
if ((errno == ERANGE && (server_id == LONG_MAX
|
||||||
|
|| server_id == LONG_MIN)) || (errno != 0 && server_id == 0))
|
||||||
|
{
|
||||||
|
server_id = -1;
|
||||||
|
}
|
||||||
|
database->server->node_id = server_id;
|
||||||
|
}
|
||||||
|
mysql_free_result(result);
|
||||||
|
}
|
||||||
|
|
||||||
/* Check SHOW SLAVE HOSTS - if we get rows then we are a master */
|
/* Check SHOW SLAVE HOSTS - if we get rows then we are a master */
|
||||||
if (mysql_query(database->con, "SHOW SLAVE HOSTS"))
|
if (mysql_query(database->con, "SHOW SLAVE HOSTS"))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user