MXS-2276 Use dynamic servers also for cluster check
Once the monitor has been able to connect to a clustrix node and obtain the clustrix nodes, it'll primarily use those nodes when looking for a Clustrix node to be used as the "hub". With this change it is sufficient (but perhaps unwise) to provide a single node boostrap node in the configuration file. Some other rearrangements and renamings of functions has also been made.
This commit is contained in:
@ -86,3 +86,92 @@ Clustrix::SubState Clustrix::substate_from_string(const std::string& substate)
|
||||
return SubState::UNKNOWN;
|
||||
}
|
||||
}
|
||||
|
||||
bool Clustrix::is_part_of_the_quorum(const SERVER& server, MYSQL* pCon)
|
||||
{
|
||||
bool rv = false;
|
||||
|
||||
const char* zAddress = server.address;
|
||||
int port = server.port;
|
||||
|
||||
const char ZQUERY_TEMPLATE[] =
|
||||
"SELECT ms.status FROM system.membership AS ms INNER JOIN system.nodeinfo AS ni "
|
||||
"ON ni.nodeid = ms.nid WHERE ni.iface_ip = '%s'";
|
||||
|
||||
char zQuery[sizeof(ZQUERY_TEMPLATE) + strlen(zAddress)];
|
||||
|
||||
sprintf(zQuery, ZQUERY_TEMPLATE, zAddress);
|
||||
|
||||
if (mysql_query(pCon, zQuery) == 0)
|
||||
{
|
||||
MYSQL_RES* pResult = mysql_store_result(pCon);
|
||||
|
||||
if (pResult)
|
||||
{
|
||||
mxb_assert(mysql_field_count(pCon) == 1);
|
||||
|
||||
MYSQL_ROW row;
|
||||
while ((row = mysql_fetch_row(pResult)) != nullptr)
|
||||
{
|
||||
if (row[0])
|
||||
{
|
||||
Clustrix::Status status = Clustrix::status_from_string(row[0]);
|
||||
|
||||
switch (status)
|
||||
{
|
||||
case Clustrix::Status::QUORUM:
|
||||
rv = true;
|
||||
break;
|
||||
|
||||
case Clustrix::Status::STATIC:
|
||||
MXS_NOTICE("Node %s:%d is not part of the quorum, switching to "
|
||||
"other node for monitoring.", zAddress, port);
|
||||
break;
|
||||
|
||||
case Clustrix::Status::UNKNOWN:
|
||||
MXS_WARNING("Do not know how to interpret '%s'. Assuming node %s:%d "
|
||||
"is not part of the quorum.", row[0], zAddress, port);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MXS_WARNING("No status returned for '%s' on %s:%d.", zQuery, zAddress, port);
|
||||
}
|
||||
}
|
||||
|
||||
mysql_free_result(pResult);
|
||||
}
|
||||
else
|
||||
{
|
||||
MXS_WARNING("No result returned for '%s' on %s:%d.", zQuery, zAddress, port);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MXS_ERROR("Could not execute '%s' on %s:%d: %s", zQuery, zAddress, port, mysql_error(pCon));
|
||||
}
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
bool Clustrix::ping_or_connect_to_hub(const MXS_MONITOR& mon, SERVER& server, MYSQL** ppCon)
|
||||
{
|
||||
bool connected = false;
|
||||
|
||||
mxs_connect_result_t rv = mon_ping_or_connect_to_db(mon, server, ppCon);
|
||||
|
||||
if (mon_connection_is_ok(rv))
|
||||
{
|
||||
if (Clustrix::is_part_of_the_quorum(server, *ppCon))
|
||||
{
|
||||
connected = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
MXS_ERROR("Could either not ping or create connection to %s:%d: %s",
|
||||
server.address, server.port, mysql_error(*ppCon));
|
||||
}
|
||||
|
||||
return connected;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user