Fix to MXS-447: https://mariadb.atlassian.net/browse/MXS-447
Monitors are now started after they have been fully configured.
This commit is contained in:
@ -343,6 +343,12 @@ int rval, ini_rval;
|
|||||||
rval = process_config_context(config.next);
|
rval = process_config_context(config.next);
|
||||||
free_config_context(config.next);
|
free_config_context(config.next);
|
||||||
|
|
||||||
|
/** Start all monitors */
|
||||||
|
if(rval)
|
||||||
|
{
|
||||||
|
monitorStartAll();
|
||||||
|
}
|
||||||
|
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1156,7 +1162,7 @@ process_config_context(CONFIG_CONTEXT *context)
|
|||||||
gateway.id = getpid();
|
gateway.id = getpid();
|
||||||
}
|
}
|
||||||
|
|
||||||
monitorStart(obj->element,obj->parameters);
|
monitorAddParameters(obj->element, obj->parameters);
|
||||||
|
|
||||||
/* set monitor interval */
|
/* set monitor interval */
|
||||||
if (interval > 0)
|
if (interval > 0)
|
||||||
@ -1253,6 +1259,7 @@ process_config_context(CONFIG_CONTEXT *context)
|
|||||||
|
|
||||||
obj = obj->next;
|
obj = obj->next;
|
||||||
} /*< while */
|
} /*< while */
|
||||||
|
|
||||||
/** TODO: consistency check function */
|
/** TODO: consistency check function */
|
||||||
|
|
||||||
hashtable_free(monitorhash);
|
hashtable_free(monitorhash);
|
||||||
@ -1460,6 +1467,22 @@ return_p2:
|
|||||||
return p2;
|
return p2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free a configuration parameter
|
||||||
|
* @param p1 Parameter to free
|
||||||
|
*/
|
||||||
|
void free_config_parameter(CONFIG_PARAMETER* p1)
|
||||||
|
{
|
||||||
|
while (p1)
|
||||||
|
{
|
||||||
|
free(p1->name);
|
||||||
|
free(p1->value);
|
||||||
|
CONFIG_PARAMETER* p2 = p1->next;
|
||||||
|
free(p1);
|
||||||
|
p1 = p2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free a config tree
|
* Free a config tree
|
||||||
*
|
*
|
||||||
@ -1474,15 +1497,7 @@ CONFIG_PARAMETER *p1, *p2;
|
|||||||
while (context)
|
while (context)
|
||||||
{
|
{
|
||||||
free(context->object);
|
free(context->object);
|
||||||
p1 = context->parameters;
|
free_config_parameter(context->parameters);
|
||||||
while (p1)
|
|
||||||
{
|
|
||||||
free(p1->name);
|
|
||||||
free(p1->value);
|
|
||||||
p2 = p1->next;
|
|
||||||
free(p1);
|
|
||||||
p1 = p2;
|
|
||||||
}
|
|
||||||
obj = context->next;
|
obj = context->next;
|
||||||
free(context);
|
free(context);
|
||||||
context = obj;
|
context = obj;
|
||||||
|
|||||||
@ -118,6 +118,7 @@ MONITOR *ptr;
|
|||||||
ptr->next = mon->next;
|
ptr->next = mon->next;
|
||||||
}
|
}
|
||||||
spinlock_release(&monLock);
|
spinlock_release(&monLock);
|
||||||
|
free_config_parameter(mon->parameters);
|
||||||
free(mon->name);
|
free(mon->name);
|
||||||
free(mon);
|
free(mon);
|
||||||
}
|
}
|
||||||
@ -137,6 +138,23 @@ monitorStart(MONITOR *monitor, void* params)
|
|||||||
spinlock_release(&monitor->lock);
|
spinlock_release(&monitor->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start all monitors
|
||||||
|
*/
|
||||||
|
void monitorStartAll()
|
||||||
|
{
|
||||||
|
MONITOR *ptr;
|
||||||
|
|
||||||
|
spinlock_acquire(&monLock);
|
||||||
|
ptr = allMonitors;
|
||||||
|
while (ptr)
|
||||||
|
{
|
||||||
|
monitorStart(ptr, ptr->parameters);
|
||||||
|
ptr = ptr->next;
|
||||||
|
}
|
||||||
|
spinlock_release(&monLock);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stop a given monitor
|
* Stop a given monitor
|
||||||
*
|
*
|
||||||
@ -522,3 +540,22 @@ bool check_monitor_permissions(MONITOR* monitor)
|
|||||||
free(dpasswd);
|
free(dpasswd);
|
||||||
return rval;
|
return rval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add parameters to the monitor
|
||||||
|
* @param monitor Monitor
|
||||||
|
* @param params Config parameters
|
||||||
|
*/
|
||||||
|
void monitorAddParameters(MONITOR *monitor, CONFIG_PARAMETER *params)
|
||||||
|
{
|
||||||
|
while (params)
|
||||||
|
{
|
||||||
|
CONFIG_PARAMETER* clone = config_clone_param(params);
|
||||||
|
if (clone)
|
||||||
|
{
|
||||||
|
clone->next = monitor->parameters;
|
||||||
|
monitor->parameters = clone;
|
||||||
|
}
|
||||||
|
params = params->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@ -120,6 +120,7 @@ extern unsigned int config_pollsleep();
|
|||||||
CONFIG_PARAMETER* config_get_param(CONFIG_PARAMETER* params, const char* name);
|
CONFIG_PARAMETER* config_get_param(CONFIG_PARAMETER* params, const char* name);
|
||||||
config_param_type_t config_get_paramtype(CONFIG_PARAMETER* param);
|
config_param_type_t config_get_paramtype(CONFIG_PARAMETER* param);
|
||||||
CONFIG_PARAMETER* config_clone_param(CONFIG_PARAMETER* param);
|
CONFIG_PARAMETER* config_clone_param(CONFIG_PARAMETER* param);
|
||||||
|
void free_config_parameter(CONFIG_PARAMETER* p1);
|
||||||
extern int config_truth_value(char *);
|
extern int config_truth_value(char *);
|
||||||
extern double config_percentage_value(char *str);
|
extern double config_percentage_value(char *str);
|
||||||
bool config_set_qualified_param(
|
bool config_set_qualified_param(
|
||||||
|
|||||||
@ -21,6 +21,7 @@
|
|||||||
#include <server.h>
|
#include <server.h>
|
||||||
#include <dcb.h>
|
#include <dcb.h>
|
||||||
#include <resultset.h>
|
#include <resultset.h>
|
||||||
|
#include <maxconfig.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @file monitor.h The interface to the monitor module
|
* @file monitor.h The interface to the monitor module
|
||||||
@ -140,6 +141,7 @@ typedef struct monitor {
|
|||||||
char* user; /*< Monitor username */
|
char* user; /*< Monitor username */
|
||||||
char* password; /*< Monitor password */
|
char* password; /*< Monitor password */
|
||||||
SPINLOCK lock;
|
SPINLOCK lock;
|
||||||
|
CONFIG_PARAMETER* parameters; /*< configuration parameters */
|
||||||
MONITOR_SERVERS* databases; /*< List of databases the monitor monitors */
|
MONITOR_SERVERS* databases; /*< List of databases the monitor monitors */
|
||||||
monitor_state_t state; /**< The state of the monitor */
|
monitor_state_t state; /**< The state of the monitor */
|
||||||
int connect_timeout; /**< Connect timeout in seconds for mysql_real_connect */
|
int connect_timeout; /**< Connect timeout in seconds for mysql_real_connect */
|
||||||
@ -160,9 +162,11 @@ extern void monitor_free(MONITOR *);
|
|||||||
extern MONITOR *monitor_find(char *);
|
extern MONITOR *monitor_find(char *);
|
||||||
extern void monitorAddServer(MONITOR *, SERVER *);
|
extern void monitorAddServer(MONITOR *, SERVER *);
|
||||||
extern void monitorAddUser(MONITOR *, char *, char *);
|
extern void monitorAddUser(MONITOR *, char *, char *);
|
||||||
|
extern void monitorAddParameters(MONITOR *monitor, CONFIG_PARAMETER *params);
|
||||||
extern void monitorStop(MONITOR *);
|
extern void monitorStop(MONITOR *);
|
||||||
extern void monitorStart(MONITOR *, void*);
|
extern void monitorStart(MONITOR *, void*);
|
||||||
extern void monitorStopAll();
|
extern void monitorStopAll();
|
||||||
|
extern void monitorStartAll();
|
||||||
extern void monitorShowAll(DCB *);
|
extern void monitorShowAll(DCB *);
|
||||||
extern void monitorShow(DCB *, MONITOR *);
|
extern void monitorShow(DCB *, MONITOR *);
|
||||||
extern void monitorList(DCB *);
|
extern void monitorList(DCB *);
|
||||||
@ -170,4 +174,5 @@ extern void monitorSetInterval (MONITOR *, unsigned long);
|
|||||||
extern void monitorSetNetworkTimeout(MONITOR *, int, int);
|
extern void monitorSetNetworkTimeout(MONITOR *, int, int);
|
||||||
extern RESULTSET *monitorGetList();
|
extern RESULTSET *monitorGetList();
|
||||||
bool check_monitor_permissions(MONITOR* monitor);
|
bool check_monitor_permissions(MONITOR* monitor);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user