in src/failover/cluster_topology_monitor.cc [461:495]
void ClusterTopologyMonitor::NodeMonitoringThread::run() {
std::string thread_host = host_info_->GetHost();
auto updated_conn_str = main_monitor_->ConnForHost(thread_host);
SQLTCHAR* conn_cstr = AS_SQLTCHAR(updated_conn_str.c_str());
try {
bool should_stop = main_monitor_->node_threads_stop_.load();
while (!should_stop) {
if (!main_monitor_->odbc_helper_->CheckConnection(hdbc_)) {
if (hdbc_ != SQL_NULL_HDBC) {
// Not an initial connection.
LOG(WARNING) << "Failover Monitor for: " << thread_host << " not connected. Trying to reconnect.";
}
handle_reconnect(conn_cstr);
} else {
// Get Writer ID
std::string writer_id = main_monitor_->query_helper_->GetWriterId(hdbc_);
if (!writer_id.empty()) { // Connected to a Writer
LOG(WARNING) << "Writer " << writer_id << " detected by node monitoring thread: " << thread_host;
handle_writer_conn();
} else { // Connected to a Reader
handle_reader_conn();
}
}
std::this_thread::sleep_for(std::chrono::milliseconds(THREAD_SLEEP_MS_));
should_stop = main_monitor_->node_threads_stop_.load();
}
} catch (const std::exception& ex) {
LOG(ERROR) << "Exception while node monitoring for: " << thread_host << ex.what();
}
// Close any open connections / handles
main_monitor_->odbc_helper_->Cleanup(SQL_NULL_HANDLE, hdbc_, SQL_NULL_HANDLE);
hdbc_ = SQL_NULL_HDBC;
}