MXS-2271 Remove m_monitor self pointer
This commit is contained in:
@ -336,6 +336,47 @@ protected:
|
|||||||
*/
|
*/
|
||||||
virtual void server_removed(SERVER* server);
|
virtual void server_removed(SERVER* server);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an array of monitored servers. If a server defined in the config setting is not monitored by
|
||||||
|
* this monitor, the returned array will be empty.
|
||||||
|
*
|
||||||
|
* @param key Setting name
|
||||||
|
* @param error_out Set to true if an error occurs
|
||||||
|
* @return Output array
|
||||||
|
*/
|
||||||
|
std::vector<MXS_MONITORED_SERVER*> get_monitored_serverlist(const std::string& key, bool* error_out);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the monitored server representing the server.
|
||||||
|
*
|
||||||
|
* @param search_server Server to search for
|
||||||
|
* @return Found monitored server or NULL if not found
|
||||||
|
*/
|
||||||
|
MXS_MONITORED_SERVER* get_monitored_server(SERVER* search_server);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Load a journal of server states
|
||||||
|
*
|
||||||
|
* @param master Set to point to the current master
|
||||||
|
*/
|
||||||
|
void load_server_journal(MXS_MONITORED_SERVER** master);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Store a journal of server states
|
||||||
|
*
|
||||||
|
* @param master The current master server or NULL if no master exists
|
||||||
|
*/
|
||||||
|
void store_server_journal(MXS_MONITORED_SERVER* master);
|
||||||
|
|
||||||
|
void check_maintenance_requests();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Hangup connections to failed servers
|
||||||
|
*
|
||||||
|
* Injects hangup events for DCB that are connected to servers that are down.
|
||||||
|
*/
|
||||||
|
void hangup_failed_servers();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Contains monitor base class settings. Since monitors are stopped before a setting change,
|
* Contains monitor base class settings. Since monitors are stopped before a setting change,
|
||||||
* the items cannot be modified while a monitor is running. No locking required.
|
* the items cannot be modified while a monitor is running. No locking required.
|
||||||
@ -467,8 +508,6 @@ void monitor_clear_pending_status(MXS_MONITORED_SERVER* mserver, uint64_t bit);
|
|||||||
*/
|
*/
|
||||||
void monitor_set_pending_status(MXS_MONITORED_SERVER* mserver, uint64_t bit);
|
void monitor_set_pending_status(MXS_MONITORED_SERVER* mserver, uint64_t bit);
|
||||||
|
|
||||||
void monitor_check_maintenance_requests(Monitor* monitor);
|
|
||||||
|
|
||||||
bool mon_status_changed(MXS_MONITORED_SERVER* mon_srv);
|
bool mon_status_changed(MXS_MONITORED_SERVER* mon_srv);
|
||||||
bool mon_print_fail_status(MXS_MONITORED_SERVER* mon_srv);
|
bool mon_print_fail_status(MXS_MONITORED_SERVER* mon_srv);
|
||||||
|
|
||||||
@ -490,15 +529,6 @@ bool mon_connection_is_ok(mxs_connect_result_t connect_result);
|
|||||||
void mon_log_connect_error(MXS_MONITORED_SERVER* database, mxs_connect_result_t rval);
|
void mon_log_connect_error(MXS_MONITORED_SERVER* database, mxs_connect_result_t rval);
|
||||||
const char* mon_get_event_name(mxs_monitor_event_t event);
|
const char* mon_get_event_name(mxs_monitor_event_t event);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Hangup connections to failed servers
|
|
||||||
*
|
|
||||||
* Injects hangup events for DCB that are connected to servers that are down.
|
|
||||||
*
|
|
||||||
* @param monitor Monitor object
|
|
||||||
*/
|
|
||||||
void mon_hangup_failed_servers(Monitor* monitor);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Report query errors
|
* @brief Report query errors
|
||||||
*
|
*
|
||||||
@ -535,45 +565,6 @@ json_t* monitor_list_to_json(const char* host);
|
|||||||
*/
|
*/
|
||||||
json_t* monitor_relations_to_server(const SERVER* server, const char* host);
|
json_t* monitor_relations_to_server(const SERVER* server, const char* host);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Store a journal of server states
|
|
||||||
*
|
|
||||||
* @param monitor Monitor to journal
|
|
||||||
* @param master The current master server or NULL if no master exists
|
|
||||||
*/
|
|
||||||
void store_server_journal(Monitor* monitor, MXS_MONITORED_SERVER* master);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Load a journal of server states
|
|
||||||
*
|
|
||||||
* @param monitor Monitor where journal is loaded
|
|
||||||
* @param master Set to point to the current master
|
|
||||||
*/
|
|
||||||
void load_server_journal(Monitor* monitor, MXS_MONITORED_SERVER** master);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Find the monitored server representing the server.
|
|
||||||
*
|
|
||||||
* @param mon Cluster monitor
|
|
||||||
* @param search_server Server to search for
|
|
||||||
* @return Found monitored server or NULL if not found
|
|
||||||
*/
|
|
||||||
MXS_MONITORED_SERVER* mon_get_monitored_server(const Monitor* mon, SERVER* search_server);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get an array of monitored servers. If a server defined in the config setting is not monitored by
|
|
||||||
* the given monitor, the returned array will be empty.
|
|
||||||
*
|
|
||||||
* @param params Config parameters
|
|
||||||
* @param key Setting name
|
|
||||||
* @param mon Monitor which should monitor the servers
|
|
||||||
* @param error_out Set to true if an error occurs
|
|
||||||
* @return Output array
|
|
||||||
*/
|
|
||||||
std::vector<MXS_MONITORED_SERVER*> mon_config_get_servers(const MXS_CONFIG_PARAMETER* params,
|
|
||||||
const char* key, const Monitor* mon,
|
|
||||||
bool* error_out);
|
|
||||||
|
|
||||||
// Function for waiting one monitor interval
|
// Function for waiting one monitor interval
|
||||||
void monitor_debug_wait();
|
void monitor_debug_wait();
|
||||||
|
|
||||||
@ -771,7 +762,6 @@ protected:
|
|||||||
*/
|
*/
|
||||||
virtual bool immediate_tick_required() const;
|
virtual bool immediate_tick_required() const;
|
||||||
|
|
||||||
Monitor* m_monitor; /**< The generic monitor structure. */
|
|
||||||
MXS_MONITORED_SERVER* m_master; /**< Master server */
|
MXS_MONITORED_SERVER* m_master; /**< Master server */
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -1415,9 +1415,9 @@ bool monitor_serialize(const Monitor* monitor)
|
|||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mon_hangup_failed_servers(Monitor* monitor)
|
void Monitor::hangup_failed_servers()
|
||||||
{
|
{
|
||||||
for (MXS_MONITORED_SERVER* ptr : monitor->m_servers)
|
for (MXS_MONITORED_SERVER* ptr : m_servers)
|
||||||
{
|
{
|
||||||
if (mon_status_changed(ptr) && (!(ptr->server->is_usable()) || !(ptr->server->is_in_cluster())))
|
if (mon_status_changed(ptr) && (!(ptr->server->is_usable()) || !(ptr->server->is_in_cluster())))
|
||||||
{
|
{
|
||||||
@ -1438,17 +1438,15 @@ void mon_report_query_error(MXS_MONITORED_SERVER* db)
|
|||||||
/**
|
/**
|
||||||
* Check if admin is requesting setting or clearing maintenance status on the server and act accordingly.
|
* Check if admin is requesting setting or clearing maintenance status on the server and act accordingly.
|
||||||
* Should be called at the beginning of a monitor loop.
|
* Should be called at the beginning of a monitor loop.
|
||||||
*
|
|
||||||
* @param monitor The target monitor
|
|
||||||
*/
|
*/
|
||||||
void monitor_check_maintenance_requests(Monitor* monitor)
|
void Monitor::check_maintenance_requests()
|
||||||
{
|
{
|
||||||
/* In theory, the admin may be modifying the server maintenance status during this function. The overall
|
/* In theory, the admin may be modifying the server maintenance status during this function. The overall
|
||||||
* maintenance flag should be read-written atomically to prevent missing a value. */
|
* maintenance flag should be read-written atomically to prevent missing a value. */
|
||||||
int flags_changed = atomic_exchange_int(&monitor->check_status_flag, Monitor::STATUS_FLAG_NOCHECK);
|
int flags_changed = atomic_exchange_int(&check_status_flag, Monitor::STATUS_FLAG_NOCHECK);
|
||||||
if (flags_changed != Monitor::STATUS_FLAG_NOCHECK)
|
if (flags_changed != Monitor::STATUS_FLAG_NOCHECK)
|
||||||
{
|
{
|
||||||
for (auto ptr : monitor->m_servers)
|
for (auto ptr : m_servers)
|
||||||
{
|
{
|
||||||
// The only server status bit the admin may change is the [Maintenance] bit.
|
// The only server status bit the admin may change is the [Maintenance] bit.
|
||||||
int admin_msg = atomic_exchange_int(&ptr->status_request,
|
int admin_msg = atomic_exchange_int(&ptr->status_request,
|
||||||
@ -1937,12 +1935,13 @@ static bool process_data_file(Monitor* monitor,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void store_server_journal(Monitor* monitor, MXS_MONITORED_SERVER* master)
|
void Monitor::store_server_journal(MXS_MONITORED_SERVER* master)
|
||||||
{
|
{
|
||||||
|
auto monitor = this; // TODO: cleanup later
|
||||||
/** Calculate how much memory we need to allocate */
|
/** Calculate how much memory we need to allocate */
|
||||||
uint32_t size = MMB_LEN_SCHEMA_VERSION + MMB_LEN_CRC32;
|
uint32_t size = MMB_LEN_SCHEMA_VERSION + MMB_LEN_CRC32;
|
||||||
|
|
||||||
for (MXS_MONITORED_SERVER* db : monitor->m_servers)
|
for (MXS_MONITORED_SERVER* db : m_servers)
|
||||||
{
|
{
|
||||||
/** Each server is stored as a type byte and a null-terminated string
|
/** Each server is stored as a type byte and a null-terminated string
|
||||||
* followed by eight byte server status. */
|
* followed by eight byte server status. */
|
||||||
@ -2001,8 +2000,9 @@ void store_server_journal(Monitor* monitor, MXS_MONITORED_SERVER* master)
|
|||||||
MXS_FREE(data);
|
MXS_FREE(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void load_server_journal(Monitor* monitor, MXS_MONITORED_SERVER** master)
|
void Monitor::load_server_journal(MXS_MONITORED_SERVER** master)
|
||||||
{
|
{
|
||||||
|
auto monitor = this; // TODO: cleanup later
|
||||||
char path[PATH_MAX];
|
char path[PATH_MAX];
|
||||||
FILE* file = open_data_file(monitor, path);
|
FILE* file = open_data_file(monitor, path);
|
||||||
|
|
||||||
@ -2137,45 +2137,43 @@ bool Monitor::journal_is_stale() const
|
|||||||
return is_stale;
|
return is_stale;
|
||||||
}
|
}
|
||||||
|
|
||||||
MXS_MONITORED_SERVER* mon_get_monitored_server(const Monitor* mon, SERVER* search_server)
|
MXS_MONITORED_SERVER* Monitor::get_monitored_server(SERVER* search_server)
|
||||||
{
|
{
|
||||||
mxb_assert(mon && search_server);
|
mxb_assert(search_server);
|
||||||
for (MXS_MONITORED_SERVER* iter : mon->m_servers)
|
for (const auto iter : m_servers)
|
||||||
{
|
{
|
||||||
if (iter->server == search_server)
|
if (iter->server == search_server)
|
||||||
{
|
{
|
||||||
return iter;
|
return iter;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<MXS_MONITORED_SERVER*> mon_config_get_servers(const MXS_CONFIG_PARAMETER* params,
|
std::vector<MXS_MONITORED_SERVER*> Monitor::get_monitored_serverlist(const string& key, bool* error_out)
|
||||||
const char* key, const Monitor* mon,
|
|
||||||
bool* error_out)
|
|
||||||
{
|
{
|
||||||
std::vector<MXS_MONITORED_SERVER*> monitored_array;
|
std::vector<MXS_MONITORED_SERVER*> monitored_array;
|
||||||
// Check that value exists.
|
// Check that value exists.
|
||||||
if (!params->contains(key))
|
if (!parameters.contains(key))
|
||||||
{
|
{
|
||||||
return monitored_array;
|
return monitored_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
string name_error;
|
string name_error;
|
||||||
auto servers = params->get_server_list(key, &name_error);
|
auto servers = parameters.get_server_list(key, &name_error);
|
||||||
if (!servers.empty())
|
if (!servers.empty())
|
||||||
{
|
{
|
||||||
// All servers in the array must be monitored by the given monitor.
|
// All servers in the array must be monitored by the given monitor.
|
||||||
for (auto elem : servers)
|
for (auto elem : servers)
|
||||||
{
|
{
|
||||||
MXS_MONITORED_SERVER* mon_serv = mon_get_monitored_server(mon, elem);
|
MXS_MONITORED_SERVER* mon_serv = get_monitored_server(elem);
|
||||||
if (mon_serv)
|
if (mon_serv)
|
||||||
{
|
{
|
||||||
monitored_array.push_back(mon_serv);
|
monitored_array.push_back(mon_serv);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MXS_ERROR("Server '%s' is not monitored by monitor '%s'.", elem->name(), mon->m_name);
|
MXS_ERROR("Server '%s' is not monitored by monitor '%s'.", elem->name(), m_name);
|
||||||
*error_out = true;
|
*error_out = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2187,7 +2185,8 @@ std::vector<MXS_MONITORED_SERVER*> mon_config_get_servers(const MXS_CONFIG_PARAM
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
MXS_ERROR("Serverlist setting '%s' contains invalid server name '%s'.", key, name_error.c_str());
|
MXS_ERROR("Serverlist setting '%s' contains invalid server name '%s'.",
|
||||||
|
key.c_str(), name_error.c_str());
|
||||||
*error_out = true;
|
*error_out = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2218,7 +2217,7 @@ const char WRN_REQUEST_OVERWRITTEN[] =
|
|||||||
|
|
||||||
bool Monitor::set_server_status(SERVER* srv, int bit, string* errmsg_out)
|
bool Monitor::set_server_status(SERVER* srv, int bit, string* errmsg_out)
|
||||||
{
|
{
|
||||||
MXS_MONITORED_SERVER* msrv = mon_get_monitored_server(this, srv);
|
MXS_MONITORED_SERVER* msrv = get_monitored_server(srv);
|
||||||
mxb_assert(msrv);
|
mxb_assert(msrv);
|
||||||
|
|
||||||
if (!msrv)
|
if (!msrv)
|
||||||
@ -2281,7 +2280,7 @@ bool Monitor::set_server_status(SERVER* srv, int bit, string* errmsg_out)
|
|||||||
|
|
||||||
bool Monitor::clear_server_status(SERVER* srv, int bit, string* errmsg_out)
|
bool Monitor::clear_server_status(SERVER* srv, int bit, string* errmsg_out)
|
||||||
{
|
{
|
||||||
MXS_MONITORED_SERVER* msrv = mon_get_monitored_server(this, srv);
|
MXS_MONITORED_SERVER* msrv = get_monitored_server(srv);
|
||||||
mxb_assert(msrv);
|
mxb_assert(msrv);
|
||||||
|
|
||||||
if (!msrv)
|
if (!msrv)
|
||||||
@ -2383,7 +2382,6 @@ namespace maxscale
|
|||||||
|
|
||||||
MonitorWorker::MonitorWorker(const string& name, const string& module)
|
MonitorWorker::MonitorWorker(const string& name, const string& module)
|
||||||
: Monitor(name, module)
|
: Monitor(name, module)
|
||||||
, m_monitor(this)
|
|
||||||
, m_master(NULL)
|
, m_master(NULL)
|
||||||
, m_thread_running(false)
|
, m_thread_running(false)
|
||||||
, m_shutdown(0)
|
, m_shutdown(0)
|
||||||
@ -2770,7 +2768,7 @@ bool MonitorWorker::pre_run()
|
|||||||
m_thread_running.store(true, std::memory_order_release);
|
m_thread_running.store(true, std::memory_order_release);
|
||||||
m_semaphore.post();
|
m_semaphore.post();
|
||||||
|
|
||||||
load_server_journal(m_monitor, &m_master);
|
load_server_journal(&m_master);
|
||||||
pre_loop();
|
pre_loop();
|
||||||
delayed_call(1, &MonitorWorker::call_run_one_tick, this);
|
delayed_call(1, &MonitorWorker::call_run_one_tick, this);
|
||||||
}
|
}
|
||||||
@ -2823,7 +2821,7 @@ bool MonitorWorker::call_run_one_tick(Worker::Call::action_t action)
|
|||||||
|
|
||||||
void MonitorWorker::run_one_tick()
|
void MonitorWorker::run_one_tick()
|
||||||
{
|
{
|
||||||
monitor_check_maintenance_requests(m_monitor);
|
check_maintenance_requests();
|
||||||
|
|
||||||
tick();
|
tick();
|
||||||
mxb::atomic::add(&m_ticks, 1, mxb::atomic::RELAXED);
|
mxb::atomic::add(&m_ticks, 1, mxb::atomic::RELAXED);
|
||||||
@ -2832,8 +2830,8 @@ void MonitorWorker::run_one_tick()
|
|||||||
|
|
||||||
process_state_changes();
|
process_state_changes();
|
||||||
|
|
||||||
mon_hangup_failed_servers(m_monitor);
|
hangup_failed_servers();
|
||||||
store_server_journal(m_monitor, m_master);
|
store_server_journal(m_master);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MonitorWorker::immediate_tick_required() const
|
bool MonitorWorker::immediate_tick_required() const
|
||||||
|
@ -218,7 +218,7 @@ bool MariaDBMonitor::configure(const MXS_CONFIG_PARAMETER* params)
|
|||||||
m_excluded_servers.clear();
|
m_excluded_servers.clear();
|
||||||
bool settings_ok = true;
|
bool settings_ok = true;
|
||||||
bool list_error = false;
|
bool list_error = false;
|
||||||
auto excluded = mon_config_get_servers(params, CN_NO_PROMOTE_SERVERS, m_monitor, &list_error);
|
auto excluded = get_monitored_serverlist(CN_NO_PROMOTE_SERVERS, &list_error);
|
||||||
if (list_error)
|
if (list_error)
|
||||||
{
|
{
|
||||||
settings_ok = false;
|
settings_ok = false;
|
||||||
|
Reference in New Issue
Block a user