MXS-1865 Combine server version and type

Binlog server is now handled better.
This commit is contained in:
Esa Korhonen
2018-05-14 15:47:04 +03:00
parent b29bae6e84
commit b71710e066
3 changed files with 61 additions and 52 deletions

View File

@ -371,7 +371,7 @@ void MariaDBMonitor::main_loop()
assign_relay_master(**iter);
/* Remove SLAVE status if this server is a Binlog Server relay */
if ((*iter)->m_binlog_relay)
if ((*iter)->m_version == MariaDBServer::version::BINLOG_ROUTER)
{
monitor_clear_pending_status((*iter)->m_server_base, SERVER_SLAVE);
}
@ -546,7 +546,8 @@ void MariaDBMonitor::measure_replication_lag(MariaDBServer* root_master)
{
if (ptr->server->node_id != mon_root_master->server->node_id &&
(server->is_slave() || SERVER_IS_RELAY_SERVER(ptr->server)) &&
!server->m_binlog_relay) // No select lag for Binlog Server
(server->m_version == MariaDBServer::version::MARIADB_MYSQL_55 ||
server->m_version == MariaDBServer::version::MARIADB_100)) // No select lag for Binlog Server
{
set_slave_heartbeat(server);
}

View File

@ -40,11 +40,10 @@ SlaveStatus::SlaveStatus()
MariaDBServer::MariaDBServer(MXS_MONITORED_SERVER* monitored_server)
: m_server_base(monitored_server)
, m_report_version_error(true)
, m_version(MARIADB_VERSION_UNKNOWN)
, m_version(version::UNKNOWN)
, m_server_id(SERVER_ID_UNKNOWN)
, m_group(0)
, m_read_only(false)
, m_binlog_relay(false)
, m_n_slaves_running(0)
, m_n_slave_heartbeats(0)
, m_heartbeat_period(0)
@ -85,13 +84,16 @@ bool MariaDBServer::do_show_slave_status()
{
unsigned int columns = 0;
string query;
bool all_slaves_status = false;
switch (m_version)
{
case MARIADB_VERSION_100:
case version::MARIADB_100:
case version::BINLOG_ROUTER:
columns = 42;
all_slaves_status = true;
query = "SHOW ALL SLAVES STATUS";
break;
case MARIADB_VERSION_55:
case version::MARIADB_MYSQL_55:
columns = 40;
query = "SHOW SLAVE STATUS";
break;
@ -133,7 +135,7 @@ bool MariaDBServer::do_show_slave_status()
int64_t i_connection_name = -1, i_slave_rec_hbs = -1, i_slave_hb_period = -1;
int64_t i_using_gtid = -1, i_gtid_io_pos = -1;
if (m_version == MARIADB_VERSION_100)
if (all_slaves_status)
{
i_connection_name = result->get_col_index("Connection_name");
i_slave_rec_hbs = result->get_col_index("Slave_received_heartbeats");
@ -173,7 +175,7 @@ bool MariaDBServer::do_show_slave_status()
}
}
if (m_version == MARIADB_VERSION_100)
if (all_slaves_status)
{
sstatus.name = result->get_string(i_connection_name);
auto heartbeats = result->get_uint(i_slave_rec_hbs);
@ -261,7 +263,7 @@ void MariaDBServer::read_server_variables()
MXS_MONITORED_SERVER* database = m_server_base;
string query = "SELECT @@global.server_id, @@read_only;";
int columns = 2;
if (m_version == MARIADB_VERSION_100)
if (m_version == version::MARIADB_100)
{
query.erase(query.end() - 1);
query += ", @@global.gtid_domain_id;";
@ -721,25 +723,31 @@ void MariaDBServer::monitor_server(MXS_MONITOR* base_monitor)
return;
}
/* Query a few settings. */
/* Query different things depending on server version/type. */
switch (m_version)
{
case version::MARIADB_MYSQL_55:
read_server_variables();
/* If gtid domain exists and server is 10.0, update gtid:s */
if (m_version == MariaDBServer::MARIADB_VERSION_100)
{
update_gtids();
}
/* Check for valid server version */
if (m_version == MariaDBServer::MARIADB_VERSION_100 || m_version == MariaDBServer::MARIADB_VERSION_55)
{
update_slave_status();
}
else if (m_report_version_error)
break;
case version::MARIADB_100:
read_server_variables();
update_gtids();
update_slave_status();
break;
case version::BINLOG_ROUTER:
// TODO: Add special version of server variable query.
update_slave_status();
break;
default:
if (m_report_version_error)
{
MXS_ERROR("MariaDB/MySQL version of server '%s' is less than 5.5, which is not supported. "
"The server is ignored by the monitor.", name());
m_report_version_error = false;
}
break;
}
}
/**
@ -771,36 +779,34 @@ void MariaDBServer::update_slave_status()
*/
void MariaDBServer::update_server_info()
{
m_version = version::UNKNOWN;
auto conn = m_server_base->con;
auto srv = m_server_base->server;
/* Get server version string, also get/set numeric representation. This function does not query the
* server, since the data was obtained when connecting. */
mxs_mysql_set_server_version(conn, srv);
// Check whether this server is a MaxScale Binlog Server.
MYSQL_RES *result;
if (mxs_mysql_query(conn, "SELECT @@maxscale_version") == 0 &&
(result = mysql_store_result(conn)) != NULL)
{
m_binlog_relay = true;
m_version = version::BINLOG_ROUTER;
mysql_free_result(result);
}
else
{
m_binlog_relay = false;
}
/* Get server version string, also get/set numeric representation. These functions do not actually
* query the server, since the data was obtained when connecting. */
mxs_mysql_set_server_version(conn, m_server_base->server);
/* Set monitor version enum. */
uint64_t version_num = server_get_version(m_server_base->server);
if (version_num >= 100000)
/* Not a binlog server, check version number. */
uint64_t version_num = server_get_version(srv);
if (version_num >= 100000 && srv->server_type == SERVER_TYPE_MARIADB)
{
m_version = MariaDBServer::MARIADB_VERSION_100;
m_version = version::MARIADB_100;
}
else if (version_num >= 5 * 10000 + 5 * 100)
{
m_version = MariaDBServer::MARIADB_VERSION_55;
m_version = version::MARIADB_MYSQL_55;
}
else
{
m_version = MariaDBServer::MARIADB_VERSION_UNKNOWN;
}
}

View File

@ -76,23 +76,25 @@ class MariaDBServer
{
public:
typedef std::vector<SlaveStatus> SlaveStatusArray;
enum mariadb_version
enum class version
{
MARIADB_VERSION_UNKNOWN, // Anything older than 5.5. These are no longer supported by the monitor.
MARIADB_VERSION_55, // 5.5, oldest still supported release. Not all monitor features work.
MARIADB_VERSION_100 // 10.0 and greater. In practice though, 10.0.2 or greater is assumed.
UNKNOWN, /* Anything older than 5.5. These are no longer supported by the monitor. */
MARIADB_MYSQL_55, /* MariaDB 5.5 series or MySQL 5.5 and later. Does not have gtid (on MariaDB) so
* all gtid-related features (failover etc.) are disabled. */
MARIADB_100, /* MariaDB 10.0 and greater. In practice though, 10.0.2 or greater is assumed.
* All monitor features are on. */
BINLOG_ROUTER /* MaxScale binlog server. Requires special handling. */
};
MXS_MONITORED_SERVER* m_server_base; /**< Monitored server base class/struct. MariaDBServer does not
* own the struct, it is not freed (or connection closed) when
* a MariaDBServer is destroyed. Can be const on gcc 4.8 */
bool m_report_version_error; /**< Report version error for this server. */
mariadb_version m_version; /**< Server version */
version m_version; /**< Server version/type. */
int64_t m_server_id; /**< Value of @@server_id. Valid values are 32bit unsigned. */
int m_group; /**< Multi-master group where this server belongs,
* 0 for servers not in groups */
bool m_read_only; /**< Value of @@read_only */
bool m_binlog_relay; /** Server is a Binlog Relay */
size_t m_n_slaves_running; /**< Number of running slave connections */
int m_n_slave_heartbeats; /**< Number of received heartbeats */
double m_heartbeat_period; /**< The time interval between heartbeats */