MXS-2011 Introduce blr_file_read_master_config()
One function for writing, another for reading the config. No code changes; just moving code around.
This commit is contained in:
parent
a43f2ce8fb
commit
93dc75a011
@ -27,7 +27,6 @@
|
||||
#include "blr.hh"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <ini.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -80,13 +79,6 @@ static void errorReply(MXS_ROUTER *instance,
|
||||
bool *succp);
|
||||
|
||||
static uint64_t getCapabilities(MXS_ROUTER* instance);
|
||||
static int blr_handler_config(void *userdata,
|
||||
const char *section,
|
||||
const char *name,
|
||||
const char *value);
|
||||
static int blr_handle_config_item(const char *name,
|
||||
const char *value,
|
||||
ROUTER_INSTANCE *inst);
|
||||
static int blr_load_dbusers(const ROUTER_INSTANCE *router);
|
||||
static int blr_check_binlog(ROUTER_INSTANCE *router);
|
||||
void blr_master_close(ROUTER_INSTANCE *);
|
||||
@ -108,8 +100,6 @@ GWBUF *blr_cache_read_response(ROUTER_INSTANCE *router,
|
||||
extern bool blr_load_last_mariadb_gtid(ROUTER_INSTANCE *router,
|
||||
MARIADB_GTID_INFO *result);
|
||||
|
||||
void blr_log_disabled_heartbeat(const ROUTER_INSTANCE *inst);
|
||||
|
||||
static SPINLOCK instlock;
|
||||
static ROUTER_INSTANCE *instances;
|
||||
|
||||
@ -827,16 +817,7 @@ static MXS_ROUTER* createInstance(SERVICE *service, MXS_CONFIG_PARAMETER* params
|
||||
* automatic master replication start phase
|
||||
*/
|
||||
|
||||
static const char MASTER_INI[] = "/master.ini";
|
||||
char filename[strlen(inst->binlogdir) + sizeof(MASTER_INI)]; // sizeof includes the NULL
|
||||
sprintf(filename, "%s%s", inst->binlogdir, MASTER_INI);
|
||||
|
||||
rc = ini_parse(filename, blr_handler_config, inst);
|
||||
|
||||
MXS_INFO("%s: %s parse result is %d",
|
||||
inst->service->name,
|
||||
filename,
|
||||
rc);
|
||||
rc = blr_file_read_master_config(inst);
|
||||
|
||||
/*
|
||||
* retcode:
|
||||
@ -2654,175 +2635,6 @@ blr_send_custom_error(DCB *dcb,
|
||||
return MXS_SESSION_ROUTE_REPLY(dcb->session, errbuf);
|
||||
}
|
||||
|
||||
/**
|
||||
* Config item handler for the ini file reader
|
||||
*
|
||||
* @param userdata The config context element
|
||||
* @param section The config file section
|
||||
* @param name The Parameter name
|
||||
* @param value The Parameter value
|
||||
* @return zero on error
|
||||
*/
|
||||
|
||||
static int
|
||||
blr_handler_config(void *userdata, const char *section, const char *name, const char *value)
|
||||
{
|
||||
ROUTER_INSTANCE *inst = (ROUTER_INSTANCE *) userdata;
|
||||
SERVICE *service;
|
||||
|
||||
service = inst->service;
|
||||
|
||||
if (strcasecmp(section, "binlog_configuration") == 0)
|
||||
{
|
||||
return blr_handle_config_item(name, value, inst);
|
||||
}
|
||||
else
|
||||
{
|
||||
MXS_ERROR("master.ini has an invalid section [%s], it should be [binlog_configuration]. "
|
||||
"Service %s",
|
||||
section,
|
||||
service->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Configuration handler for items in the [binlog_configuration] section
|
||||
*
|
||||
* @param name The item name
|
||||
* @param value The item value
|
||||
* @param inst The current router instance
|
||||
* @return 0 on error
|
||||
*/
|
||||
static int
|
||||
blr_handle_config_item(const char *name, const char *value, ROUTER_INSTANCE *inst)
|
||||
{
|
||||
SERVICE *service;
|
||||
char *ssl_cert;
|
||||
char *ssl_key;
|
||||
char *ssl_ca_cert;
|
||||
SERVER *backend_server;
|
||||
|
||||
service = inst->service;
|
||||
|
||||
backend_server = service->dbref->server;
|
||||
|
||||
if (strcmp(name, "master_host") == 0)
|
||||
{
|
||||
server_update_address(service->dbref->server, (char *)value);
|
||||
}
|
||||
else if (strcmp(name, "master_port") == 0)
|
||||
{
|
||||
server_update_port(service->dbref->server, (short)atoi(value));
|
||||
}
|
||||
else if (strcmp(name, "filestem") == 0)
|
||||
{
|
||||
MXS_FREE(inst->fileroot);
|
||||
inst->fileroot = MXS_STRDUP_A(value);
|
||||
}
|
||||
else if (strcmp(name, "master_user") == 0)
|
||||
{
|
||||
if (inst->user)
|
||||
{
|
||||
MXS_FREE(inst->user);
|
||||
}
|
||||
inst->user = MXS_STRDUP_A(value);
|
||||
}
|
||||
else if (strcmp(name, "master_password") == 0)
|
||||
{
|
||||
if (inst->password)
|
||||
{
|
||||
MXS_FREE(inst->password);
|
||||
}
|
||||
inst->password = MXS_STRDUP_A(value);
|
||||
}
|
||||
/** Checl for SSL options */
|
||||
else if (strcmp(name, "master_ssl") == 0)
|
||||
{
|
||||
inst->ssl_enabled = config_truth_value((char*)value);
|
||||
}
|
||||
else if (strcmp(name, "master_ssl_ca") == 0)
|
||||
{
|
||||
MXS_FREE(backend_server->server_ssl->ssl_ca_cert);
|
||||
backend_server->server_ssl->ssl_ca_cert = value ? MXS_STRDUP_A(value) : NULL;
|
||||
MXS_FREE(inst->ssl_ca);
|
||||
inst->ssl_ca = value ? MXS_STRDUP_A(value) : NULL;
|
||||
}
|
||||
else if (strcmp(name, "master_ssl_cert") == 0)
|
||||
{
|
||||
MXS_FREE(backend_server->server_ssl->ssl_cert);
|
||||
backend_server->server_ssl->ssl_cert = value ? MXS_STRDUP_A(value) : NULL;
|
||||
MXS_FREE(inst->ssl_cert);
|
||||
inst->ssl_cert = value ? MXS_STRDUP_A(value) : NULL;
|
||||
}
|
||||
else if (strcmp(name, "master_ssl_key") == 0)
|
||||
{
|
||||
MXS_FREE(backend_server->server_ssl->ssl_key);
|
||||
backend_server->server_ssl->ssl_key = value ? MXS_STRDUP_A(value) : NULL;
|
||||
MXS_FREE(inst->ssl_key);
|
||||
inst->ssl_key = value ? MXS_STRDUP_A(value) : NULL;
|
||||
}
|
||||
else if (strcmp(name, "master_ssl_version") == 0 || strcmp(name, "master_tls_version") == 0)
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
if (listener_set_ssl_version(backend_server->server_ssl, (char *)value) != 0)
|
||||
{
|
||||
MXS_ERROR("Found unknown optional parameter value for 'ssl_version' for"
|
||||
" service '%s': %s, ignoring it.",
|
||||
inst->service->name,
|
||||
value);
|
||||
}
|
||||
else
|
||||
{
|
||||
inst->ssl_version = MXS_STRDUP_A(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Connect options */
|
||||
else if (strcmp(name, "master_heartbeat_period") == 0)
|
||||
{
|
||||
int new_val = atol((char *)value);
|
||||
if (new_val < 0)
|
||||
{
|
||||
MXS_WARNING("Found invalid 'master_heartbeat_period' value"
|
||||
" for service '%s': %s, ignoring it.",
|
||||
inst->service->name,
|
||||
value);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (inst->heartbeat > 0 && new_val == 0)
|
||||
{
|
||||
blr_log_disabled_heartbeat(inst);
|
||||
}
|
||||
inst->heartbeat = new_val;
|
||||
}
|
||||
}
|
||||
else if (strcmp(name, "master_connect_retry") == 0)
|
||||
{
|
||||
int new_val = atol((char *)value);
|
||||
if (new_val <= 0)
|
||||
{
|
||||
MXS_WARNING("Found invalid 'master_connect_retry' value"
|
||||
" for service '%s': %s, ignoring it.",
|
||||
inst->service->name,
|
||||
value);
|
||||
}
|
||||
else
|
||||
{
|
||||
inst->retry_interval = new_val;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract a numeric field from a packet of the specified number of bits
|
||||
*
|
||||
|
@ -986,6 +986,7 @@ static const char *blrs_states[] =
|
||||
/*
|
||||
* Externals within the router
|
||||
*/
|
||||
extern void blr_log_disabled_heartbeat(const ROUTER_INSTANCE *inst);
|
||||
extern void blr_master_response(ROUTER_INSTANCE *, GWBUF *);
|
||||
extern void blr_master_reconnect(ROUTER_INSTANCE *);
|
||||
extern int blr_master_connected(ROUTER_INSTANCE *);
|
||||
@ -1009,6 +1010,8 @@ extern int blr_write_binlog_record(ROUTER_INSTANCE *,
|
||||
extern int blr_file_rotate(ROUTER_INSTANCE *,
|
||||
char *,
|
||||
uint64_t);
|
||||
extern int blr_file_read_master_config(ROUTER_INSTANCE *router);
|
||||
extern int blr_file_write_master_config(ROUTER_INSTANCE *router, char *error);
|
||||
extern void blr_file_flush(ROUTER_INSTANCE *);
|
||||
extern BLFILE *blr_open_binlog(ROUTER_INSTANCE *,
|
||||
const char *,
|
||||
|
@ -28,6 +28,8 @@
|
||||
#include <sys/types.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <ini.h>
|
||||
|
||||
#include <maxscale/alloc.h>
|
||||
#include <maxbase/atomic.h>
|
||||
#include <maxscale/dcb.h>
|
||||
@ -3102,6 +3104,193 @@ blr_file_new_binlog(ROUTER_INSTANCE *router, char *file)
|
||||
return blr_file_create(router, file);
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
|
||||
/**
|
||||
* Configuration handler for items in the [binlog_configuration] section
|
||||
*
|
||||
* @param name The item name
|
||||
* @param value The item value
|
||||
* @param inst The current router instance
|
||||
* @return 0 on error
|
||||
*/
|
||||
int blr_handle_config_item(const char *name,
|
||||
const char *value,
|
||||
ROUTER_INSTANCE *inst)
|
||||
{
|
||||
SERVICE *service;
|
||||
char *ssl_cert;
|
||||
char *ssl_key;
|
||||
char *ssl_ca_cert;
|
||||
SERVER *backend_server;
|
||||
|
||||
service = inst->service;
|
||||
|
||||
backend_server = service->dbref->server;
|
||||
|
||||
if (strcmp(name, "master_host") == 0)
|
||||
{
|
||||
server_update_address(service->dbref->server, (char *)value);
|
||||
}
|
||||
else if (strcmp(name, "master_port") == 0)
|
||||
{
|
||||
server_update_port(service->dbref->server, (short)atoi(value));
|
||||
}
|
||||
else if (strcmp(name, "filestem") == 0)
|
||||
{
|
||||
MXS_FREE(inst->fileroot);
|
||||
inst->fileroot = MXS_STRDUP_A(value);
|
||||
}
|
||||
else if (strcmp(name, "master_user") == 0)
|
||||
{
|
||||
if (inst->user)
|
||||
{
|
||||
MXS_FREE(inst->user);
|
||||
}
|
||||
inst->user = MXS_STRDUP_A(value);
|
||||
}
|
||||
else if (strcmp(name, "master_password") == 0)
|
||||
{
|
||||
if (inst->password)
|
||||
{
|
||||
MXS_FREE(inst->password);
|
||||
}
|
||||
inst->password = MXS_STRDUP_A(value);
|
||||
}
|
||||
/** Checl for SSL options */
|
||||
else if (strcmp(name, "master_ssl") == 0)
|
||||
{
|
||||
inst->ssl_enabled = config_truth_value((char*)value);
|
||||
}
|
||||
else if (strcmp(name, "master_ssl_ca") == 0)
|
||||
{
|
||||
MXS_FREE(backend_server->server_ssl->ssl_ca_cert);
|
||||
backend_server->server_ssl->ssl_ca_cert = value ? MXS_STRDUP_A(value) : NULL;
|
||||
MXS_FREE(inst->ssl_ca);
|
||||
inst->ssl_ca = value ? MXS_STRDUP_A(value) : NULL;
|
||||
}
|
||||
else if (strcmp(name, "master_ssl_cert") == 0)
|
||||
{
|
||||
MXS_FREE(backend_server->server_ssl->ssl_cert);
|
||||
backend_server->server_ssl->ssl_cert = value ? MXS_STRDUP_A(value) : NULL;
|
||||
MXS_FREE(inst->ssl_cert);
|
||||
inst->ssl_cert = value ? MXS_STRDUP_A(value) : NULL;
|
||||
}
|
||||
else if (strcmp(name, "master_ssl_key") == 0)
|
||||
{
|
||||
MXS_FREE(backend_server->server_ssl->ssl_key);
|
||||
backend_server->server_ssl->ssl_key = value ? MXS_STRDUP_A(value) : NULL;
|
||||
MXS_FREE(inst->ssl_key);
|
||||
inst->ssl_key = value ? MXS_STRDUP_A(value) : NULL;
|
||||
}
|
||||
else if (strcmp(name, "master_ssl_version") == 0 || strcmp(name, "master_tls_version") == 0)
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
if (listener_set_ssl_version(backend_server->server_ssl, (char *)value) != 0)
|
||||
{
|
||||
MXS_ERROR("Found unknown optional parameter value for 'ssl_version' for"
|
||||
" service '%s': %s, ignoring it.",
|
||||
inst->service->name,
|
||||
value);
|
||||
}
|
||||
else
|
||||
{
|
||||
inst->ssl_version = MXS_STRDUP_A(value);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* Connect options */
|
||||
else if (strcmp(name, "master_heartbeat_period") == 0)
|
||||
{
|
||||
int new_val = atol((char *)value);
|
||||
if (new_val < 0)
|
||||
{
|
||||
MXS_WARNING("Found invalid 'master_heartbeat_period' value"
|
||||
" for service '%s': %s, ignoring it.",
|
||||
inst->service->name,
|
||||
value);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (inst->heartbeat > 0 && new_val == 0)
|
||||
{
|
||||
blr_log_disabled_heartbeat(inst);
|
||||
}
|
||||
inst->heartbeat = new_val;
|
||||
}
|
||||
}
|
||||
else if (strcmp(name, "master_connect_retry") == 0)
|
||||
{
|
||||
int new_val = atol((char *)value);
|
||||
if (new_val <= 0)
|
||||
{
|
||||
MXS_WARNING("Found invalid 'master_connect_retry' value"
|
||||
" for service '%s': %s, ignoring it.",
|
||||
inst->service->name,
|
||||
value);
|
||||
}
|
||||
else
|
||||
{
|
||||
inst->retry_interval = new_val;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Config item handler for the ini file reader
|
||||
*
|
||||
* @param userdata The config context element
|
||||
* @param section The config file section
|
||||
* @param name The Parameter name
|
||||
* @param value The Parameter value
|
||||
* @return zero on error
|
||||
*/
|
||||
|
||||
int blr_handler_config(void *userdata, const char *section, const char *name, const char *value)
|
||||
{
|
||||
ROUTER_INSTANCE *inst = (ROUTER_INSTANCE *) userdata;
|
||||
SERVICE *service;
|
||||
|
||||
service = inst->service;
|
||||
|
||||
if (strcasecmp(section, "binlog_configuration") == 0)
|
||||
{
|
||||
return blr_handle_config_item(name, value, inst);
|
||||
}
|
||||
else
|
||||
{
|
||||
MXS_ERROR("master.ini has an invalid section [%s], it should be [binlog_configuration]. "
|
||||
"Service %s",
|
||||
section,
|
||||
service->name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
int blr_file_read_master_config(ROUTER_INSTANCE *router)
|
||||
{
|
||||
static const char MASTER_INI[] = "/master.ini";
|
||||
char filename[strlen(router->binlogdir) + sizeof(MASTER_INI)]; // sizeof includes the NULL
|
||||
sprintf(filename, "%s%s", router->binlogdir, MASTER_INI);
|
||||
|
||||
int rc = ini_parse(filename, blr_handler_config, router);
|
||||
|
||||
MXS_INFO("%s: %s parse result is %d", router->service->name, filename, rc);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a new ini file with master configuration
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user