MXS-2271 Monitor config name and instance name are parameters of createInstance()

Also adds/moves some comments from previous entrypoints. Name and module
are now constant fields.
This commit is contained in:
Esa Korhonen
2019-01-21 15:51:53 +02:00
parent de970e579e
commit f6cec41dd8
19 changed files with 75 additions and 63 deletions

View File

@ -51,9 +51,11 @@ struct MXS_MONITOR_API
* If the function fails, MaxScale will not start. The returned object must inherit from * If the function fails, MaxScale will not start. The returned object must inherit from
* the abstract base monitor class and implement the missing methods. * the abstract base monitor class and implement the missing methods.
* *
* @param name Configuration name of the monitor
* @param module Module name of the monitor
* @return Monitor object * @return Monitor object
*/ */
Monitor* (* createInstance)(); Monitor* (* createInstance)(const std::string& name, const std::string& module);
}; };
/** /**
@ -164,7 +166,7 @@ inline mxb::intrusive_slist_iterator<MXS_MONITORED_SERVER> end(MXS_MONITORED_SER
class Monitor class Monitor
{ {
public: public:
Monitor(); Monitor(const std::string& name, const std::string& module);
virtual ~Monitor(); virtual ~Monitor();
virtual bool configure(const MXS_CONFIG_PARAMETER* params) = 0; virtual bool configure(const MXS_CONFIG_PARAMETER* params) = 0;
@ -198,8 +200,8 @@ public:
*/ */
virtual json_t* diagnostics_json() const = 0; virtual json_t* diagnostics_json() const = 0;
char* name; /**< Monitor instance name */ const char* const name; /**< Monitor instance name. TODO: change to string */
std::string module_name; /**< Name of the monitor module */ const std::string module_name; /**< Name of the monitor module */
Monitor* next; /**< Next monitor in the linked list */ Monitor* next; /**< Next monitor in the linked list */
mutable std::mutex lock; mutable std::mutex lock;
@ -429,6 +431,9 @@ void monitor_debug_wait();
namespace maxscale namespace maxscale
{ {
/**
* An abstract class which helps implement a monitor based on a maxbase::Worker thread.
*/
class MonitorWorker : public Monitor class MonitorWorker : public Monitor
, protected maxbase::Worker , protected maxbase::Worker
{ {
@ -525,7 +530,7 @@ public:
static int64_t get_time_ms(); static int64_t get_time_ms();
protected: protected:
MonitorWorker(); MonitorWorker(const std::string& name, const std::string& module);
/** /**
* @brief Should the monitor shut down? * @brief Should the monitor shut down?
@ -649,7 +654,8 @@ public:
MonitorWorkerSimple& operator=(const MonitorWorkerSimple&) = delete; MonitorWorkerSimple& operator=(const MonitorWorkerSimple&) = delete;
protected: protected:
MonitorWorkerSimple() MonitorWorkerSimple(const std::string& name, const std::string& module)
: MonitorWorker(name, module)
{ {
} }
@ -707,10 +713,10 @@ public:
MonitorApi(const MonitorApi&) = delete; MonitorApi(const MonitorApi&) = delete;
MonitorApi& operator=(const MonitorApi&) = delete; MonitorApi& operator=(const MonitorApi&) = delete;
static Monitor* createInstance() static Monitor* createInstance(const std::string& name, const std::string& module)
{ {
MonitorInstance* pInstance = NULL; MonitorInstance* pInstance = NULL;
MXS_EXCEPTION_GUARD(pInstance = MonitorInstance::create()); MXS_EXCEPTION_GUARD(pInstance = MonitorInstance::create(name, module));
return pInstance; return pInstance;
} }

View File

@ -106,7 +106,7 @@ Monitor* MonitorManager::create_monitor(const string& name, const string& module
return NULL; return NULL;
} }
Monitor* mon = api->createInstance(); Monitor* mon = api->createInstance(name, module);
if (!mon) if (!mon)
{ {
MXS_ERROR("Unable to create monitor instance for '%s', using module '%s'.", MXS_ERROR("Unable to create monitor instance for '%s', using module '%s'.",
@ -114,10 +114,6 @@ Monitor* MonitorManager::create_monitor(const string& name, const string& module
return NULL; return NULL;
} }
// These initializations are kept outside the constructor to keep it simple.
mon->name = MXS_STRDUP_A(name.c_str());
mon->module_name = module;
if (mon->configure_base(params)) // TODO: Move derived class configure() here if (mon->configure_base(params)) // TODO: Move derived class configure() here
{ {
std::lock_guard<std::mutex> guard(monLock); std::lock_guard<std::mutex> guard(monLock);
@ -132,7 +128,9 @@ Monitor* MonitorManager::create_monitor(const string& name, const string& module
return mon; return mon;
} }
Monitor::Monitor() Monitor::Monitor(const string& name, const string& module)
: name(MXS_STRDUP_A(name.c_str()))
, module_name(module)
{ {
memset(journal_hash, 0, sizeof(journal_hash)); memset(journal_hash, 0, sizeof(journal_hash));
} }
@ -210,7 +208,7 @@ Monitor::~Monitor()
delete disk_space_threshold; delete disk_space_threshold;
config_parameter_free(parameters); config_parameter_free(parameters);
monitor_server_free_all(monitored_servers); monitor_server_free_all(monitored_servers);
MXS_FREE(name); MXS_FREE((const_cast<char*>(name)));
} }
void MonitorManager::destroy_all_monitors() void MonitorManager::destroy_all_monitors()
@ -2429,8 +2427,9 @@ void monitor_debug_wait()
namespace maxscale namespace maxscale
{ {
MonitorWorker::MonitorWorker() MonitorWorker::MonitorWorker(const string& name, const string& module)
: m_monitor(this) : 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)

View File

@ -25,7 +25,8 @@
#include <maxscale/mysql_utils.hh> #include <maxscale/mysql_utils.hh>
AuroraMonitor::AuroraMonitor() AuroraMonitor::AuroraMonitor(const std::string& name, const std::string& module)
: MonitorWorkerSimple(name, module)
{ {
} }
@ -34,9 +35,9 @@ AuroraMonitor::~AuroraMonitor()
} }
// static // static
AuroraMonitor* AuroraMonitor::create() AuroraMonitor* AuroraMonitor::create(const std::string& name, const std::string& module)
{ {
return new AuroraMonitor(); return new AuroraMonitor(name, module);
} }
bool AuroraMonitor::has_sufficient_permissions() const bool AuroraMonitor::has_sufficient_permissions() const

View File

@ -26,12 +26,12 @@ public:
AuroraMonitor& operator=(const AuroraMonitor&) = delete; AuroraMonitor& operator=(const AuroraMonitor&) = delete;
~AuroraMonitor(); ~AuroraMonitor();
static AuroraMonitor* create(); static AuroraMonitor* create(const std::string& name, const std::string& module);
protected: protected:
bool has_sufficient_permissions() const; bool has_sufficient_permissions() const;
void update_server_status(MXS_MONITORED_SERVER* monitored_server); void update_server_status(MXS_MONITORED_SERVER* monitored_server);
private: private:
AuroraMonitor(); AuroraMonitor(const std::string& name, const std::string& module);
}; };

View File

@ -27,7 +27,8 @@ const int DEFAULT_HEALTH_PORT = 3581;
} }
ClustrixMonitor::ClustrixMonitor() ClustrixMonitor::ClustrixMonitor(const string& name, const string& module)
: MonitorWorker(name, module)
{ {
} }
@ -36,9 +37,9 @@ ClustrixMonitor::~ClustrixMonitor()
} }
//static //static
ClustrixMonitor* ClustrixMonitor::create() ClustrixMonitor* ClustrixMonitor::create(const string& name, const string& module)
{ {
return new ClustrixMonitor(); return new ClustrixMonitor(name, module);
} }
bool ClustrixMonitor::configure(const MXS_CONFIG_PARAMETER* pParams) bool ClustrixMonitor::configure(const MXS_CONFIG_PARAMETER* pParams)

View File

@ -60,12 +60,12 @@ public:
~ClustrixMonitor(); ~ClustrixMonitor();
static ClustrixMonitor* create(); static ClustrixMonitor* create(const std::string& name, const std::string& module);
bool configure(const MXS_CONFIG_PARAMETER* pParams) override; bool configure(const MXS_CONFIG_PARAMETER* pParams) override;
private: private:
ClustrixMonitor(); ClustrixMonitor(const std::string& name, const std::string& module);
void pre_loop() override; void pre_loop() override;
void post_loop() override; void post_loop() override;

View File

@ -71,7 +71,8 @@ int get_cs_version(MXS_MONITORED_SERVER* srv)
} }
} }
CsMonitor::CsMonitor() CsMonitor::CsMonitor(const std::string& name, const std::string& module)
: MonitorWorkerSimple(name, module)
{ {
} }
@ -80,9 +81,9 @@ CsMonitor::~CsMonitor()
} }
// static // static
CsMonitor* CsMonitor::create() CsMonitor* CsMonitor::create(const std::string& name, const std::string& module)
{ {
return new CsMonitor(); return new CsMonitor(name, module);
} }
bool CsMonitor::has_sufficient_permissions() const bool CsMonitor::has_sufficient_permissions() const

View File

@ -22,14 +22,14 @@ public:
CsMonitor& operator=(const CsMonitor&) = delete; CsMonitor& operator=(const CsMonitor&) = delete;
~CsMonitor(); ~CsMonitor();
static CsMonitor* create(); static CsMonitor* create(const std::string& name, const std::string& module);
protected: protected:
bool has_sufficient_permissions() const; bool has_sufficient_permissions() const;
void update_server_status(MXS_MONITORED_SERVER* monitored_server); void update_server_status(MXS_MONITORED_SERVER* monitored_server);
private: private:
CsMonitor(); CsMonitor(const std::string& name, const std::string& module);
bool configure(const MXS_CONFIG_PARAMETER* pParams) override; bool configure(const MXS_CONFIG_PARAMETER* pParams) override;
SERVER* m_primary; SERVER* m_primary;

View File

@ -42,8 +42,9 @@ static int compare_node_index(const void*, const void*);
static int compare_node_priority(const void*, const void*); static int compare_node_priority(const void*, const void*);
static bool using_xtrabackup(MXS_MONITORED_SERVER* database, const char* server_string); static bool using_xtrabackup(MXS_MONITORED_SERVER* database, const char* server_string);
GaleraMonitor::GaleraMonitor() GaleraMonitor::GaleraMonitor(const std::string& name, const std::string& module)
: m_disableMasterFailback(0) : MonitorWorkerSimple(name, module)
, m_disableMasterFailback(0)
, m_availableWhenDonor(0) , m_availableWhenDonor(0)
, m_disableMasterRoleSetting(0) , m_disableMasterRoleSetting(0)
, m_root_node_as_master(false) , m_root_node_as_master(false)
@ -59,9 +60,9 @@ GaleraMonitor::~GaleraMonitor()
} }
// static // static
GaleraMonitor* GaleraMonitor::create() GaleraMonitor* GaleraMonitor::create(const std::string& name, const std::string& module)
{ {
return new GaleraMonitor(); return new GaleraMonitor(name, module);
} }
void GaleraMonitor::diagnostics(DCB* dcb) const void GaleraMonitor::diagnostics(DCB* dcb) const

View File

@ -17,9 +17,7 @@
*/ */
#include <maxscale/ccdefs.hh> #include <maxscale/ccdefs.hh>
#include <unordered_map> #include <unordered_map>
#include <maxscale/monitor.hh> #include <maxscale/monitor.hh>
/** /**
@ -43,7 +41,7 @@ public:
GaleraMonitor& operator=(const GaleraMonitor&) = delete; GaleraMonitor& operator=(const GaleraMonitor&) = delete;
~GaleraMonitor(); ~GaleraMonitor();
static GaleraMonitor* create(); static GaleraMonitor* create(const std::string& name, const std::string& module);
void diagnostics(DCB* dcb) const; void diagnostics(DCB* dcb) const;
json_t* diagnostics_json() const; json_t* diagnostics_json() const;
@ -68,7 +66,7 @@ private:
NodeMap m_info; /**< Contains Galera Cluster variables of all nodes */ NodeMap m_info; /**< Contains Galera Cluster variables of all nodes */
int m_cluster_size; /**< How many nodes in the cluster */ int m_cluster_size; /**< How many nodes in the cluster */
GaleraMonitor(); GaleraMonitor(const std::string& name, const std::string& module);
bool detect_cluster_size(const int n_nodes, bool detect_cluster_size(const int n_nodes,
const char* candidate_uuid, const char* candidate_uuid,

View File

@ -26,7 +26,8 @@
#include <mysqld_error.h> #include <mysqld_error.h>
GRMon::GRMon() GRMon::GRMon(const std::string& name, const std::string& module)
: MonitorWorkerSimple(name, module)
{ {
} }
@ -34,9 +35,9 @@ GRMon::~GRMon()
{ {
} }
GRMon* GRMon::create() GRMon* GRMon::create(const std::string& name, const std::string& module)
{ {
return new GRMon(); return new GRMon(name, module);
} }
bool GRMon::has_sufficient_permissions() const bool GRMon::has_sufficient_permissions() const

View File

@ -26,12 +26,12 @@ public:
GRMon& operator&(const GRMon&) = delete; GRMon& operator&(const GRMon&) = delete;
~GRMon(); ~GRMon();
static GRMon* create(); static GRMon* create(const std::string& name, const std::string& module);
protected: protected:
bool has_sufficient_permissions() const; bool has_sufficient_permissions() const;
void update_server_status(MXS_MONITORED_SERVER* monitored_server); void update_server_status(MXS_MONITORED_SERVER* monitored_server);
private: private:
GRMon(); GRMon(const std::string& name, const std::string& module);
}; };

View File

@ -59,7 +59,8 @@ static const char CN_REPLICATION_PASSWORD[] = "replication_password";
static const char DIAG_ERROR[] = "Internal error, could not print diagnostics. " static const char DIAG_ERROR[] = "Internal error, could not print diagnostics. "
"Check log for more information."; "Check log for more information.";
MariaDBMonitor::MariaDBMonitor() MariaDBMonitor::MariaDBMonitor(const string& name, const string& module)
: MonitorWorker(name, module)
{ {
} }
@ -172,9 +173,9 @@ bool MariaDBMonitor::set_replication_credentials(const MXS_CONFIG_PARAMETER* par
return rval; return rval;
} }
MariaDBMonitor* MariaDBMonitor::create() MariaDBMonitor* MariaDBMonitor::create(const string& name, const string& module)
{ {
return new MariaDBMonitor(); return new MariaDBMonitor(name, module);
} }
/** /**

View File

@ -48,10 +48,11 @@ public:
/** /**
* Create the monitor instance and return the instance data. * Create the monitor instance and return the instance data.
* *
* @param monitor Generic monitor data * @param name Monitor config name
* @param module Module name
* @return MariaDBMonitor instance * @return MariaDBMonitor instance
*/ */
static MariaDBMonitor* create(); static MariaDBMonitor* create(const std::string& name, const std::string& module);
~MariaDBMonitor(); ~MariaDBMonitor();
@ -236,7 +237,7 @@ private:
* gtid:s? */ * gtid:s? */
// Base methods // Base methods
MariaDBMonitor(); MariaDBMonitor(const std::string& name, const std::string& module);
bool configure(const MXS_CONFIG_PARAMETER* params); bool configure(const MXS_CONFIG_PARAMETER* params);
bool set_replication_credentials(const MXS_CONFIG_PARAMETER* params); bool set_replication_credentials(const MXS_CONFIG_PARAMETER* params);
void reset_server_info(); void reset_server_info();

View File

@ -90,7 +90,7 @@ int main()
} }
MariaDBMonitor::Test::Test(bool use_hostnames) MariaDBMonitor::Test::Test(bool use_hostnames)
: m_monitor(new MariaDBMonitor()) : m_monitor(new MariaDBMonitor("TestMonitor", MXS_MODULE_NAME))
, m_use_hostnames(use_hostnames) , m_use_hostnames(use_hostnames)
{ {
} }

View File

@ -34,8 +34,9 @@
static void detectStaleMaster(void*, int); static void detectStaleMaster(void*, int);
static bool isMySQLEvent(mxs_monitor_event_t event); static bool isMySQLEvent(mxs_monitor_event_t event);
MMMonitor::MMMonitor() MMMonitor::MMMonitor(const std::string& name, const std::string& module)
: m_detectStaleMaster(false) : MonitorWorkerSimple(name, module)
, m_detectStaleMaster(false)
{ {
} }
@ -44,9 +45,9 @@ MMMonitor::~MMMonitor()
} }
// static // static
MMMonitor* MMMonitor::create() MMMonitor* MMMonitor::create(const std::string& name, const std::string& module)
{ {
return new MMMonitor(); return new MMMonitor(name, module);
} }
void MMMonitor::diagnostics(DCB* dcb) const void MMMonitor::diagnostics(DCB* dcb) const

View File

@ -26,7 +26,7 @@ public:
MMMonitor& operator=(const MMMonitor&) = delete; MMMonitor& operator=(const MMMonitor&) = delete;
~MMMonitor(); ~MMMonitor();
static MMMonitor* create(); static MMMonitor* create(const std::string& name, const std::string& module);
void diagnostics(DCB* dcb) const; void diagnostics(DCB* dcb) const;
json_t* diagnostics_json() const; json_t* diagnostics_json() const;
@ -39,7 +39,7 @@ protected:
private: private:
int m_detectStaleMaster; /**< Monitor flag for Stale Master detection */ int m_detectStaleMaster; /**< Monitor flag for Stale Master detection */
MMMonitor(); MMMonitor(const std::string& name, const std::string& module);
MXS_MONITORED_SERVER* get_current_master(); MXS_MONITORED_SERVER* get_current_master();
}; };

View File

@ -22,7 +22,8 @@
#include <maxscale/mysql_utils.hh> #include <maxscale/mysql_utils.hh>
NDBCMonitor::NDBCMonitor() NDBCMonitor::NDBCMonitor(const std::string& name, const std::string& module)
: MonitorWorkerSimple(name, module)
{ {
} }
@ -31,9 +32,9 @@ NDBCMonitor::~NDBCMonitor()
} }
// static // static
NDBCMonitor* NDBCMonitor::create() NDBCMonitor* NDBCMonitor::create(const std::string& name, const std::string& module)
{ {
return new NDBCMonitor(); return new NDBCMonitor(name, module);
} }
bool NDBCMonitor::has_sufficient_permissions() const bool NDBCMonitor::has_sufficient_permissions() const

View File

@ -26,12 +26,12 @@ public:
NDBCMonitor& operator=(const NDBCMonitor&) = delete; NDBCMonitor& operator=(const NDBCMonitor&) = delete;
~NDBCMonitor(); ~NDBCMonitor();
static NDBCMonitor* create(); static NDBCMonitor* create(const std::string& name, const std::string& module);
protected: protected:
bool has_sufficient_permissions() const; bool has_sufficient_permissions() const;
void update_server_status(MXS_MONITORED_SERVER* monitored_server); void update_server_status(MXS_MONITORED_SERVER* monitored_server);
private: private:
NDBCMonitor(); NDBCMonitor(const std::string& name, const std::string& module);
}; };