MXS-2011 Take ChangeMasterConfig into use

This commit is contained in:
Johan Wikman
2018-08-23 17:23:16 +03:00
parent 2ba0b4dda9
commit 8f26e3cbaf

View File

@ -164,8 +164,7 @@ static int blr_handle_change_master(ROUTER_INSTANCE* router,
char *error); char *error);
static int blr_set_master_hostname(ROUTER_INSTANCE *router, const char *hostname); static int blr_set_master_hostname(ROUTER_INSTANCE *router, const char *hostname);
static int blr_set_master_hostname(ROUTER_INSTANCE *router, const std::string& hostname); static int blr_set_master_hostname(ROUTER_INSTANCE *router, const std::string& hostname);
static int blr_set_master_port(ROUTER_INSTANCE *router, const char *port); static int blr_set_master_port(ROUTER_INSTANCE *router, int port);
static int blr_set_master_port(ROUTER_INSTANCE *router, const std::string& port);
static char *blr_set_master_logfile(ROUTER_INSTANCE *router, static char *blr_set_master_logfile(ROUTER_INSTANCE *router,
const char *filename, const char *filename,
char *error); char *error);
@ -240,7 +239,7 @@ static bool blr_send_slave_heartbeat(void *inst);
static int blr_slave_send_heartbeat(ROUTER_INSTANCE *router, static int blr_slave_send_heartbeat(ROUTER_INSTANCE *router,
ROUTER_SLAVE *slave); ROUTER_SLAVE *slave);
static int blr_set_master_ssl(ROUTER_INSTANCE *router, static int blr_set_master_ssl(ROUTER_INSTANCE *router,
const ChangeMasterOptions& config, const ChangeMasterConfig& config,
char *error_message); char *error_message);
static int blr_slave_read_ste(ROUTER_INSTANCE *router, static int blr_slave_read_ste(ROUTER_INSTANCE *router,
ROUTER_SLAVE *slave, ROUTER_SLAVE *slave,
@ -319,7 +318,7 @@ static int binary_logs_find_file_cb(void *data,
char** names); char** names);
static void blr_log_config_changes(ROUTER_INSTANCE *router, static void blr_log_config_changes(ROUTER_INSTANCE *router,
const MasterServerConfig& current_master, const MasterServerConfig& current_master,
const ChangeMasterOptions& change_master); const ChangeMasterConfig& change_master);
extern void blr_log_disabled_heartbeat(const ROUTER_INSTANCE *inst); extern void blr_log_disabled_heartbeat(const ROUTER_INSTANCE *inst);
extern void blr_close_master_in_main(void* data); extern void blr_close_master_in_main(void* data);
static bool blr_check_connecting_slave(const ROUTER_INSTANCE *router, static bool blr_check_connecting_slave(const ROUTER_INSTANCE *router,
@ -331,7 +330,7 @@ static void blr_abort_change_master(ROUTER_INSTANCE *router,
static void blr_slave_abort_dump_request(ROUTER_SLAVE *slave, static void blr_slave_abort_dump_request(ROUTER_SLAVE *slave,
const char *errmsg); const char *errmsg);
static bool blr_binlog_change_check(const ROUTER_INSTANCE *router, static bool blr_binlog_change_check(const ROUTER_INSTANCE *router,
const ChangeMasterOptions& change_master, const ChangeMasterConfig& new_config,
char *error); char *error);
static bool blr_change_binlog_name(ROUTER_INSTANCE *router, static bool blr_change_binlog_name(ROUTER_INSTANCE *router,
const char *log_file, const char *log_file,
@ -342,7 +341,7 @@ static bool blr_change_binlog_name(ROUTER_INSTANCE *router,
char **new_logfile, char **new_logfile,
char *error); char *error);
static bool blr_apply_changes(ROUTER_INSTANCE *router, static bool blr_apply_changes(ROUTER_INSTANCE *router,
const ChangeMasterOptions& change_master, const ChangeMasterConfig& new_config,
char *new_logfile, char *new_logfile,
char *error); char *error);
static void blr_slave_info_save(const MARIADB_GTID_INFO *info, static void blr_slave_info_save(const MARIADB_GTID_INFO *info,
@ -4240,8 +4239,6 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
char *command, char *command,
char *error) char *error)
{ {
ChangeMasterOptions change_master;
char* cmd_ptr = strcasestr(command, "TO"); char* cmd_ptr = strcasestr(command, "TO");
if (!cmd_ptr) if (!cmd_ptr)
{ {
@ -4254,9 +4251,10 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
std::vector<char> cmd_string(cmd_ptr + 2, cmd_ptr + strlen(cmd_ptr) + 1); std::vector<char> cmd_string(cmd_ptr + 2, cmd_ptr + strlen(cmd_ptr) + 1);
/* Parse SQL command and populate the change_master struct */ /* Parse SQL command and populate the change_master struct */
ChangeMasterOptions new_options;
if (blr_parse_change_master_command(&cmd_string.front(), if (blr_parse_change_master_command(&cmd_string.front(),
error, error,
&change_master) != 0) &new_options) != 0)
{ {
MXS_ERROR("%s CHANGE MASTER TO parse error: %s", MXS_ERROR("%s CHANGE MASTER TO parse error: %s",
router->service->name, router->service->name,
@ -4265,67 +4263,12 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
return -1; return -1;
} }
/* Abort if MASTER_USE_GTID is in use and ChangeMasterConfig new_config;
* router->mariadb10_master_gtid is not set if (!new_options.validate(router, error, &new_config))
*/
if (!router->mariadb10_master_gtid && !change_master.use_mariadb10_gtid.empty())
{ {
snprintf(error,
BINLOG_ERROR_MSG_LEN,
"Cannot use MASTER_USE_GTID. "
"Enable 'mariadb10_master_gtid' option first.");
MXS_ERROR("%s: %s", router->service->name, error);
return -1; return -1;
} }
/**
* Handle connection options
*/
int h_val = -1;
auto& master_heartbeat = change_master.heartbeat_period;
if (!master_heartbeat.empty())
{
h_val = (int)strtol(master_heartbeat.c_str(), NULL, 10);
if (h_val < 0 ||
(errno == ERANGE) ||
h_val > BLR_HEARTBEAT_MAX_INTERVAL)
{
snprintf(error,
BINLOG_ERROR_MSG_LEN,
"The requested value for the heartbeat period is "
"either negative or exceeds the maximum allowed "
"(%d seconds).",
BLR_HEARTBEAT_MAX_INTERVAL);
MXS_ERROR("%s: %s", router->service->name, error);
return -1;
}
}
int r_val = -1;
auto& master_connect_retry = change_master.connect_retry;
if (!master_connect_retry.empty())
{
r_val = (int)strtol(master_connect_retry.c_str(), NULL, 10);
if (r_val <= 0 ||
(errno == ERANGE))
{
snprintf(error,
BINLOG_ERROR_MSG_LEN,
"The requested value for MASTER_CONNECT_RETRY "
"interval is not valid: %s.",
master_connect_retry.c_str());
MXS_ERROR("%s: %s", router->service->name, error);
return -1;
}
}
MasterServerConfig current_master; MasterServerConfig current_master;
spinlock_acquire(&router->lock); spinlock_acquire(&router->lock);
@ -4334,42 +4277,42 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
blr_master_get_config(router, &current_master); blr_master_get_config(router, &current_master);
/* Change the heartbeat */ /* Change the heartbeat */
if (h_val != -1) if (new_config.heartbeat_period != -1)
{ {
if (h_val == 0) if (new_config.heartbeat_period == 0)
{ {
blr_log_disabled_heartbeat(router); blr_log_disabled_heartbeat(router);
} }
router->heartbeat = h_val; router->heartbeat = new_config.heartbeat_period;
} }
/* Change the connect retry */ /* Change the connect retry */
if (r_val != -1) if (new_config.connect_retry != -1)
{ {
router->retry_interval = r_val; router->retry_interval = new_config.connect_retry;
} }
/* Change the replication user */ /* Change the replication user */
blr_set_master_user(router, change_master.user); blr_set_master_user(router, new_config.user);
/* Change the replication password */ /* Change the replication password */
blr_set_master_password(router, change_master.password); blr_set_master_password(router, new_config.password);
/* Change the master name/address */ /* Change the master name/address */
blr_set_master_hostname(router, change_master.host); blr_set_master_hostname(router, new_config.host);
/* Change the master port */ /* Change the master port */
blr_set_master_port(router, change_master.port); blr_set_master_port(router, new_config.port);
/* Handle SSL options */ /* Handle SSL options */
int ssl_error; int ssl_error;
ssl_error = blr_set_master_ssl(router, change_master, error); ssl_error = blr_set_master_ssl(router, new_config, error);
if (ssl_error != -1 && if (ssl_error != -1 &&
// No CA cert is defined or only one of CERT or KEY is defined // No CA cert is defined or only one of CERT or KEY is defined
(change_master.ssl_ca.empty() || change_master.ssl_cert.empty() != change_master.ssl_key.empty()) (new_config.ssl_ca.empty() || new_config.ssl_cert.empty() != new_config.ssl_key.empty())
{ {
if (!change_master.ssl_enabled.empty() && atoi(change_master.ssl_enabled.c_str())) if (!new_config.ssl_enabled.empty() && atoi(new_config.ssl_enabled.c_str()))
{ {
snprintf(error, snprintf(error,
BINLOG_ERROR_MSG_LEN, BINLOG_ERROR_MSG_LEN,
@ -4399,14 +4342,14 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
*/ */
char *master_logfile = NULL; char *master_logfile = NULL;
if (!blr_binlog_change_check(router, if (!blr_binlog_change_check(router,
change_master, new_config,
error) || error) ||
!blr_change_binlog_name(router, !blr_change_binlog_name(router,
change_master.binlog_file, new_config.binlog_file,
&master_logfile, &master_logfile,
error) || error) ||
!blr_apply_changes(router, !blr_apply_changes(router,
change_master, new_config,
master_logfile, master_logfile,
error)) error))
{ {
@ -4421,7 +4364,7 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
} }
/* Log config changes (without passwords) */ /* Log config changes (without passwords) */
blr_log_config_changes(router, current_master, change_master); blr_log_config_changes(router, current_master, new_config);
MXS_FREE(master_logfile); MXS_FREE(master_logfile);
@ -4474,34 +4417,22 @@ static int blr_set_master_hostname(ROUTER_INSTANCE *router, const std::string& h
* @return 1 for applied change, 0 otherwise * @return 1 for applied change, 0 otherwise
*/ */
static int blr_set_master_port(ROUTER_INSTANCE *router, const char *port) static int blr_set_master_port(ROUTER_INSTANCE *router, int port)
{ {
unsigned short new_port; if (port > 0)
if (port != NULL)
{ {
new_port = atoi(port); server_update_port(router->service->dbref->server, port);
if (new_port) MXS_INFO("%s: New MASTER_PORT is [%i]",
{ router->service->name,
server_update_port(router->service->dbref->server, new_port); router->service->dbref->server->port);
MXS_INFO("%s: New MASTER_PORT is [%i]", return 1;
router->service->name,
router->service->dbref->server->port);
return 1;
}
} }
return 0; return 0;
} }
static int blr_set_master_port(ROUTER_INSTANCE *router, const std::string& port)
{
return blr_set_master_port(router, port.empty() ? nullptr : port.c_str());
}
/* /*
* Set new master binlog file * Set new master binlog file
* *
@ -6122,7 +6053,7 @@ blr_slave_send_heartbeat(ROUTER_INSTANCE *router, ROUTER_SLAVE *slave)
*/ */
static int static int
blr_set_master_ssl(ROUTER_INSTANCE *router, blr_set_master_ssl(ROUTER_INSTANCE *router,
const ChangeMasterOptions& config, const ChangeMasterConfig& config,
char *error_message) char *error_message)
{ {
SSL_LISTENER *server_ssl = NULL; SSL_LISTENER *server_ssl = NULL;
@ -8976,19 +8907,27 @@ blr_purge_binary_logs(ROUTER_INSTANCE *router,
*/ */
static void blr_log_config_changes(ROUTER_INSTANCE *router, static void blr_log_config_changes(ROUTER_INSTANCE *router,
const MasterServerConfig& current_master, const MasterServerConfig& current_master,
const ChangeMasterOptions& change_master) const ChangeMasterConfig& change_master)
{ {
/* Prepare heartbeat and retry msgs */ /* Prepare heartbeat and retry msgs */
static const char heartbeat[] = ", MASTER_HEARTBEAT_PERIOD="; static const char heartbeat[] = ", MASTER_HEARTBEAT_PERIOD=";
static const char retry[] = ", MASTER_CONNECT_RETRY="; static const char retry[] = ", MASTER_CONNECT_RETRY=";
int h_len = change_master.heartbeat_period.length(); std::string h;
int r_len = change_master.connect_retry.length(); if (change_master.heartbeat_period != -1)
char heartbeat_msg[sizeof(heartbeat) + h_len]; {
char retry_msg[sizeof(retry) + r_len]; h = std::to_string(change_master.heartbeat_period);
}
std::string r;
if (change_master.connect_retry != -1)
{
r = std::to_string(change_master.connect_retry);
}
char heartbeat_msg[sizeof(heartbeat) + h.length()];
char retry_msg[sizeof(retry) + r.length()];
heartbeat_msg[0] = 0; heartbeat_msg[0] = 0;
retry_msg[0] = 0; retry_msg[0] = 0;
if (h_len) if (!h.empty())
{ {
sprintf(heartbeat_msg, sprintf(heartbeat_msg,
"%s%lu", "%s%lu",
@ -8996,7 +8935,7 @@ static void blr_log_config_changes(ROUTER_INSTANCE *router,
router->heartbeat); // Display the current "long" value router->heartbeat); // Display the current "long" value
} }
if (r_len) if (!r.empty())
{ {
sprintf(retry_msg, sprintf(retry_msg,
"%s%d", "%s%d",
@ -9179,7 +9118,7 @@ static void blr_slave_abort_dump_request(ROUTER_SLAVE *slave,
* @return True if binlog can be changed or false. * @return True if binlog can be changed or false.
*/ */
static bool blr_binlog_change_check(const ROUTER_INSTANCE *router, static bool blr_binlog_change_check(const ROUTER_INSTANCE *router,
const ChangeMasterOptions& change_master, const ChangeMasterConfig& change_master,
char *error) char *error)
{ {
char *master_logfile = NULL; char *master_logfile = NULL;
@ -9322,7 +9261,7 @@ static bool blr_change_binlog_name(ROUTER_INSTANCE *router,
* or false on errors. * or false on errors.
*/ */
static bool blr_apply_changes(ROUTER_INSTANCE *router, static bool blr_apply_changes(ROUTER_INSTANCE *router,
const ChangeMasterOptions& change_master, const ChangeMasterConfig& change_master,
char *new_logfile, char *new_logfile,
char *error) char *error)
{ {