MXS-2271 Convert MXS_MONITOR and MXS_MONITORED_SERVER to classes

First step in monitor refactoring and cleanup.
This commit is contained in:
Esa Korhonen 2019-01-17 10:22:28 +02:00
parent 3b55893a20
commit 3125d1babf
3 changed files with 72 additions and 78 deletions

View File

@ -29,7 +29,7 @@
#include <maxscale/server.hh>
#include <maxscale/protocol/mysql.hh>
struct MXS_MONITOR;
class MXS_MONITOR;
/**
* An opaque type representing a monitor instance.
@ -78,7 +78,7 @@ struct MXS_MONITOR_API
* @return Pointer to the monitor specific data. Will be stored
* in @c monitor->handle.
*/
MXS_MONITOR_INSTANCE*(*createInstance)(MXS_MONITOR * monitor);
MXS_MONITOR_INSTANCE* (* createInstance)(MXS_MONITOR* monitor);
/**
* @brief Destroy the monitor.
@ -133,7 +133,7 @@ struct MXS_MONITOR_API
*
* @see jansson.h
*/
json_t* (*diagnostics_json)(const MXS_MONITOR_INSTANCE * monitor);
json_t* (* diagnostics_json)(const MXS_MONITOR_INSTANCE* monitor);
};
/**
@ -204,16 +204,20 @@ enum mxs_monitor_event_t
/**
* The linked list of servers that are being monitored by the monitor module.
*/
struct MXS_MONITORED_SERVER
class MXS_MONITORED_SERVER
{
SERVER* server;/**< The server being monitored */
MYSQL* con; /**< The MySQL connection */
bool log_version_err;
int mon_err_count;
uint64_t mon_prev_status; /**< Status before starting the current monitor loop */
uint64_t pending_status; /**< Status during current monitor loop */
int64_t disk_space_checked;/**< When was the disk space checked the last time */
struct MXS_MONITORED_SERVER* next; /**< The next server in the list */
public:
MXS_MONITORED_SERVER(SERVER* server);
SERVER* server = nullptr; /**< The server being monitored */
MYSQL* con = nullptr; /**< The MySQL connection */
bool log_version_err = true;
int mon_err_count = 0;
uint64_t mon_prev_status = -1; /**< Status before starting the current monitor loop */
uint64_t pending_status = 0; /**< Status during current monitor loop */
int64_t disk_space_checked = 0; /**< When was the disk space checked the last time */
MXS_MONITORED_SERVER* next = nullptr; /**< The next server in the list */
};
namespace std
@ -237,48 +241,48 @@ inline mxb::intrusive_slist_iterator<MXS_MONITORED_SERVER> end(MXS_MONITORED_SER
/**
* Representation of the running monitor.
*/
struct MXS_MONITOR
class MXS_MONITOR
{
char* name; /**< The name of the monitor module */
char user[MAX_MONITOR_USER_LEN]; /*< Monitor username */
char password[MAX_MONITOR_PASSWORD_LEN]; /*< Monitor password */
pthread_mutex_t lock;
MXS_CONFIG_PARAMETER* parameters; /*< configuration parameters */
MXS_MONITORED_SERVER* monitored_servers; /*< List of servers the monitor monitors */
monitor_state_t state; /**< The state of the monitor. This should ONLY be
* written to by the admin
* thread. */
int connect_timeout; /**< Connect timeout in seconds for
* mysql_real_connect */
int connect_attempts; /**< How many times a connection is attempted */
int read_timeout; /**< Timeout in seconds to read from the server.
* There are retries and the total effective
* timeout
* value is three times the option value.
*/
int write_timeout; /**< Timeout in seconds for each attempt to write
* to the server.
* There are retries and the total effective
* timeout value is
* two times the option value.
*/
MXS_MONITOR_API* api; /**< The monitor api */
char* module_name; /**< Name of the monitor module */
MXS_MONITOR_INSTANCE* instance; /**< Instance returned from startMonitor */
size_t interval; /**< The monitor interval */
int check_maintenance_flag; /**< Set when admin requests a maintenance status
* change. */
bool active; /**< True if monitor is active */
time_t journal_max_age; /**< Maximum age of journal file */
uint32_t script_timeout; /**< Timeout in seconds for the monitor scripts */
const char* script; /**< Launchable script. */
uint64_t events; /**< Enabled monitor events. */
uint8_t journal_hash[SHA_DIGEST_LENGTH]; /**< SHA1 hash of the latest written journal */
MxsDiskSpaceThreshold* disk_space_threshold; /**< Disk space thresholds */
int64_t disk_space_check_interval; /**< How often should a disk space check be made
* at most. */
uint64_t ticks; /**< Number of performed monitoring intervals */
struct MXS_MONITOR* next; /**< Next monitor in the linked list */
public:
char* name; /**< Monitor instance name */
char* module_name; /**< Name of the monitor module */
MXS_MONITOR_API* api; /**< The monitor api */
MXS_MONITOR_INSTANCE* instance; /**< Instance returned from startMonitor */
MXS_MONITOR* next; /**< Next monitor in the linked list */
bool active; /**< True if monitor is active */
pthread_mutex_t lock;
monitor_state_t state; /**< The state of the monitor. This should ONLY be written to by the
* admin thread. */
int check_maintenance_flag; /**< Set when admin requests a maintenance status change. */
uint64_t ticks; /**< Number of performed monitoring intervals */
uint8_t journal_hash[SHA_DIGEST_LENGTH]; /**< SHA1 hash of the latest written journal */
MXS_CONFIG_PARAMETER* parameters; /**< Configuration parameters */
MXS_MONITORED_SERVER* monitored_servers;/**< List of servers the monitor monitors */
char user[MAX_MONITOR_USER_LEN]; /**< Monitor username */
char password[MAX_MONITOR_PASSWORD_LEN]; /**< Monitor password */
int connect_timeout; /**< Connect timeout in seconds for mysql_real_connect */
int connect_attempts; /**< How many times a connection is attempted */
int read_timeout; /**< Timeout in seconds to read from the server. There are retries
* and the total effective timeout value is three times the option value. */
int write_timeout; /**< Timeout in seconds for each attempt to write to the server.
* There are retries and the total effective timeout value is two times
* the option value. */
size_t interval; /**< The monitor interval */
time_t journal_max_age; /**< Maximum age of journal file */
uint32_t script_timeout; /**< Timeout in seconds for the monitor scripts */
const char* script; /**< Launchable script. */
uint64_t events; /**< Enabled monitor events. */
MxsDiskSpaceThreshold* disk_space_threshold; /**< Disk space thresholds */
int64_t disk_space_check_interval; /**< How often should a disk space check be made
* at most. */
};
/**

View File

@ -115,11 +115,11 @@ MXS_MONITOR* monitor_create(const char* name, const char* module, MXS_CONFIG_PAR
char* my_name = MXS_STRDUP(name);
char* my_module = MXS_STRDUP(module);
MXS_MONITOR* mon = (MXS_MONITOR*)MXS_MALLOC(sizeof(MXS_MONITOR));
MXS_MONITOR* mon = new (std::nothrow) MXS_MONITOR();
if (!mon || !my_module || !my_name)
{
MXS_FREE(mon);
delete mon;
MXS_FREE(my_name);
MXS_FREE(my_module);
return NULL;
@ -189,7 +189,7 @@ MXS_MONITOR* monitor_create(const char* name, const char* module, MXS_CONFIG_PAR
}
else
{
MXS_FREE(mon);
delete mon;
mon = NULL;
MXS_FREE(my_module);
MXS_FREE(my_name);
@ -234,7 +234,7 @@ void monitor_destroy(MXS_MONITOR* mon)
monitor_server_free_all(mon->monitored_servers);
MXS_FREE(mon->name);
MXS_FREE(mon->module_name);
MXS_FREE(mon);
delete mon;
}
void monitor_destroy_all()
@ -376,23 +376,9 @@ bool monitor_add_server(MXS_MONITOR* mon, SERVER* server)
else
{
rval = true;
MXS_MONITORED_SERVER* db = (MXS_MONITORED_SERVER*)MXS_MALLOC(sizeof(MXS_MONITORED_SERVER));
MXS_MONITORED_SERVER* db = new (std::nothrow) MXS_MONITORED_SERVER(server);
MXS_ABORT_IF_NULL(db);
db->server = server;
db->con = NULL;
db->next = NULL;
db->mon_err_count = 0;
db->log_version_err = true;
// Pretend disk space was just checked.
db->disk_space_checked = maxscale::MonitorInstance::get_time_ms();
/** Server status is uninitialized */
db->mon_prev_status = -1;
/* pending status is updated by get_replication_tree */
db->pending_status = 0;
monitor_state_t old_state = mon->state;
if (old_state == MONITOR_STATE_RUNNING)
@ -434,7 +420,7 @@ static void monitor_server_free(MXS_MONITORED_SERVER* tofree)
{
mysql_close(tofree->con);
}
MXS_FREE(tofree);
delete tofree;
}
}
@ -2960,3 +2946,9 @@ bool MonitorInstance::immediate_tick_required() const
return false;
}
}
MXS_MONITORED_SERVER::MXS_MONITORED_SERVER(SERVER* server)
: server(server)
, disk_space_checked(maxscale::MonitorInstance::get_time_ms()) // Pretend disk space was just checked.
{
}

View File

@ -156,11 +156,9 @@ void MariaDBMonitor::Test::init_servers(int count)
for (int i = 1; i < count + 1; i++)
{
auto base_server = Server::create_test_server(); // Contents mostly undefined
MXS_MONITORED_SERVER* mon_server = new MXS_MONITORED_SERVER; // Contents mostly undefined
mon_server->server = base_server;
// Server contents mostly undefined
auto base_server = Server::create_test_server();
MXS_MONITORED_SERVER* mon_server = new MXS_MONITORED_SERVER(base_server);
MariaDBServer* mariadb_server = new MariaDBServer(mon_server, i - 1, m_use_hostnames);
if (m_use_hostnames)