MXS-1775 Move monitor loop to MonitorInstance

This commit is contained in:
Johan Wikman 2018-05-17 14:07:12 +03:00
parent db30ea96f2
commit 650a739c92
12 changed files with 61 additions and 236 deletions

View File

@ -33,23 +33,27 @@ public:
protected:
MonitorInstance(MXS_MONITOR* pMonitor);
const std::string& script() const { return m_script; }
uint64_t events() const { return m_events; }
virtual bool has_sufficient_permissions() const;
virtual void configure(const MXS_CONFIG_PARAMETER* pParams);
virtual void main() = 0;
static void main(void* pArg);
virtual void tick() = 0;
MXS_MONITOR* m_monitor; /**< The generic monitor structure. */
int32_t m_shutdown; /**< Non-zero if the monitor should shut down. */
std::string m_script; /**< Launchable script. */
uint64_t m_events; /**< Enabled monitor events. */
bool m_checked; /**< Whether server access has been checked. */
MXS_MONITORED_SERVER* m_master; /**< Master server */
private:
int32_t m_status; /**< The current status of the monitor. */
THREAD m_thread; /**< The thread handle of the monitoring thread. */
int32_t m_status; /**< The current status of the monitor. */
THREAD m_thread; /**< The thread handle of the monitoring thread. */
int32_t m_shutdown; /**< Non-zero if the monitor should shut down. */
bool m_checked; /**< Whether server access has been checked. */
std::string m_script; /**< Launchable script. */
uint64_t m_events; /**< Enabled monitor events. */
void main();
static void main(void* pArg);
};
/**

View File

@ -2508,11 +2508,12 @@ namespace maxscale
MonitorInstance::MonitorInstance(MXS_MONITOR* pMonitor)
: m_monitor(pMonitor)
, m_shutdown(0)
, m_events(0)
, m_master(NULL)
, m_status(MXS_MONITOR_STOPPED)
, m_thread(0)
, m_shutdown(0)
, m_checked(false)
, m_events(0)
{
}
@ -2584,6 +2585,47 @@ void MonitorInstance::configure(const MXS_CONFIG_PARAMETER* pParams)
{
}
void MonitorInstance::main()
{
atomic_store_int32(&m_status, MXS_MONITOR_RUNNING);
load_server_journal(m_monitor, &m_master);
while (!m_shutdown)
{
lock_monitor_servers(m_monitor);
servers_status_pending_to_current(m_monitor);
tick();
/**
* After updating the status of all servers, check if monitor events
* need to be launched.
*/
mon_process_state_changes(m_monitor, m_script.empty() ? NULL : m_script.c_str(), m_events);
mon_hangup_failed_servers(m_monitor);
servers_status_current_to_pending(m_monitor);
store_server_journal(m_monitor, m_master);
release_monitor_servers(m_monitor);
/** Sleep until the next monitoring interval */
unsigned int ms = 0;
while (ms < m_monitor->interval && !m_shutdown)
{
if (m_monitor->server_pending_changes)
{
// Admin has changed something, skip sleep
break;
}
thread_millisleep(MXS_MON_BASE_INTERVAL_MS);
ms += MXS_MON_BASE_INTERVAL_MS;
}
}
atomic_store_int32(&m_status, MXS_MONITOR_STOPPED);
}
//static
void MonitorInstance::main(void* pArg)
{
@ -2591,9 +2633,7 @@ void MonitorInstance::main(void* pArg)
if (mysql_thread_init() == 0)
{
atomic_store_int32(&pThis->m_status, MXS_MONITOR_RUNNING);
static_cast<MonitorInstance*>(pArg)->main();
atomic_store_int32(&pThis->m_status, MXS_MONITOR_STOPPED);
pThis->main();
mysql_thread_end();
}

View File

@ -114,48 +114,6 @@ void update_server_status(MXS_MONITOR *monitor, MXS_MONITORED_SERVER *database)
}
}
/**
* @brief Main monitoring loop
*
* @param arg The MONITOR object for this monitor
*/
void AuroraMonitor::main()
{
load_server_journal(m_monitor, NULL);
while (!m_shutdown)
{
lock_monitor_servers(m_monitor);
servers_status_pending_to_current(m_monitor);
tick();
/**
* After updating the status of all servers, check if monitor events
* need to be launched.
*/
mon_process_state_changes(m_monitor, m_script.empty() ? NULL : m_script.c_str(), m_events);
mon_hangup_failed_servers(m_monitor);
servers_status_current_to_pending(m_monitor);
store_server_journal(m_monitor, NULL);
release_monitor_servers(m_monitor);
/** Sleep until the next monitoring interval */
unsigned int ms = 0;
while (ms < m_monitor->interval && !m_shutdown)
{
if (m_monitor->server_pending_changes)
{
// Admin has changed something, skip sleep
break;
}
thread_millisleep(MXS_MON_BASE_INTERVAL_MS);
ms += MXS_MON_BASE_INTERVAL_MS;
}
}
}
void AuroraMonitor::tick()
{
for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next)

View File

@ -38,6 +38,4 @@ private:
bool has_sufficient_permissions() const;
void configure(const MXS_CONFIG_PARAMETER* params);
void tick();
void main();
};

View File

@ -204,9 +204,9 @@ json_t* GaleraMonitor::diagnostics_json() const
json_object_set_new(rval, "use_priority", json_boolean(m_use_priority));
json_object_set_new(rval, "set_donor_nodes", json_boolean(m_set_donor_nodes));
if (!m_script.empty())
if (!script().empty())
{
json_object_set_new(rval, "script", json_string(m_script.c_str()));
json_object_set_new(rval, "script", json_string(script().c_str()));
}
if (m_cluster_info.c_uuid)
@ -444,50 +444,6 @@ void GaleraMonitor::monitorDatabase(MXS_MONITORED_SERVER *database)
}
}
/**
* The entry point for the monitoring module thread
*
* @param arg The handle of the monitor
*/
void GaleraMonitor::main()
{
load_server_journal(m_monitor, NULL);
while (!m_shutdown)
{
lock_monitor_servers(m_monitor);
servers_status_pending_to_current(m_monitor);
tick();
/**
* After updating the status of all servers, check if monitor events
* need to be launched.
*/
mon_process_state_changes(m_monitor, m_script.empty() ? NULL : m_script.c_str(), m_events);
mon_hangup_failed_servers(m_monitor);
servers_status_current_to_pending(m_monitor);
store_server_journal(m_monitor, NULL);
release_monitor_servers(m_monitor);
/** Sleep until the next monitoring interval */
unsigned int ms = 0;
while (ms < m_monitor->interval && !m_shutdown)
{
if (m_monitor->server_pending_changes)
{
// Admin has changed something, skip sleep
break;
}
thread_millisleep(MXS_MON_BASE_INTERVAL_MS);
ms += MXS_MON_BASE_INTERVAL_MS;
}
}
}
void GaleraMonitor::tick()
{
int is_cluster = 0;

View File

@ -93,6 +93,4 @@ private:
bool has_sufficient_permissions() const;
void configure(const MXS_CONFIG_PARAMETER* param);
void tick();
void main();
};

View File

@ -181,45 +181,6 @@ static void update_server_status(MXS_MONITOR* monitor, MXS_MONITORED_SERVER* ser
}
}
void GRMon::main()
{
load_server_journal(m_monitor, NULL);
while (!m_shutdown)
{
lock_monitor_servers(m_monitor);
servers_status_pending_to_current(m_monitor);
tick();
/**
* After updating the status of all servers, check if monitor events
* need to be launched.
*/
mon_process_state_changes(m_monitor,
m_script.empty() ? NULL : m_script.c_str(),
m_events);
mon_hangup_failed_servers(m_monitor);
servers_status_current_to_pending(m_monitor);
store_server_journal(m_monitor, NULL);
release_monitor_servers(m_monitor);
/** Sleep until the next monitoring interval */
size_t ms = 0;
while (ms < m_monitor->interval && !m_shutdown)
{
if (m_monitor->server_pending_changes)
{
// Admin has changed something, skip sleep
break;
}
thread_millisleep(MXS_MON_BASE_INTERVAL_MS);
ms += MXS_MON_BASE_INTERVAL_MS;
}
}
}
void GRMon::tick()
{
for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next)

View File

@ -38,6 +38,4 @@ private:
bool has_sufficient_permissions() const;
void configure(const MXS_CONFIG_PARAMETER* params);
void tick();
void main();
};

View File

@ -433,48 +433,6 @@ monitorDatabase(MXS_MONITOR* mon, MXS_MONITORED_SERVER *database)
}
}
/**
* The entry point for the monitoring module thread
*
* @param arg The handle of the monitor
*/
void MMMonitor::main()
{
load_server_journal(m_monitor, &m_master);
while (!m_shutdown)
{
lock_monitor_servers(m_monitor);
servers_status_pending_to_current(m_monitor);
tick();
/**
* After updating the status of all servers, check if monitor events
* need to be launched.
*/
mon_process_state_changes(m_monitor, m_script.empty() ? NULL : m_script.c_str(), m_events);
mon_hangup_failed_servers(m_monitor);
servers_status_current_to_pending(m_monitor);
store_server_journal(m_monitor, m_master);
release_monitor_servers(m_monitor);
/** Sleep until the next monitoring interval */
unsigned int ms = 0;
while (ms < m_monitor->interval && !m_shutdown)
{
if (m_monitor->server_pending_changes)
{
// Admin has changed something, skip sleep
break;
}
thread_millisleep(MXS_MON_BASE_INTERVAL_MS);
ms += MXS_MON_BASE_INTERVAL_MS;
}
}
}
void MMMonitor::tick()
{
/* start from the first server in the list */

View File

@ -43,6 +43,4 @@ private:
bool has_sufficient_permissions() const;
void configure(const MXS_CONFIG_PARAMETER* params);
void tick();
void main();
};

View File

@ -238,48 +238,6 @@ monitorDatabase(MXS_MONITORED_SERVER *database, char *defaultUser, char *default
}
}
/**
* The entry point for the monitoring module thread
*
* @param arg The handle of the monitor
*/
void NDBCMonitor::main()
{
load_server_journal(m_monitor, NULL);
while (!m_shutdown)
{
lock_monitor_servers(m_monitor);
servers_status_pending_to_current(m_monitor);
tick();
/**
* After updating the status of all servers, check if monitor events
* need to be launched.
*/
mon_process_state_changes(m_monitor, m_script.empty() ? NULL : m_script.c_str(), m_events);
mon_hangup_failed_servers(m_monitor);
servers_status_current_to_pending(m_monitor);
store_server_journal(m_monitor, NULL);
release_monitor_servers(m_monitor);
/** Sleep until the next monitoring interval */
unsigned int ms = 0;
while (ms < m_monitor->interval && !m_shutdown)
{
if (m_monitor->server_pending_changes)
{
// Admin has changed something, skip sleep
break;
}
thread_millisleep(MXS_MON_BASE_INTERVAL_MS);
ms += MXS_MON_BASE_INTERVAL_MS;
}
}
}
void NDBCMonitor::tick()
{
MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers;

View File

@ -40,6 +40,4 @@ private:
bool has_sufficient_permissions() const;
void configure(const MXS_CONFIG_PARAMETER* params);
void tick();
void main();
};