MXS-2220 Read server version using public methods

Version related fields have been removed from the public class.
This commit is contained in:
Esa Korhonen
2018-12-18 16:39:39 +02:00
parent d1b098d3b0
commit 09aa54720d
15 changed files with 100 additions and 167 deletions

View File

@ -37,12 +37,6 @@
/** Don't include the root user */
#define USERS_QUERY_NO_ROOT " AND user.user NOT IN ('root')"
/** Normal password column name */
#define MYSQL_PASSWORD "password"
/** MySQL 5.7 password column name */
#define MYSQL57_PASSWORD "authentication_string"
// Query used with 10.0 or older
const char* mariadb_users_query_format =
"SELECT u.user, u.host, d.db, u.select_priv, u.%s "
@ -170,10 +164,27 @@ static char* get_mariadb_101_users_query(bool include_root)
return rval;
}
static char* get_mariadb_users_query(bool include_root, const char* server_version)
/**
* Return the column name of the password hash in the mysql.user table.
*
* @param version Server version
* @return Column name
*/
static const char* get_password_column_name(const SERVER::Version& version)
{
const char* password = strstr(server_version, "5.7.") || strstr(server_version, "8.0.") ?
MYSQL57_PASSWORD : MYSQL_PASSWORD;
const char* rval = "password"; // Usual result, used in MariaDB.
auto major = version.major;
auto minor = version.minor;
if ((major == 5 && minor == 7) || (major == 8 && minor == 0))
{
rval = "authentication_string";
}
return rval;
}
static char* get_mariadb_users_query(bool include_root, const SERVER::Version& version)
{
const char* password = get_password_column_name(version);
const char* with_root = include_root ? "" : " AND u.user NOT IN ('root')";
size_t n_bytes = snprintf(NULL, 0, mariadb_users_query_format, password, with_root, password, with_root);
@ -196,16 +207,14 @@ static char* get_clustrix_users_query(bool include_root)
return rval;
}
static char* get_users_query(const char* server_version, int version, bool include_root, server_category_t category)
static char* get_users_query(const SERVER::Version& version, bool include_root, server_category_t category)
{
char* rval = nullptr;
switch (category)
{
case SERVER_ROLES:
rval =
version >= 100202 ?
get_mariadb_102_users_query(include_root) :
rval = version.total >= 100202 ? get_mariadb_102_users_query(include_root) :
get_mariadb_101_users_query(include_root);
break;
@ -215,7 +224,7 @@ static char* get_users_query(const char* server_version, int version, bool inclu
case SERVER_NO_ROLES:
// Either an older MariaDB version or a MySQL variant, use the legacy query
rval = get_mariadb_users_query(include_root, server_version);
rval = get_mariadb_users_query(include_root, version);
break;
default:
@ -764,8 +773,8 @@ static bool check_default_table_permissions(MYSQL* mysql,
bool rval = true;
const char* format = "SELECT user, host, %s, Select_priv FROM mysql.user limit 1";
const char* query_pw = strstr(server->version_string, "5.7.") ?
MYSQL57_PASSWORD : MYSQL_PASSWORD;
const char* query_pw = get_password_column_name(server->version());
char query[strlen(format) + strlen(query_pw) + 1];
sprintf(query, format, query_pw);
@ -890,15 +899,13 @@ static bool check_server_permissions(SERVICE* service,
mysql_get_character_set_info(mysql, &cs_info);
server->charset = cs_info.number;
if (server->version_string[0] == 0)
if (server->version().total == 0)
{
mxs_mysql_update_server_version(mysql, server);
mxs_mysql_update_server_version(server, mysql);
}
bool is_clustrix = (strcasestr(server->version_string, "clustrix") != nullptr);
bool rval = true;
if (is_clustrix)
if (server->type() == SERVER::Type::CLUSTRIX)
{
rval = check_clustrix_table_permissions(mysql, service, server, user);
}
@ -992,8 +999,7 @@ static bool get_hostname(DCB* dcb, char* client_hostname, size_t size)
static bool roles_are_available(MYSQL* conn, SERVICE* service, SERVER* server)
{
bool rval = false;
if (server->version >= 100101)
if (server->version().total >= 100101)
{
static bool log_missing_privs = true;
@ -1097,18 +1103,20 @@ bool query_and_process_users(const char* query,
int get_users_from_server(MYSQL* con, SERVER_REF* server_ref, SERVICE* service, Listener* listener)
{
if (server_ref->server->version_string[0] == 0)
SERVER* server = server_ref->server;
auto server_version = server->version();
if (server_version.total == 0) // No monitor or the monitor hasn't ran yet.
{
mxs_mysql_update_server_version(con, server_ref->server);
mxs_mysql_update_server_version(server, con);
server_version = server->version();
}
server_category_t category;
if (strstr(server_ref->server->version_string, "clustrix") != nullptr)
if (server->type() == SERVER::Type::CLUSTRIX)
{
category = SERVER_CLUSTRIX;
}
else if (roles_are_available(con, service, server_ref->server))
else if (roles_are_available(con, service, server))
{
category = SERVER_ROLES;
}
@ -1117,10 +1125,7 @@ int get_users_from_server(MYSQL* con, SERVER_REF* server_ref, SERVICE* service,
category = SERVER_NO_ROLES;
}
char* query = get_users_query(server_ref->server->version_string,
server_ref->server->version,
service->enable_root,
category);
char* query = get_users_query(server_version, service->enable_root, category);
MYSQL_AUTH* instance = (MYSQL_AUTH*)listener->auth_instance();
sqlite3* handle = get_handle(instance);
@ -1128,20 +1133,20 @@ int get_users_from_server(MYSQL* con, SERVER_REF* server_ref, SERVICE* service,
bool rv = query_and_process_users(query, con, handle, service, &users, category);
if (!rv && have_mdev13453_problem(con, server_ref->server))
if (!rv && have_mdev13453_problem(con, server))
{
/**
* Try to work around MDEV-13453 by using a query without CTEs. Masquerading as
* a 10.1.10 server makes sure CTEs aren't used.
*/
MXS_FREE(query);
query = get_users_query(server_ref->server->version_string, 100110, service->enable_root, SERVER_ROLES);
query = get_users_query(server_version, service->enable_root, SERVER_ROLES);
rv = query_and_process_users(query, con, handle, service, &users, SERVER_ROLES);
}
if (!rv)
{
MXS_ERROR("Failed to load users from server '%s': %s", server_ref->server->name, mysql_error(con));
MXS_ERROR("Failed to load users from server '%s': %s", server->name, mysql_error(con));
}
MXS_FREE(query);

View File

@ -127,11 +127,10 @@ void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
{
MYSQL_ROW row;
MYSQL_RES* result;
char* server_string;
/* get server version string */
mxs_mysql_update_server_version(monitored_server->con, monitored_server->server);
server_string = monitored_server->server->version_string;
mxs_mysql_update_server_version(monitored_server->server, monitored_server->con);
auto server_string = monitored_server->server->version_string();
/* Check if the the Galera FSM shows this node is joined to the cluster */
const char* cluster_member =
@ -150,7 +149,7 @@ void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
MXS_ERROR("Unexpected result for \"%s\". "
"Expected 2 columns. MySQL Version: %s",
cluster_member,
server_string);
server_string.c_str());
return;
}
GaleraNode info = {};
@ -193,7 +192,7 @@ void GaleraMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
}
/* Check if the node is a donor and is using xtrabackup, in this case it can stay alive */
else if (strcmp(row[1], "2") == 0 && m_availableWhenDonor == 1
&& using_xtrabackup(monitored_server, server_string))
&& using_xtrabackup(monitored_server, server_string.c_str()))
{
info.joined = 1;
}

View File

@ -1494,7 +1494,8 @@ void MariaDBMonitor::check_cluster_operations_support()
supported = false;
auto reason = string_printf("The version of '%s' (%s) is not supported. Failover/switchover "
"requires MariaDB 10.0.2 or later.",
server->name(), server->m_server_base->server->version_string);
server->name(),
server->m_server_base->server->version_string().c_str());
printer.cat(all_reasons, reason);
}

View File

@ -887,20 +887,18 @@ bool MariaDBServer::update_slave_status(string* errmsg_out)
void MariaDBServer::update_server_version()
{
m_srv_type = server_type::UNKNOWN;
auto conn = m_server_base->con;
auto srv = m_server_base->server;
mxs_mysql_update_server_version(srv, conn);
/* 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_update_server_version(conn, srv);
// Check whether this server is a MaxScale Binlog Server.
m_srv_type = server_type::UNKNOWN; // TODO: Use type information in SERVER directly
auto server_type = srv->type();
MYSQL_RES* result;
if (strcasestr(srv->version_string, "clustrix") != nullptr)
if (server_type == SERVER::Type::CLUSTRIX)
{
m_srv_type = server_type::CLUSTRIX;
}
// Check whether this server is a MaxScale Binlog Server.
else if (mxs_mysql_query(conn, "SELECT @@maxscale_version") == 0
&& (result = mysql_store_result(conn)) != NULL)
{
@ -912,7 +910,7 @@ void MariaDBServer::update_server_version()
/* Not a binlog server, check version number and supported features. */
m_srv_type = server_type::NORMAL;
m_capabilities = Capabilities();
SERVER::Version info = srv->get_version();
SERVER::Version info = srv->version();
auto major = info.major;
auto minor = info.minor;
auto patch = info.patch;
@ -921,7 +919,7 @@ void MariaDBServer::update_server_version()
{
m_capabilities.basic_support = true;
// For more specific features, at least MariaDB 10.X is needed.
if (srv->server_type == SERVER_TYPE_MARIADB && major >= 10)
if (server_type == SERVER::Type::MARIADB && major >= 10)
{
// 10.0.2 or 10.1.X or greater than 10
if (((minor == 0 && patch >= 2) || minor >= 1) || major > 10)
@ -938,7 +936,7 @@ void MariaDBServer::update_server_version()
else
{
MXS_ERROR("MariaDB/MySQL version of '%s' (%s) is less than 5.5, which is not supported. "
"The server is ignored by the monitor.", name(), srv->version_string);
"The server is ignored by the monitor.", name(), srv->version_string().c_str());
}
}
}

View File

@ -81,15 +81,13 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
int isslave = 0;
int ismaster = 0;
unsigned long int server_version = 0;
char* server_string;
/* get server version from current server */
server_version = mysql_get_server_version(monitored_server->con);
/* get server version string */
mxs_mysql_update_server_version(monitored_server->con, monitored_server->server);
server_string = monitored_server->server->version_string;
mxs_mysql_update_server_version(monitored_server->server, monitored_server->con);
auto server_string = monitored_server->server->version_string();
/* get server_id form current node */
if (mxs_mysql_query(monitored_server->con, "SELECT @@server_id") == 0
@ -102,7 +100,7 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
mysql_free_result(result);
MXS_ERROR("Unexpected result for 'SELECT @@server_id'. Expected 1 column."
" MySQL Version: %s",
server_string);
server_string.c_str());
return;
}
@ -141,7 +139,7 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
mysql_free_result(result);
MXS_ERROR("\"SHOW ALL SLAVES STATUS\" returned less than the expected"
" amount of columns. Expected 42 columns MySQL Version: %s",
server_string);
server_string.c_str());
return;
}
@ -211,7 +209,7 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
"replication tree cannot be resolved for server %s."
" MySQL Version: %s",
monitored_server->server->name,
server_string);
server_string.c_str());
monitored_server->log_version_err = false;
}
}
@ -220,7 +218,7 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
MXS_ERROR("\"SHOW SLAVE STATUS\" "
"returned less than the expected amount of columns. "
"Expected 40 columns. MySQL Version: %s",
server_string);
server_string.c_str());
}
return;
}
@ -269,7 +267,7 @@ void MMMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
mysql_free_result(result);
MXS_ERROR("Unexpected result for \"SHOW GLOBAL VARIABLES LIKE 'read_only'\". "
"Expected 2 columns. MySQL Version: %s",
server_string);
server_string.c_str());
return;
}

View File

@ -47,11 +47,9 @@ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
MYSQL_ROW row;
MYSQL_RES* result;
int isjoined = 0;
char* server_string;
/* get server version string */
mxs_mysql_update_server_version(monitored_server->con, monitored_server->server);
server_string = monitored_server->server->version_string;
mxs_mysql_update_server_version(monitored_server->server, monitored_server->con);
/* Check if the the SQL node is able to contact one or more data nodes */
if (mxs_mysql_query(monitored_server->con, "SHOW STATUS LIKE 'Ndb_number_of_ready_data_nodes'") == 0
@ -63,7 +61,7 @@ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
MXS_ERROR("Unexpected result for \"SHOW STATUS LIKE "
"'Ndb_number_of_ready_data_nodes'\". Expected 2 columns."
" MySQL Version: %s",
server_string);
monitored_server->server->version_string().c_str());
return;
}
@ -91,7 +89,7 @@ void NDBCMonitor::update_server_status(MXS_MONITORED_SERVER* monitored_server)
MXS_ERROR("Unexpected result for \"SHOW STATUS LIKE 'Ndb_cluster_node_id'\". "
"Expected 2 columns."
" MySQL Version: %s",
server_string);
monitored_server->server->version_string().c_str());
return;
}

View File

@ -209,14 +209,14 @@ std::string get_version_string(SERVICE* service)
}
else
{
uint64_t intver = UINT64_MAX;
uint64_t smallest_found = UINT64_MAX;
for (SERVER_REF* ref = service->dbref; ref; ref = ref->next)
{
if (ref->server->version && ref->server->version < intver)
auto version = ref->server->version();
if (version.total > 0 && version.total < smallest_found)
{
rval = ref->server->version_string;
intver = ref->server->version;
rval = ref->server->version_string();
smallest_found = version.total;
}
}
}
@ -265,7 +265,7 @@ int MySQLSendHandshake(DCB* dcb)
{
mysql_server_language = dcb->service->dbref->server->charset;
if (dcb->service->dbref->server->version >= 100200)
if (dcb->service->dbref->server->version().total >= 100200)
{
/** The backend servers support the extended capabilities */
is_maria = true;

View File

@ -1044,8 +1044,8 @@ GWBUF* RWSplitSession::add_prefix_wait_gtid(SERVER* server, GWBUF* origin)
**/
GWBUF* rval = origin;
const char* wait_func = (server->server_type == SERVER_TYPE_MARIADB) ?
MARIADB_WAIT_GTID_FUNC : MYSQL_WAIT_GTID_FUNC;
const char* wait_func = (server->type() == SERVER::Type::MARIADB) ? MARIADB_WAIT_GTID_FUNC :
MYSQL_WAIT_GTID_FUNC;
const char* gtid_wait_timeout = m_config.causal_reads_timeout.c_str();
const char* gtid_position = m_gtid_pos.c_str();