void ClusterTopologyMonitor::NodeMonitoringThread::run()

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;
}