MXS-1775 Move monitor loop to MonitorInstance
This commit is contained in:
@ -33,23 +33,27 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
MonitorInstance(MXS_MONITOR* pMonitor);
|
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 bool has_sufficient_permissions() const;
|
||||||
virtual void configure(const MXS_CONFIG_PARAMETER* pParams);
|
virtual void configure(const MXS_CONFIG_PARAMETER* pParams);
|
||||||
|
virtual void tick() = 0;
|
||||||
virtual void main() = 0;
|
|
||||||
|
|
||||||
static void main(void* pArg);
|
|
||||||
|
|
||||||
MXS_MONITOR* m_monitor; /**< The generic monitor structure. */
|
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 */
|
MXS_MONITORED_SERVER* m_master; /**< Master server */
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int32_t m_status; /**< The current status of the monitor. */
|
int32_t m_status; /**< The current status of the monitor. */
|
||||||
THREAD m_thread; /**< The thread handle of the monitoring thread. */
|
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);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2508,11 +2508,12 @@ namespace maxscale
|
|||||||
|
|
||||||
MonitorInstance::MonitorInstance(MXS_MONITOR* pMonitor)
|
MonitorInstance::MonitorInstance(MXS_MONITOR* pMonitor)
|
||||||
: m_monitor(pMonitor)
|
: m_monitor(pMonitor)
|
||||||
, m_shutdown(0)
|
|
||||||
, m_events(0)
|
|
||||||
, m_master(NULL)
|
, m_master(NULL)
|
||||||
, m_status(MXS_MONITOR_STOPPED)
|
, m_status(MXS_MONITOR_STOPPED)
|
||||||
, m_thread(0)
|
, 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
|
//static
|
||||||
void MonitorInstance::main(void* pArg)
|
void MonitorInstance::main(void* pArg)
|
||||||
{
|
{
|
||||||
@ -2591,9 +2633,7 @@ void MonitorInstance::main(void* pArg)
|
|||||||
|
|
||||||
if (mysql_thread_init() == 0)
|
if (mysql_thread_init() == 0)
|
||||||
{
|
{
|
||||||
atomic_store_int32(&pThis->m_status, MXS_MONITOR_RUNNING);
|
pThis->main();
|
||||||
static_cast<MonitorInstance*>(pArg)->main();
|
|
||||||
atomic_store_int32(&pThis->m_status, MXS_MONITOR_STOPPED);
|
|
||||||
|
|
||||||
mysql_thread_end();
|
mysql_thread_end();
|
||||||
}
|
}
|
||||||
|
@ -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()
|
void AuroraMonitor::tick()
|
||||||
{
|
{
|
||||||
for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next)
|
for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next)
|
||||||
|
@ -38,6 +38,4 @@ private:
|
|||||||
bool has_sufficient_permissions() const;
|
bool has_sufficient_permissions() const;
|
||||||
void configure(const MXS_CONFIG_PARAMETER* params);
|
void configure(const MXS_CONFIG_PARAMETER* params);
|
||||||
void tick();
|
void tick();
|
||||||
|
|
||||||
void main();
|
|
||||||
};
|
};
|
||||||
|
@ -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, "use_priority", json_boolean(m_use_priority));
|
||||||
json_object_set_new(rval, "set_donor_nodes", json_boolean(m_set_donor_nodes));
|
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)
|
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()
|
void GaleraMonitor::tick()
|
||||||
{
|
{
|
||||||
int is_cluster = 0;
|
int is_cluster = 0;
|
||||||
|
@ -93,6 +93,4 @@ private:
|
|||||||
bool has_sufficient_permissions() const;
|
bool has_sufficient_permissions() const;
|
||||||
void configure(const MXS_CONFIG_PARAMETER* param);
|
void configure(const MXS_CONFIG_PARAMETER* param);
|
||||||
void tick();
|
void tick();
|
||||||
|
|
||||||
void main();
|
|
||||||
};
|
};
|
||||||
|
@ -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()
|
void GRMon::tick()
|
||||||
{
|
{
|
||||||
for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next)
|
for (MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers; ptr; ptr = ptr->next)
|
||||||
|
@ -38,6 +38,4 @@ private:
|
|||||||
bool has_sufficient_permissions() const;
|
bool has_sufficient_permissions() const;
|
||||||
void configure(const MXS_CONFIG_PARAMETER* params);
|
void configure(const MXS_CONFIG_PARAMETER* params);
|
||||||
void tick();
|
void tick();
|
||||||
|
|
||||||
void main();
|
|
||||||
};
|
};
|
||||||
|
@ -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()
|
void MMMonitor::tick()
|
||||||
{
|
{
|
||||||
/* start from the first server in the list */
|
/* start from the first server in the list */
|
||||||
|
@ -43,6 +43,4 @@ private:
|
|||||||
bool has_sufficient_permissions() const;
|
bool has_sufficient_permissions() const;
|
||||||
void configure(const MXS_CONFIG_PARAMETER* params);
|
void configure(const MXS_CONFIG_PARAMETER* params);
|
||||||
void tick();
|
void tick();
|
||||||
|
|
||||||
void main();
|
|
||||||
};
|
};
|
||||||
|
@ -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()
|
void NDBCMonitor::tick()
|
||||||
{
|
{
|
||||||
MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers;
|
MXS_MONITORED_SERVER *ptr = m_monitor->monitored_servers;
|
||||||
|
@ -40,6 +40,4 @@ private:
|
|||||||
bool has_sufficient_permissions() const;
|
bool has_sufficient_permissions() const;
|
||||||
void configure(const MXS_CONFIG_PARAMETER* params);
|
void configure(const MXS_CONFIG_PARAMETER* params);
|
||||||
void tick();
|
void tick();
|
||||||
|
|
||||||
void main();
|
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user