MXS-2271 Remove m_monitor self pointer

This commit is contained in:
Esa Korhonen
2019-03-05 18:19:28 +02:00
parent a8c878fbca
commit 40f24aaaee
3 changed files with 69 additions and 81 deletions

View File

@ -336,6 +336,47 @@ protected:
*/
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,
* 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_check_maintenance_requests(Monitor* monitor);
bool mon_status_changed(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);
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
*
@ -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);
/**
* @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
void monitor_debug_wait();
@ -771,7 +762,6 @@ protected:
*/
virtual bool immediate_tick_required() const;
Monitor* m_monitor; /**< The generic monitor structure. */
MXS_MONITORED_SERVER* m_master; /**< Master server */
private:

View File

@ -1415,9 +1415,9 @@ bool monitor_serialize(const Monitor* monitor)
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())))
{
@ -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.
* 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
* 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)
{
for (auto ptr : monitor->m_servers)
for (auto ptr : m_servers)
{
// The only server status bit the admin may change is the [Maintenance] bit.
int admin_msg = atomic_exchange_int(&ptr->status_request,
@ -1937,12 +1935,13 @@ static bool process_data_file(Monitor* monitor,
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 */
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
* followed by eight byte server status. */
@ -2001,8 +2000,9 @@ void store_server_journal(Monitor* monitor, MXS_MONITORED_SERVER* master)
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];
FILE* file = open_data_file(monitor, path);
@ -2137,45 +2137,43 @@ bool Monitor::journal_is_stale() const
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);
for (MXS_MONITORED_SERVER* iter : mon->m_servers)
mxb_assert(search_server);
for (const auto iter : m_servers)
{
if (iter->server == search_server)
{
return iter;
}
}
return NULL;
return nullptr;
}
std::vector<MXS_MONITORED_SERVER*> mon_config_get_servers(const MXS_CONFIG_PARAMETER* params,
const char* key, const Monitor* mon,
bool* error_out)
std::vector<MXS_MONITORED_SERVER*> Monitor::get_monitored_serverlist(const string& key, bool* error_out)
{
std::vector<MXS_MONITORED_SERVER*> monitored_array;
// Check that value exists.
if (!params->contains(key))
if (!parameters.contains(key))
{
return monitored_array;
}
string name_error;
auto servers = params->get_server_list(key, &name_error);
auto servers = parameters.get_server_list(key, &name_error);
if (!servers.empty())
{
// All servers in the array must be monitored by the given monitor.
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)
{
monitored_array.push_back(mon_serv);
}
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;
}
}
@ -2187,7 +2185,8 @@ std::vector<MXS_MONITORED_SERVER*> mon_config_get_servers(const MXS_CONFIG_PARAM
}
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;
}
@ -2218,7 +2217,7 @@ const char WRN_REQUEST_OVERWRITTEN[] =
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);
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)
{
MXS_MONITORED_SERVER* msrv = mon_get_monitored_server(this, srv);
MXS_MONITORED_SERVER* msrv = get_monitored_server(srv);
mxb_assert(msrv);
if (!msrv)
@ -2383,7 +2382,6 @@ namespace maxscale
MonitorWorker::MonitorWorker(const string& name, const string& module)
: Monitor(name, module)
, m_monitor(this)
, m_master(NULL)
, m_thread_running(false)
, m_shutdown(0)
@ -2770,7 +2768,7 @@ bool MonitorWorker::pre_run()
m_thread_running.store(true, std::memory_order_release);
m_semaphore.post();
load_server_journal(m_monitor, &m_master);
load_server_journal(&m_master);
pre_loop();
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()
{
monitor_check_maintenance_requests(m_monitor);
check_maintenance_requests();
tick();
mxb::atomic::add(&m_ticks, 1, mxb::atomic::RELAXED);
@ -2832,8 +2830,8 @@ void MonitorWorker::run_one_tick()
process_state_changes();
mon_hangup_failed_servers(m_monitor);
store_server_journal(m_monitor, m_master);
hangup_failed_servers();
store_server_journal(m_master);
}
bool MonitorWorker::immediate_tick_required() const

View File

@ -218,7 +218,7 @@ bool MariaDBMonitor::configure(const MXS_CONFIG_PARAMETER* params)
m_excluded_servers.clear();
bool settings_ok = true;
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)
{
settings_ok = false;