diff --git a/server/core/server.c b/server/core/server.c index fd3e1c876..058db7460 100644 --- a/server/core/server.c +++ b/server/core/server.c @@ -22,8 +22,10 @@ * @verbatim * Revision History * - * Date Who Description - * 18/06/13 Mark Riddoch Initial implementation + * Date Who Description + * 18/06/13 Mark Riddoch Initial implementation + * 17/05/14 Mark Riddoch Addition of unique_name + * 20/05/14 Massimiliano Pinto Addition of server_string * * @endverbatim */ @@ -68,6 +70,7 @@ SERVER *server; server->monuser = NULL; server->monpw = NULL; server->unique_name = NULL; + server->server_string = NULL; spinlock_acquire(&server_spin); server->next = allServers; @@ -112,6 +115,8 @@ SERVER *ptr; free(server->protocol); if (server->unique_name) free(server->unique_name); + if (server->server_string) + free(server->server_string); free(server); return 1; } @@ -237,6 +242,8 @@ char *stat; free(stat); dcb_printf(dcb, "\tProtocol: %s\n", ptr->protocol); dcb_printf(dcb, "\tPort: %d\n", ptr->port); + if (ptr->server_string) + dcb_printf(dcb, "\tServer Version:\t\t%s\n", ptr->server_string); 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); ptr = ptr->next; @@ -262,6 +269,8 @@ char *stat; free(stat); dcb_printf(dcb, "\tProtocol: %s\n", server->protocol); dcb_printf(dcb, "\tPort: %d\n", server->port); + if (server->server_string) + dcb_printf(dcb, "\tServer Version:\t\t%s\n", server->server_string); 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); } diff --git a/server/include/server.h b/server/include/server.h index 6b4598c36..19ca798ae 100644 --- a/server/include/server.h +++ b/server/include/server.h @@ -27,10 +27,12 @@ * @verbatim * Revision History * - * Date Who Description - * 14/06/13 Mark Riddoch Initial implementation - * 21/06/13 Mark Riddoch Addition of server status flags - * 22/07/13 Mark Riddoch Addition of JOINED status for Galera + * Date Who Description + * 14/06/13 Mark Riddoch Initial implementation + * 21/06/13 Mark Riddoch Addition of server status flags + * 22/07/13 Mark Riddoch Addition of JOINED status for Galera + * 18/05/14 Mark Riddoch Addition of unique_name field + * 20/05/14 Massimiliano Pinto Addition of server_string field * * @endverbatim */ @@ -61,6 +63,7 @@ typedef struct server { SERVER_STATS stats; /**< The server statistics */ struct server *next; /**< Next server */ struct server *nextdb; /**< Next server in list attached to a service */ + char *server_string; /**< Server version string, i.e. MySQL server version */ } SERVER; /** diff --git a/server/modules/monitor/mysql_mon.c b/server/modules/monitor/mysql_mon.c index fbb537a9c..e69b14b79 100644 --- a/server/modules/monitor/mysql_mon.c +++ b/server/modules/monitor/mysql_mon.c @@ -22,12 +22,14 @@ * @verbatim * Revision History * - * Date Who Description - * 08/07/13 Mark Riddoch Initial implementation - * 11/07/13 Mark Riddoch Addition of code to check replication - * status - * 25/07/13 Mark Riddoch Addition of decrypt for passwords and - * diagnostic interface + * Date Who Description + * 08/07/13 Mark Riddoch Initial implementation + * 11/07/13 Mark Riddoch Addition of code to check replication + * status + * 25/07/13 Mark Riddoch Addition of decrypt for passwords and + * diagnostic interface + * 20/05/14 Massimiliano Pinto Addition of support for MariadDB multimaster replication setup. + * New server field version_string is updated. * * @endverbatim */ @@ -290,6 +292,8 @@ MYSQL_RES *result; int num_fields; int ismaster = 0, isslave = 0; char *uname = defaultUser, *passwd = defaultPasswd; +unsigned long int server_version = 0; +char *server_string; if (database->server->monuser != NULL) { @@ -321,6 +325,15 @@ char *uname = defaultUser, *passwd = defaultPasswd; /* If we get this far then we have a working connection */ 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 SHOW SLAVE HOSTS - if we get rows then we are a master */ if (mysql_query(database->con, "SHOW SLAVE HOSTS")) { @@ -342,17 +355,45 @@ char *uname = defaultUser, *passwd = defaultPasswd; /* Check if the Slave_SQL_Running and Slave_IO_Running status is * set to Yes */ - if (mysql_query(database->con, "SHOW SLAVE STATUS") == 0 - && (result = mysql_store_result(database->con)) != NULL) - { - num_fields = mysql_num_fields(result); - while ((row = mysql_fetch_row(result))) + + /* Check first for MariaDB 10.x.x and get status for multimaster replication */ + if (server_version >= 100000) { + + if (mysql_query(database->con, "SHOW ALL SLAVES STATUS") == 0 + && (result = mysql_store_result(database->con)) != NULL) { if (strncmp(row[10], "Yes", 3) == 0 && strncmp(row[11], "Yes", 3) == 0) + int i = 0; + num_fields = mysql_num_fields(result); + while ((row = mysql_fetch_row(result))) + { + if (strncmp(row[12], "Yes", 3) == 0 + && strncmp(row[13], "Yes", 3) == 0) { + isslave += 1; + } + i++; + } + mysql_free_result(result); + + if (isslave == i) isslave = 1; + else + isslave = 0; + } + } else { + if (mysql_query(database->con, "SHOW SLAVE STATUS") == 0 + && (result = mysql_store_result(database->con)) != NULL) + { + num_fields = mysql_num_fields(result); + while ((row = mysql_fetch_row(result))) + { + if (strncmp(row[10], "Yes", 3) == 0 + && strncmp(row[11], "Yes", 3) == 0) + isslave = 1; + } + mysql_free_result(result); } - mysql_free_result(result); } if (ismaster)