MXS-2011 Use std::string in MASTER_SERVER_CFG

Makes things simpler if you do not need to worry about string
lifetime management.
This commit is contained in:
Johan Wikman 2018-08-23 14:11:50 +03:00
parent 0c59516e24
commit 1d059f26eb
2 changed files with 58 additions and 134 deletions

View File

@ -344,20 +344,20 @@ typedef struct mariadb_gtid_info
/* Master Server configuration struct */
typedef struct master_server_config
{
char *host;
std::string host;
unsigned short port;
char logfile[BINLOG_FNAMELEN + 1];
std::string logfile;
uint64_t pos;
uint64_t safe_pos;
char *user;
char *password;
char *filestem;
std::string user;
std::string password;
std::string filestem;
/* SSL options */
char *ssl_key;
char *ssl_cert;
char *ssl_ca;
std::string ssl_key;
std::string ssl_cert;
std::string ssl_ca;
int ssl_enabled;
char *ssl_version;
std::string ssl_version;
/* Connect options */
int heartbeat;
} MASTER_SERVER_CFG;

View File

@ -170,12 +170,11 @@ static char *blr_set_master_logfile(ROUTER_INSTANCE *router,
char *error);
static void blr_master_get_config(ROUTER_INSTANCE *router,
MASTER_SERVER_CFG *current_master);
static void blr_master_free_config(MASTER_SERVER_CFG *current_master);
static void blr_master_restore_config(ROUTER_INSTANCE *router,
MASTER_SERVER_CFG *current_master);
const MASTER_SERVER_CFG& current_master);
static void blr_master_set_empty_config(ROUTER_INSTANCE *router);
static void blr_master_apply_config(ROUTER_INSTANCE *router,
MASTER_SERVER_CFG *prev_master);
const MASTER_SERVER_CFG& prev_master);
static int blr_slave_send_ok_message(ROUTER_INSTANCE* router,
ROUTER_SLAVE* slave,
char *message);
@ -326,7 +325,7 @@ static bool blr_check_connecting_slave(const ROUTER_INSTANCE *router,
ROUTER_SLAVE *slave,
enum blr_slave_check check);
static void blr_abort_change_master(ROUTER_INSTANCE *router,
MASTER_SERVER_CFG *current_master,
const MASTER_SERVER_CFG& current_master,
const char *error);
static void blr_slave_abort_dump_request(ROUTER_SLAVE *slave,
const char *errmsg);
@ -4146,7 +4145,6 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
{
char *master_logfile = NULL;
int change_binlog = 0;
MASTER_SERVER_CFG *current_master = NULL;
CHANGE_MASTER_OPTIONS change_master;
int parse_ret;
char *cmd_ptr;
@ -4187,23 +4185,12 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
return -1;
}
/* allocate struct for current replication parameters */
current_master = (MASTER_SERVER_CFG *)MXS_CALLOC(1, sizeof(MASTER_SERVER_CFG));
if (!current_master)
{
static const char MESSAGE[] = "error allocating memory for blr_master_get_config";
mxb_assert(sizeof(MESSAGE) <= BINLOG_ERROR_MSG_LEN);
strcpy(error, MESSAGE);
MXS_ERROR("%s: %s", router->service->name, error);
return -1;
}
MASTER_SERVER_CFG current_master;
spinlock_acquire(&router->lock);
/* save current config option data */
blr_master_get_config(router, current_master);
blr_master_get_config(router, &current_master);
/* Abort if MASTER_USE_GTID is in use and
* router->mariadb10_master_gtid is not set
@ -4359,10 +4346,7 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
}
/* Log config changes (without passwords) */
blr_log_config_changes(router, current_master, &change_master);
/* Free data struct */
blr_master_free_config(current_master);
blr_log_config_changes(router, &current_master, &change_master);
MXS_FREE(master_logfile);
@ -4588,13 +4572,13 @@ blr_master_get_config(ROUTER_INSTANCE *router, MASTER_SERVER_CFG *curr_master)
SSL_LISTENER *server_ssl;
curr_master->port = router->service->dbref->server->port;
curr_master->host = MXS_STRDUP_A(router->service->dbref->server->address);
curr_master->host = router->service->dbref->server->address;
curr_master->pos = router->current_pos;
curr_master->safe_pos = router->binlog_position;
strcpy(curr_master->logfile, router->binlog_name); // Same size
curr_master->user = MXS_STRDUP_A(router->user);
curr_master->password = MXS_STRDUP_A(router->password);
curr_master->filestem = MXS_STRDUP_A(router->fileroot);
curr_master->logfile = router->binlog_name;
curr_master->user = router->user;
curr_master->password = router->password;
curr_master->filestem = router->fileroot;
/* SSL options */
if (router->service->dbref->server->server_ssl)
{
@ -4602,46 +4586,25 @@ blr_master_get_config(ROUTER_INSTANCE *router, MASTER_SERVER_CFG *curr_master)
curr_master->ssl_enabled = router->ssl_enabled;
if (router->ssl_version)
{
curr_master->ssl_version = MXS_STRDUP_A(router->ssl_version);
curr_master->ssl_version = router->ssl_version;
}
if (server_ssl->ssl_key)
{
curr_master->ssl_key = MXS_STRDUP_A(server_ssl->ssl_key);
curr_master->ssl_key = server_ssl->ssl_key;
}
if (server_ssl->ssl_cert)
{
curr_master->ssl_cert = MXS_STRDUP_A(server_ssl->ssl_cert);
curr_master->ssl_cert = server_ssl->ssl_cert;
}
if (server_ssl->ssl_ca_cert)
{
curr_master->ssl_ca = MXS_STRDUP_A(server_ssl->ssl_ca_cert);
curr_master->ssl_ca = server_ssl->ssl_ca_cert;
}
}
/* Connect options */
curr_master->heartbeat = router->heartbeat;
}
/**
* Free a master configuration struct
*
* @param master_cfg Saved master configuration to free
*/
static void
blr_master_free_config(MASTER_SERVER_CFG *master_cfg)
{
MXS_FREE(master_cfg->host);
MXS_FREE(master_cfg->user);
MXS_FREE(master_cfg->password);
MXS_FREE(master_cfg->filestem);
/* SSL options */
MXS_FREE(master_cfg->ssl_key);
MXS_FREE(master_cfg->ssl_cert);
MXS_FREE(master_cfg->ssl_ca);
MXS_FREE(master_cfg->ssl_version);
MXS_FREE(master_cfg);
}
/**
* Restore master configuration values for host and port
*
@ -4650,21 +4613,19 @@ blr_master_free_config(MASTER_SERVER_CFG *master_cfg)
*/
static void
blr_master_restore_config(ROUTER_INSTANCE *router,
MASTER_SERVER_CFG *prev_master)
const MASTER_SERVER_CFG& prev_master)
{
server_update_address(router->service->dbref->server, prev_master->host);
server_update_port(router->service->dbref->server, prev_master->port);
server_update_address(router->service->dbref->server, prev_master.host.c_str());
server_update_port(router->service->dbref->server, prev_master.port);
router->ssl_enabled = prev_master->ssl_enabled;
if (prev_master->ssl_version)
router->ssl_enabled = prev_master.ssl_enabled;
if (!prev_master.ssl_version.empty())
{
MXS_FREE(router->ssl_version);
router->ssl_version = MXS_STRDUP_A(prev_master->ssl_version);
router->ssl_version = MXS_STRDUP_A(prev_master.ssl_version.c_str());
}
router->heartbeat = prev_master->heartbeat;
blr_master_free_config(prev_master);
router->heartbeat = prev_master.heartbeat;
}
/**
@ -4696,31 +4657,31 @@ blr_master_set_empty_config(ROUTER_INSTANCE *router)
* @param prev_master Previous saved master configuration
*/
static void
blr_master_apply_config(ROUTER_INSTANCE *router, MASTER_SERVER_CFG *prev_master)
blr_master_apply_config(ROUTER_INSTANCE *router, const MASTER_SERVER_CFG& prev_master)
{
server_update_address(router->service->dbref->server, prev_master->host);
server_update_port(router->service->dbref->server, prev_master->port);
router->current_pos = prev_master->pos;
router->binlog_position = prev_master->safe_pos;
router->current_safe_event = prev_master->safe_pos;
strcpy(router->binlog_name, prev_master->logfile);
server_update_address(router->service->dbref->server, prev_master.host.c_str());
server_update_port(router->service->dbref->server, prev_master.port);
router->current_pos = prev_master.pos;
router->binlog_position = prev_master.safe_pos;
router->current_safe_event = prev_master.safe_pos;
strcpy(router->binlog_name, prev_master.logfile.c_str());
if (router->user)
{
MXS_FREE(router->user);
router->user = MXS_STRDUP_A(prev_master->user);
router->user = MXS_STRDUP_A(prev_master.user.c_str());
}
if (router->password)
{
MXS_FREE(router->password);
router->password = MXS_STRDUP_A(prev_master->password);
router->password = MXS_STRDUP_A(prev_master.password.c_str());
}
if (router->fileroot)
{
MXS_FREE(router->fileroot);
router->fileroot = MXS_STRDUP_A(prev_master->filestem);
router->fileroot = MXS_STRDUP_A(prev_master.filestem.c_str());
}
router->heartbeat = prev_master->heartbeat;
router->heartbeat = prev_master.heartbeat;
}
/**
@ -7846,39 +7807,21 @@ static bool blr_handle_admin_stmt(ROUTER_INSTANCE *router,
if (router->master_state == BLRM_SLAVE_STOPPED)
{
char error_string[BINLOG_ERROR_MSG_LEN + 1] = "";
MASTER_SERVER_CFG *current_master = NULL;
MASTER_SERVER_CFG current_master;
int removed_cfg = 0;
/* save current replication parameters */
current_master = (MASTER_SERVER_CFG *)MXS_CALLOC(1, sizeof(MASTER_SERVER_CFG));
MXS_ABORT_IF_NULL(current_master);
if (!current_master)
{
snprintf(error_string,
BINLOG_ERROR_MSG_LEN,
"error allocating memory for blr_master_get_config");
MXS_ERROR("%s: %s", router->service->name, error_string);
blr_slave_send_error_packet(slave,
error_string,
1201,
NULL);
return true;
}
/* get current data */
blr_master_get_config(router, current_master);
blr_master_get_config(router, &current_master);
MXS_NOTICE("%s: 'RESET SLAVE executed'. Previous state MASTER_HOST='%s', "
"MASTER_PORT=%i, MASTER_LOG_FILE='%s', MASTER_LOG_POS=%lu, "
"MASTER_USER='%s'",
router->service->name,
current_master->host,
current_master->port,
current_master->logfile,
current_master->pos,
current_master->user);
current_master.host.c_str(),
current_master.port,
current_master.logfile.c_str(),
current_master.pos,
current_master.user.c_str());
/* remove master.ini */
static const char MASTER_INI[] = "/master.ini";
@ -7903,7 +7846,6 @@ static bool blr_handle_admin_stmt(ROUTER_INSTANCE *router,
/* Set the BLRM_UNCONFIGURED state */
router->master_state = BLRM_UNCONFIGURED;
blr_master_set_empty_config(router);
blr_master_free_config(current_master);
/* Remove any error message and errno */
free(router->m_errmsg);
@ -7996,21 +7938,9 @@ static bool blr_handle_admin_stmt(ROUTER_INSTANCE *router,
{
int rc;
char error_string[BINLOG_ERROR_MSG_LEN + 1 + BINLOG_ERROR_MSG_LEN + 1] = "";
MASTER_SERVER_CFG *current_master = NULL;
MASTER_SERVER_CFG current_master;
current_master = (MASTER_SERVER_CFG *)MXS_CALLOC(1, sizeof(MASTER_SERVER_CFG));
if (!current_master)
{
blr_slave_send_error_packet(slave,
error_string,
1201,
NULL);
return true;
}
blr_master_get_config(router, current_master);
blr_master_get_config(router, &current_master);
rc = blr_handle_change_master(router, brkb, error_string);
@ -8021,7 +7951,6 @@ static bool blr_handle_admin_stmt(ROUTER_INSTANCE *router,
error_string,
1234,
"42000");
blr_master_free_config(current_master);
return true;
}
@ -8039,7 +7968,6 @@ static bool blr_handle_admin_stmt(ROUTER_INSTANCE *router,
spinlock_acquire(&router->lock);
blr_master_apply_config(router, current_master);
blr_master_free_config(current_master);
spinlock_release(&router->lock);
@ -8093,7 +8021,6 @@ static bool blr_handle_admin_stmt(ROUTER_INSTANCE *router,
MXS_INFO("%s: 'master.ini' created, binlog file '%s' created",
router->service->name, router->binlog_name);
}
blr_master_free_config(current_master);
blr_slave_send_ok(router, slave);
return true;
}
@ -8107,18 +8034,15 @@ static bool blr_handle_admin_stmt(ROUTER_INSTANCE *router,
snprintf(message, BINLOG_ERROR_MSG_LEN,
"1105:Partial transaction in file %s starting at pos %lu, "
"ending at pos %lu will be lost with next START SLAVE command",
current_master->logfile,
current_master->safe_pos,
current_master->pos);
blr_master_free_config(current_master);
current_master.logfile.c_str(),
current_master.safe_pos,
current_master.pos);
blr_slave_send_warning_message(router, slave, message);
return true;
}
}
blr_master_free_config(current_master);
/*
* The CHAMGE MASTER command might specify a new binlog file.
* Let's create the binlogfile specified in MASTER_LOG_FILE
@ -9019,11 +8943,11 @@ static void blr_log_config_changes(ROUTER_INSTANCE *router,
"MASTER_USER='%s'"
"%s%s%s",
router->service->name,
current_master->host,
current_master->host.c_str(),
current_master->port,
current_master->logfile,
current_master->logfile.c_str(),
current_master->pos,
current_master->user,
current_master->user.c_str(),
router->service->dbref->server->address,
router->service->dbref->server->port,
router->binlog_name,
@ -9140,7 +9064,7 @@ static bool blr_check_connecting_slave(const ROUTER_INSTANCE *router,
* @param error Error message to log
*/
static void blr_abort_change_master(ROUTER_INSTANCE *router,
MASTER_SERVER_CFG *current_master,
const MASTER_SERVER_CFG& current_master,
const char *error)
{
MXS_ERROR("%s: %s", router->service->name, error);