Cleaned up server configuration processing
Moved the creation of new servers into a separate function and cleaned up the configuration processing.
This commit is contained in:
@ -97,6 +97,7 @@ FEEDBACK_CONF *config_get_feedback_data();
|
|||||||
void config_add_param(CONFIG_CONTEXT*, char*, char*);
|
void config_add_param(CONFIG_CONTEXT*, char*, char*);
|
||||||
bool config_has_duplicate_sections(const char* config);
|
bool config_has_duplicate_sections(const char* config);
|
||||||
int create_new_router(CONFIG_CONTEXT *obj, const char *router);
|
int create_new_router(CONFIG_CONTEXT *obj, const char *router);
|
||||||
|
int create_new_server(CONFIG_CONTEXT *obj);
|
||||||
|
|
||||||
static char *config_file = NULL;
|
static char *config_file = NULL;
|
||||||
static GATEWAY_CONF gateway;
|
static GATEWAY_CONF gateway;
|
||||||
@ -104,6 +105,85 @@ static FEEDBACK_CONF feedback;
|
|||||||
char *version_string = NULL;
|
char *version_string = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
static char *service_params[] =
|
||||||
|
{
|
||||||
|
"type",
|
||||||
|
"router",
|
||||||
|
"router_options",
|
||||||
|
"servers",
|
||||||
|
"user",
|
||||||
|
"passwd",
|
||||||
|
"enable_root_user",
|
||||||
|
"connection_timeout",
|
||||||
|
"auth_all_servers",
|
||||||
|
"optimize_wildcard",
|
||||||
|
"strip_db_esc",
|
||||||
|
"localhost_match_wildcard_host",
|
||||||
|
"max_slave_connections",
|
||||||
|
"max_slave_replication_lag",
|
||||||
|
"use_sql_variables_in", /*< rwsplit only */
|
||||||
|
"subservices",
|
||||||
|
"version_string",
|
||||||
|
"filters",
|
||||||
|
"weightby",
|
||||||
|
"ssl_cert",
|
||||||
|
"ssl_ca_cert",
|
||||||
|
"ssl",
|
||||||
|
"ssl_key",
|
||||||
|
"ssl_version",
|
||||||
|
"ssl_cert_verify_depth",
|
||||||
|
"ignore_databases",
|
||||||
|
"ignore_databases_regex",
|
||||||
|
"log_auth_warnings",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static char *listener_params[] =
|
||||||
|
{
|
||||||
|
"type",
|
||||||
|
"service",
|
||||||
|
"protocol",
|
||||||
|
"port",
|
||||||
|
"address",
|
||||||
|
"socket",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static char *monitor_params[] =
|
||||||
|
{
|
||||||
|
"type",
|
||||||
|
"module",
|
||||||
|
"servers",
|
||||||
|
"user",
|
||||||
|
"passwd",
|
||||||
|
"script",
|
||||||
|
"events",
|
||||||
|
"mysql51_replication",
|
||||||
|
"monitor_interval",
|
||||||
|
"detect_replication_lag",
|
||||||
|
"detect_stale_master",
|
||||||
|
"disable_master_failback",
|
||||||
|
"backend_connect_timeout",
|
||||||
|
"backend_read_timeout",
|
||||||
|
"backend_write_timeout",
|
||||||
|
"available_when_donor",
|
||||||
|
"disable_master_role_setting",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
static char *server_params[] =
|
||||||
|
{
|
||||||
|
"type",
|
||||||
|
"protocol",
|
||||||
|
"port",
|
||||||
|
"address",
|
||||||
|
"monitoruser",
|
||||||
|
"monitorpw",
|
||||||
|
"persistpoolmax",
|
||||||
|
"persistmaxtime",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Trim whitespace from the front and rear of a string
|
* Trim whitespace from the front and rear of a string
|
||||||
*
|
*
|
||||||
@ -479,73 +559,8 @@ process_config_context(CONFIG_CONTEXT *context)
|
|||||||
}
|
}
|
||||||
else if (!strcmp(type, "server"))
|
else if (!strcmp(type, "server"))
|
||||||
{
|
{
|
||||||
char *address;
|
error_count += create_new_server(obj);
|
||||||
char *port;
|
|
||||||
char *protocol;
|
|
||||||
char *monuser;
|
|
||||||
char *monpw;
|
|
||||||
|
|
||||||
address = config_get_value(obj->parameters, "address");
|
|
||||||
port = config_get_value(obj->parameters, "port");
|
|
||||||
protocol = config_get_value(obj->parameters, "protocol");
|
|
||||||
monuser = config_get_value(obj->parameters, "monitoruser");
|
|
||||||
monpw = config_get_value(obj->parameters, "monitorpw");
|
|
||||||
|
|
||||||
if (address && port && protocol)
|
|
||||||
{
|
|
||||||
obj->element = server_alloc(address,
|
|
||||||
protocol,
|
|
||||||
atoi(port));
|
|
||||||
server_set_unique_name(obj->element, obj->object);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
obj->element = NULL;
|
|
||||||
MXS_ERROR("Server '%s' is missing a "
|
|
||||||
"required configuration parameter. A "
|
|
||||||
"server must "
|
|
||||||
"have address, port and protocol "
|
|
||||||
"defined.",
|
|
||||||
obj->object);
|
|
||||||
error_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj->element && monuser && monpw)
|
|
||||||
{
|
|
||||||
serverAddMonUser(obj->element, monuser, monpw);
|
|
||||||
}
|
|
||||||
else if (monuser && monpw == NULL)
|
|
||||||
{
|
|
||||||
MXS_ERROR("Server '%s' has a monitoruser"
|
|
||||||
"defined but no corresponding password.",
|
|
||||||
obj->object);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj->element)
|
|
||||||
{
|
|
||||||
SERVER *server = obj->element;
|
|
||||||
server->persistpoolmax = strtol(config_get_value_string(obj->parameters,
|
|
||||||
"persistpoolmax"), NULL, 0);
|
|
||||||
server->persistmaxtime = strtol(config_get_value_string(obj->parameters,
|
|
||||||
"persistmaxtime"), NULL, 0);
|
|
||||||
CONFIG_PARAMETER *params = obj->parameters;
|
|
||||||
|
|
||||||
while (params)
|
|
||||||
{
|
|
||||||
if (strcmp(params->name, "address")
|
|
||||||
&& strcmp(params->name, "port")
|
|
||||||
&& strcmp(params->name, "protocol")
|
|
||||||
&& strcmp(params->name, "monitoruser")
|
|
||||||
&& strcmp(params->name, "monitorpw")
|
|
||||||
&& strcmp(params->name, "type")
|
|
||||||
&& strcmp(params->name, "persistpoolmax")
|
|
||||||
&& strcmp(params->name, "persistmaxtime"))
|
|
||||||
{
|
|
||||||
serverAddParameter(obj->element, params->name, params->value);
|
|
||||||
}
|
|
||||||
params = params->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else if (!strcmp(type, "filter"))
|
else if (!strcmp(type, "filter"))
|
||||||
{
|
{
|
||||||
@ -1639,52 +1654,21 @@ process_config_update(CONFIG_CONTEXT *context)
|
|||||||
}
|
}
|
||||||
else if (!strcmp(type, "server"))
|
else if (!strcmp(type, "server"))
|
||||||
{
|
{
|
||||||
char *address;
|
char *address = config_get_value(obj->parameters, "address");
|
||||||
char *port;
|
char *port = config_get_value(obj->parameters, "port");
|
||||||
char *protocol;
|
|
||||||
char *monuser;
|
|
||||||
char *monpw;
|
|
||||||
|
|
||||||
address = config_get_value(obj->parameters, "address");
|
if (address && port &&
|
||||||
port = config_get_value(obj->parameters, "port");
|
(server = server_find(address, atoi(port))) != NULL)
|
||||||
protocol = config_get_value(obj->parameters, "protocol");
|
|
||||||
monuser = config_get_value(obj->parameters, "monitoruser");
|
|
||||||
monpw = config_get_value(obj->parameters, "monitorpw");
|
|
||||||
|
|
||||||
if (address && port && protocol)
|
|
||||||
{
|
{
|
||||||
if ((server = server_find(address, atoi(port))) != NULL)
|
char *protocol = config_get_value(obj->parameters, "protocol");
|
||||||
{
|
char *monuser = config_get_value(obj->parameters, "monuser");
|
||||||
server_update(server,
|
char *monpw = config_get_value(obj->parameters, "monpw");
|
||||||
protocol,
|
server_update(server, protocol, monuser, monpw);
|
||||||
monuser,
|
|
||||||
monpw);
|
|
||||||
obj->element = server;
|
obj->element = server;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
obj->element = server_alloc(address,
|
create_new_server(obj);
|
||||||
protocol,
|
|
||||||
atoi(port));
|
|
||||||
|
|
||||||
server_set_unique_name(obj->element, obj->object);
|
|
||||||
|
|
||||||
if (obj->element && monuser && monpw)
|
|
||||||
{
|
|
||||||
serverAddMonUser(obj->element,
|
|
||||||
monuser,
|
|
||||||
monpw);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
MXS_ERROR("Server '%s' is missing a "
|
|
||||||
"required "
|
|
||||||
"configuration parameter. A server must "
|
|
||||||
"have address, port and protocol "
|
|
||||||
"defined.",
|
|
||||||
obj->object);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
obj = obj->next;
|
obj = obj->next;
|
||||||
@ -1825,71 +1809,6 @@ process_config_update(CONFIG_CONTEXT *context)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *service_params[] =
|
|
||||||
{
|
|
||||||
"type",
|
|
||||||
"router",
|
|
||||||
"router_options",
|
|
||||||
"servers",
|
|
||||||
"user",
|
|
||||||
"passwd",
|
|
||||||
"enable_root_user",
|
|
||||||
"connection_timeout",
|
|
||||||
"auth_all_servers",
|
|
||||||
"optimize_wildcard",
|
|
||||||
"strip_db_esc",
|
|
||||||
"localhost_match_wildcard_host",
|
|
||||||
"max_slave_connections",
|
|
||||||
"max_slave_replication_lag",
|
|
||||||
"use_sql_variables_in", /*< rwsplit only */
|
|
||||||
"subservices",
|
|
||||||
"version_string",
|
|
||||||
"filters",
|
|
||||||
"weightby",
|
|
||||||
"ssl_cert",
|
|
||||||
"ssl_ca_cert",
|
|
||||||
"ssl",
|
|
||||||
"ssl_key",
|
|
||||||
"ssl_version",
|
|
||||||
"ssl_cert_verify_depth",
|
|
||||||
"ignore_databases",
|
|
||||||
"ignore_databases_regex",
|
|
||||||
"log_auth_warnings",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static char *listener_params[] =
|
|
||||||
{
|
|
||||||
"type",
|
|
||||||
"service",
|
|
||||||
"protocol",
|
|
||||||
"port",
|
|
||||||
"address",
|
|
||||||
"socket",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static char *monitor_params[] =
|
|
||||||
{
|
|
||||||
"type",
|
|
||||||
"module",
|
|
||||||
"servers",
|
|
||||||
"user",
|
|
||||||
"passwd",
|
|
||||||
"script",
|
|
||||||
"events",
|
|
||||||
"mysql51_replication",
|
|
||||||
"monitor_interval",
|
|
||||||
"detect_replication_lag",
|
|
||||||
"detect_stale_master",
|
|
||||||
"disable_master_failback",
|
|
||||||
"backend_connect_timeout",
|
|
||||||
"backend_read_timeout",
|
|
||||||
"backend_write_timeout",
|
|
||||||
"available_when_donor",
|
|
||||||
"disable_master_role_setting",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
/**
|
/**
|
||||||
* Check the configuration objects have valid parameters
|
* Check the configuration objects have valid parameters
|
||||||
*/
|
*/
|
||||||
@ -2773,3 +2692,106 @@ int create_new_router(CONFIG_CONTEXT *obj, const char *router)
|
|||||||
}
|
}
|
||||||
return error_count;
|
return error_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a parameter is a default server parameter.
|
||||||
|
* @param param Parameter name
|
||||||
|
* @return True if it is one of the standard server parameters
|
||||||
|
*/
|
||||||
|
bool is_normal_server_parameter(const char *param)
|
||||||
|
{
|
||||||
|
for (int i = 0; server_params[i]; i++)
|
||||||
|
{
|
||||||
|
if (strcmp(param, server_params[i]) == 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new server
|
||||||
|
* @param obj Server configuration context
|
||||||
|
* @return Number of errors
|
||||||
|
*/
|
||||||
|
int create_new_server(CONFIG_CONTEXT *obj)
|
||||||
|
{
|
||||||
|
int error_count = 0;
|
||||||
|
char *address = config_get_value(obj->parameters, "address");
|
||||||
|
char *port = config_get_value(obj->parameters, "port");
|
||||||
|
char *protocol = config_get_value(obj->parameters, "protocol");
|
||||||
|
char *monuser = config_get_value(obj->parameters, "monitoruser");
|
||||||
|
char *monpw = config_get_value(obj->parameters, "monitorpw");
|
||||||
|
|
||||||
|
if (address && port && protocol)
|
||||||
|
{
|
||||||
|
if ((obj->element = server_alloc(address, protocol, atoi(port))))
|
||||||
|
{
|
||||||
|
server_set_unique_name(obj->element, obj->object);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MXS_ERROR("Failed to create a new server, memory allocation failed.");
|
||||||
|
error_count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
obj->element = NULL;
|
||||||
|
MXS_ERROR("Server '%s' is missing a required configuration parameter. A "
|
||||||
|
"server must have address, port and protocol defined.", obj->object);
|
||||||
|
error_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (error_count == 0)
|
||||||
|
{
|
||||||
|
SERVER *server = obj->element;
|
||||||
|
|
||||||
|
if (monuser && monpw)
|
||||||
|
{
|
||||||
|
serverAddMonUser(server, monuser, monpw);
|
||||||
|
}
|
||||||
|
else if (monuser && monpw == NULL)
|
||||||
|
{
|
||||||
|
MXS_ERROR("Server '%s' has a monitoruser defined but no corresponding "
|
||||||
|
"password.", obj->object);
|
||||||
|
error_count++;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *endptr;
|
||||||
|
const char *poolmax = config_get_value_string(obj->parameters, "persistpoolmax");
|
||||||
|
if (poolmax)
|
||||||
|
{
|
||||||
|
server->persistpoolmax = strtol(poolmax, &endptr, 0);
|
||||||
|
if (*endptr != '\0')
|
||||||
|
{
|
||||||
|
MXS_ERROR("Invalid value for 'persistpoolmax' for server %s: %s",
|
||||||
|
server->unique_name, poolmax);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *persistmax = config_get_value_string(obj->parameters, "persistmaxtime");
|
||||||
|
if (persistmax)
|
||||||
|
{
|
||||||
|
server->persistmaxtime = strtol(persistmax, &endptr, 0);
|
||||||
|
if (*endptr != '\0')
|
||||||
|
{
|
||||||
|
MXS_ERROR("Invalid value for 'persistmaxtime' for server %s: %s",
|
||||||
|
server->unique_name, persistmax);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
CONFIG_PARAMETER *params = obj->parameters;
|
||||||
|
|
||||||
|
while (params)
|
||||||
|
{
|
||||||
|
if (!is_normal_server_parameter(params->name))
|
||||||
|
{
|
||||||
|
serverAddParameter(obj->element, params->name, params->value);
|
||||||
|
}
|
||||||
|
params = params->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return error_count;
|
||||||
|
}
|
||||||
|
@ -91,6 +91,8 @@ server_alloc(char *servname, char *protocol, unsigned short port)
|
|||||||
spinlock_init(&server->lock);
|
spinlock_init(&server->lock);
|
||||||
server->persistent = NULL;
|
server->persistent = NULL;
|
||||||
server->persistmax = 0;
|
server->persistmax = 0;
|
||||||
|
server->persistmaxtime = 0;
|
||||||
|
server->persistpoolmax = 0;
|
||||||
spinlock_init(&server->persistlock);
|
spinlock_init(&server->persistlock);
|
||||||
|
|
||||||
spinlock_acquire(&server_spin);
|
spinlock_acquire(&server_spin);
|
||||||
|
Reference in New Issue
Block a user