From 75a2e190b25009e783ca3c70f771409bc79ac522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Tue, 24 Oct 2017 15:43:03 +0300 Subject: [PATCH] Add function for updating the MYSQL_SERVER_INFO struct The values in the MYSQL_SERVER_INFO struct can now be updated with the update_slave_status function. Also moved the number of configured and running slave configurations into the info struct. This removes the need to pass output parameters. --- server/modules/monitor/mysqlmon/mysql_mon.cc | 48 +++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/server/modules/monitor/mysqlmon/mysql_mon.cc b/server/modules/monitor/mysqlmon/mysql_mon.cc index e63cb406a..4daa22b82 100644 --- a/server/modules/monitor/mysqlmon/mysql_mon.cc +++ b/server/modules/monitor/mysqlmon/mysql_mon.cc @@ -546,6 +546,8 @@ MXS_MODULE* MXS_CREATE_MODULE() /** * Monitor specific information about a server + * + * Note: These are initialized in @c init_server_info */ typedef struct mysql_server_info { @@ -560,6 +562,8 @@ typedef struct mysql_server_info uint64_t binlog_pos; /**< Binlog position from SHOW SLAVE STATUS */ char *binlog_name; /**< Binlog name from SHOW SLAVE STATUS */ bool binlog_relay; /** Server is a Binlog Relay */ + int n_slaves_configured; /**< Number of configured slave connections*/ + int n_slaves_running; /**< Number of running slave connections */ } MYSQL_SERVER_INFO; void* info_copy_func(const void *val) @@ -888,9 +892,24 @@ enum mysql_server_version MYSQL_SERVER_VERSION_51 }; +static enum mysql_server_version get_server_version(MXS_MONITORED_SERVER* db) +{ + unsigned long server_version = mysql_get_server_version(db->con); + + if (server_version >= 100000) + { + return MYSQL_SERVER_VERSION_100; + } + else if (server_version >= 5 * 10000 + 5 * 100) + { + return MYSQL_SERVER_VERSION_55; + } + + return MYSQL_SERVER_VERSION_51; +} + static bool do_show_slave_status(MYSQL_SERVER_INFO* serv_info, MXS_MONITORED_SERVER* database, - enum mysql_server_version server_version, - int* o_n_configured, int* o_n_running, int* o_master_id) + enum mysql_server_version server_version) { bool rval = true; unsigned int columns; @@ -1002,34 +1021,39 @@ static bool do_show_slave_status(MYSQL_SERVER_INFO* serv_info, MXS_MONITORED_SER mon_report_query_error(database); } - *o_n_configured = nconfigured; - *o_n_running = nrunning; - *o_master_id = master_id; + serv_info->n_slaves_configured = nconfigured; + serv_info->n_slaves_running = nrunning; return rval; } +static bool update_slave_status(MYSQL_MONITOR* handle, MXS_MONITORED_SERVER* db) +{ + void* value = hashtable_fetch(handle->server_info,db->server->unique_name); + ss_dassert(value); + MYSQL_SERVER_INFO* info = static_cast(value); + enum mysql_server_version version = get_server_version(db); + return do_show_slave_status(info, db, version); +} + static inline void monitor_mysql_db(MXS_MONITORED_SERVER* database, MYSQL_SERVER_INFO *serv_info, enum mysql_server_version server_version) { /** Clear old states */ monitor_clear_pending_status(database, SERVER_SLAVE | SERVER_MASTER | SERVER_RELAY_MASTER | SERVER_STALE_STATUS | SERVER_SLAVE_OF_EXTERNAL_MASTER); - int master_id = -1; - int nconfigured = 0; - int nrunning = 0; - if (do_show_slave_status(serv_info, database, server_version, - &nconfigured, &nrunning, &master_id)) + if (do_show_slave_status(serv_info, database, server_version)) { /* If all configured slaves are running set this node as slave */ - if (serv_info->slave_configured && nrunning > 0 && nrunning == nconfigured) + if (serv_info->slave_configured && serv_info->n_slaves_running > 0 && + serv_info->n_slaves_running == serv_info->n_slaves_configured) { monitor_set_pending_status(database, SERVER_SLAVE); } /** Store master_id of current node. For MySQL 5.1 it will be set at a later point. */ - database->server->master_id = master_id; + database->server->master_id = serv_info->master_id; } }