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:
@ -27,7 +27,6 @@
|
|||||||
#include "blr.hh"
|
#include "blr.hh"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <ini.h>
|
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -80,13 +79,6 @@ static void errorReply(MXS_ROUTER *instance,
|
|||||||
bool *succp);
|
bool *succp);
|
||||||
|
|
||||||
static uint64_t getCapabilities(MXS_ROUTER* instance);
|
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_load_dbusers(const ROUTER_INSTANCE *router);
|
||||||
static int blr_check_binlog(ROUTER_INSTANCE *router);
|
static int blr_check_binlog(ROUTER_INSTANCE *router);
|
||||||
void blr_master_close(ROUTER_INSTANCE *);
|
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,
|
extern bool blr_load_last_mariadb_gtid(ROUTER_INSTANCE *router,
|
||||||
MARIADB_GTID_INFO *result);
|
MARIADB_GTID_INFO *result);
|
||||||
|
|
||||||
void blr_log_disabled_heartbeat(const ROUTER_INSTANCE *inst);
|
|
||||||
|
|
||||||
static SPINLOCK instlock;
|
static SPINLOCK instlock;
|
||||||
static ROUTER_INSTANCE *instances;
|
static ROUTER_INSTANCE *instances;
|
||||||
|
|
||||||
@ -827,16 +817,7 @@ static MXS_ROUTER* createInstance(SERVICE *service, MXS_CONFIG_PARAMETER* params
|
|||||||
* automatic master replication start phase
|
* automatic master replication start phase
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static const char MASTER_INI[] = "/master.ini";
|
rc = blr_file_read_master_config(inst);
|
||||||
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);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* retcode:
|
* retcode:
|
||||||
@ -2654,175 +2635,6 @@ blr_send_custom_error(DCB *dcb,
|
|||||||
return MXS_SESSION_ROUTE_REPLY(dcb->session, errbuf);
|
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
|
* 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
|
* 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_response(ROUTER_INSTANCE *, GWBUF *);
|
||||||
extern void blr_master_reconnect(ROUTER_INSTANCE *);
|
extern void blr_master_reconnect(ROUTER_INSTANCE *);
|
||||||
extern int blr_master_connected(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 *,
|
extern int blr_file_rotate(ROUTER_INSTANCE *,
|
||||||
char *,
|
char *,
|
||||||
uint64_t);
|
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 void blr_file_flush(ROUTER_INSTANCE *);
|
||||||
extern BLFILE *blr_open_binlog(ROUTER_INSTANCE *,
|
extern BLFILE *blr_open_binlog(ROUTER_INSTANCE *,
|
||||||
const char *,
|
const char *,
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <ini.h>
|
||||||
|
|
||||||
#include <maxscale/alloc.h>
|
#include <maxscale/alloc.h>
|
||||||
#include <maxbase/atomic.h>
|
#include <maxbase/atomic.h>
|
||||||
#include <maxscale/dcb.h>
|
#include <maxscale/dcb.h>
|
||||||
@ -3102,6 +3104,193 @@ blr_file_new_binlog(ROUTER_INSTANCE *router, char *file)
|
|||||||
return blr_file_create(router, 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
|
* Write a new ini file with master configuration
|
||||||
*
|
*
|
||||||
|
Reference in New Issue
Block a user