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.
This commit is contained in:
@ -546,6 +546,8 @@ MXS_MODULE* MXS_CREATE_MODULE()
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Monitor specific information about a server
|
* Monitor specific information about a server
|
||||||
|
*
|
||||||
|
* Note: These are initialized in @c init_server_info
|
||||||
*/
|
*/
|
||||||
typedef struct mysql_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 */
|
uint64_t binlog_pos; /**< Binlog position from SHOW SLAVE STATUS */
|
||||||
char *binlog_name; /**< Binlog name from SHOW SLAVE STATUS */
|
char *binlog_name; /**< Binlog name from SHOW SLAVE STATUS */
|
||||||
bool binlog_relay; /** Server is a Binlog Relay */
|
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;
|
} MYSQL_SERVER_INFO;
|
||||||
|
|
||||||
void* info_copy_func(const void *val)
|
void* info_copy_func(const void *val)
|
||||||
@ -888,9 +892,24 @@ enum mysql_server_version
|
|||||||
MYSQL_SERVER_VERSION_51
|
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,
|
static bool do_show_slave_status(MYSQL_SERVER_INFO* serv_info, MXS_MONITORED_SERVER* database,
|
||||||
enum mysql_server_version server_version,
|
enum mysql_server_version server_version)
|
||||||
int* o_n_configured, int* o_n_running, int* o_master_id)
|
|
||||||
{
|
{
|
||||||
bool rval = true;
|
bool rval = true;
|
||||||
unsigned int columns;
|
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);
|
mon_report_query_error(database);
|
||||||
}
|
}
|
||||||
|
|
||||||
*o_n_configured = nconfigured;
|
serv_info->n_slaves_configured = nconfigured;
|
||||||
*o_n_running = nrunning;
|
serv_info->n_slaves_running = nrunning;
|
||||||
*o_master_id = master_id;
|
|
||||||
|
|
||||||
return rval;
|
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<MYSQL_SERVER_INFO*>(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,
|
static inline void monitor_mysql_db(MXS_MONITORED_SERVER* database, MYSQL_SERVER_INFO *serv_info,
|
||||||
enum mysql_server_version server_version)
|
enum mysql_server_version server_version)
|
||||||
{
|
{
|
||||||
/** Clear old states */
|
/** Clear old states */
|
||||||
monitor_clear_pending_status(database, SERVER_SLAVE | SERVER_MASTER | SERVER_RELAY_MASTER |
|
monitor_clear_pending_status(database, SERVER_SLAVE | SERVER_MASTER | SERVER_RELAY_MASTER |
|
||||||
SERVER_STALE_STATUS | SERVER_SLAVE_OF_EXTERNAL_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,
|
if (do_show_slave_status(serv_info, database, server_version))
|
||||||
&nconfigured, &nrunning, &master_id))
|
|
||||||
{
|
{
|
||||||
/* If all configured slaves are running set this node as slave */
|
/* 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);
|
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. */
|
/** 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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user