From a47141715043f7aee5583d51b165202355140a74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Wed, 17 Apr 2019 15:17:09 +0300 Subject: [PATCH] MXS-1922: Show GTIDs for Galera nodes Galera generates GTIDs even if they are unique across all nodes and it makes sense to display this. --- server/modules/monitor/galeramon/galeramon.cc | 43 ++++++++++++++++++- server/modules/monitor/galeramon/galeramon.hh | 3 ++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/server/modules/monitor/galeramon/galeramon.cc b/server/modules/monitor/galeramon/galeramon.cc index c3d971670..16204940b 100644 --- a/server/modules/monitor/galeramon/galeramon.cc +++ b/server/modules/monitor/galeramon/galeramon.cc @@ -29,6 +29,7 @@ #include #include #include +#include #define DONOR_NODE_NAME_MAX_LEN 60 #define DONOR_LIST_SET_VAR "SET GLOBAL wsrep_sst_donor = \"" @@ -101,6 +102,25 @@ json_t* GaleraMonitor::diagnostics_json() const json_object_set_new(rval, "cluster_size", json_integer(m_cluster_size)); } + json_t* arr = json_array(); + + for (auto ptr : m_servers) + { + auto it = m_info.find(ptr); + + if (it != m_info.end()) + { + json_t* obj = json_object(); + json_object_set_new(obj, "name", json_string(it->first->server->name())); + json_object_set_new(obj, "gtid_current_pos", json_string(it->second.gtid_current_pos.c_str())); + json_object_set_new(obj, "gtid_binlog_pos", json_string(it->second.gtid_binlog_pos.c_str())); + json_object_set_new(obj, "read_only", json_boolean(it->second.read_only)); + json_array_append_new(arr, obj); + } + } + + json_object_set_new(rval, "server_info", arr); + return rval; } @@ -130,6 +150,24 @@ bool GaleraMonitor::has_sufficient_permissions() return test_permissions("SHOW STATUS LIKE 'wsrep_local_state'"); } +void get_gtid(MonitorServer* srv, GaleraNode* info) +{ + if (mxs_mysql_query(srv->con, "SELECT @@gtid_current_pos, @@gtid_binlog_pos, @@read_only") == 0) + { + if (auto result = mysql_store_result(srv->con)) + { + mxq::QueryResult res(result); + + if (res.next_row()) + { + info->gtid_current_pos = res.get_string(0); + info->gtid_binlog_pos = res.get_string(1); + info->read_only = res.get_bool(2); + } + } + } +} + void GaleraMonitor::update_server_status(MonitorServer* monitored_server) { MYSQL_ROW row; @@ -218,11 +256,12 @@ void GaleraMonitor::update_server_status(MonitorServer* monitored_server) } } + mysql_free_result(result); + + get_gtid(monitored_server, &info); monitored_server->server->node_id = info.joined ? info.local_index : -1; m_info[monitored_server] = info; - - mysql_free_result(result); } else { diff --git a/server/modules/monitor/galeramon/galeramon.hh b/server/modules/monitor/galeramon/galeramon.hh index 5d5bb29ec..dc397afaa 100644 --- a/server/modules/monitor/galeramon/galeramon.hh +++ b/server/modules/monitor/galeramon/galeramon.hh @@ -30,6 +30,9 @@ struct GaleraNode int local_state; /**< Node state */ int cluster_size; /**< The cluster size*/ std::string cluster_uuid; /**< Cluster UUID */ + std::string gtid_binlog_pos; + std::string gtid_current_pos; + bool read_only = false; }; typedef std::unordered_map NodeMap;