MXS-1156: MASTER_CONNECT_RETRY is a new option for CHANGE MASTER TO

MXS-1156: MASTER_CONNECT_RETRY is a new option for CHANGE MASTER TO.

The ‘connect_retry’, ‘master_retry_count’ options are now in use for
both service and
router_options.
This commit is contained in:
MassimilianoPinto 2017-08-30 16:45:16 +02:00
parent 42833386f5
commit e1efb91ea5
4 changed files with 173 additions and 50 deletions

View File

@ -142,6 +142,8 @@ 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;
@ -375,19 +377,21 @@ createInstance(SERVICE *service, char **options)
inst->mariadb10_compat = config_get_bool(params, "mariadb10-compatibility");
inst->maxwell_compat = config_get_bool(params, "maxwell-compatibility");
inst->trx_safe = config_get_bool(params, "transaction_safety");
inst->fileroot = config_copy_string(params, "filestem");
/* Server id */
inst->serverid = config_get_integer(params, "server_id");
/* Identity options */
inst->set_master_version = config_copy_string(params, "master_version");
inst->set_master_hostname = config_copy_string(params, "master_hostname");
inst->set_slave_hostname = config_copy_string(params, "slave_hostname");
inst->fileroot = config_copy_string(params, "filestem");
inst->serverid = config_get_integer(params, "server_id");
inst->set_master_server_id = inst->serverid != 0;
inst->masterid = config_get_integer(params, "master_id");
inst->set_master_server_id = inst->masterid != 0;
inst->master_uuid = config_copy_string(params, "master_uuid");
inst->set_master_uuid = inst->master_uuid != NULL;
/* Slave Heartbeat */
inst->send_slave_heartbeat = config_get_bool(params, "send_slave_heartbeat");
/* Semi-Sync support */
@ -662,16 +666,17 @@ createInstance(SERVICE *service, char **options)
}
else
{
if (h_val == 0)
{
MXS_WARNING("%s: %s",
inst->service->name,
"MASTER_HEARTBEAT_PERIOD has been set to 0 (disabled): "
"a master network inactivity will not be handled.");
}
inst->heartbeat = h_val;
}
}
else if (strcmp(options[i], "connect_retry") == 0)
{
inst->retry_interval = atoi(value);
}
else if (strcmp(options[i], "master_retry_count") == 0)
{
inst->retry_limit = atoi(value);
}
else if (strcmp(options[i], "send_slave_heartbeat") == 0)
{
inst->send_slave_heartbeat = config_truth_value(value);
@ -683,21 +688,12 @@ createInstance(SERVICE *service, char **options)
}
else if (strcmp(options[i], "ssl_cert_verification_depth") == 0)
{
int new_depth = atoi(value);
if (new_depth > 0)
{
inst->ssl_cert_verification_depth = new_depth;
}
else
{
MXS_WARNING("Invalid Master ssl_cert_verification_depth %s."
" Setting it to default value %i.",
value, inst->ssl_cert_verification_depth);
}
inst->ssl_cert_verification_depth = atoi(value);
}
else
{
MXS_WARNING("Unsupported router option %s for binlog router.",
MXS_WARNING("%s: unsupported router option %s for binlog router.",
service->name,
options[i]);
}
}
@ -718,6 +714,49 @@ createInstance(SERVICE *service, char **options)
inst->set_master_server_id = true;
}
/* Check ssl_cert_verification_depth option */
if (inst->ssl_cert_verification_depth < 0)
{
MXS_ERROR("%s: invalid Master ssl_cert_verification_depth %s."
" Setting it to default value %i.",
service->name,
value,
inst->ssl_cert_verification_depth);
free_instance(inst);
return NULL;
}
/* Check master connect options */
if (inst->heartbeat < 0)
{
MXS_ERROR("%s: invalid 'heartbeat' value.",
service->name);
free_instance(inst);
return NULL;
}
if (inst->heartbeat == 0)
{
blr_log_disabled_heartbeat(inst);
}
if (inst->retry_interval <= 0)
{
MXS_ERROR("%s: invalid 'connect_retry' value.",
service->name);
free_instance(inst);
return NULL;
}
if (inst->retry_limit <= 0)
{
MXS_ERROR("%s: invalid 'master_retry_count' value.",
service->name);
free_instance(inst);
return NULL;
}
/* Check BinlogDir option */
if ((inst->binlogdir == NULL) ||
(inst->binlogdir != NULL &&
!strlen(inst->binlogdir)))
@ -730,7 +769,7 @@ createInstance(SERVICE *service, char **options)
if (inst->serverid <= 0)
{
MXS_ERROR("Service %s, server-id is not configured. "
MXS_ERROR("Service %s, server_id is not configured. "
"Please configure it with a unique positive "
"integer value (1..2^32-1)",
service->name);
@ -2010,6 +2049,9 @@ static json_t* diagnostics_json(const MXS_ROUTER *router)
json_object_set_new(rval, "binlogdir", json_string(router_inst->binlogdir));
json_object_set_new(rval, "heartbeat", json_integer(router_inst->heartbeat));
json_object_set_new(rval, "master_retry_interval", json_integer(router_inst->retry_interval));
json_object_set_new(rval, "master_retry_limit", json_integer(router_inst->retry_limit));
json_object_set_new(rval, "master_retries", json_integer(router_inst->retry_count));
json_object_set_new(rval, "master_starts", json_integer(router_inst->stats.n_masterstarts));
json_object_set_new(rval, "master_reconnects", json_integer(router_inst->stats.n_delayedreconnects));
json_object_set_new(rval, "binlog_name", json_string(router_inst->binlog_name));
@ -2067,9 +2109,11 @@ static json_t* diagnostics_json(const MXS_ROUTER *router)
if (!router_inst->mariadb10_compat)
{
json_object_set_new(rval, "latest_event_type", json_string(
(router_inst->lastEventReceived <= MAX_EVENT_TYPE) ?
event_names[router_inst->lastEventReceived] : "unknown"));
json_object_set_new(rval,
"latest_event_type",
json_string((router_inst->lastEventReceived <= MAX_EVENT_TYPE) ?
event_names[router_inst->lastEventReceived] :
"unknown"));
}
else
{
@ -2816,8 +2860,8 @@ blr_handle_config_item(const char *name, const char *value, ROUTER_INSTANCE *ins
{
if (listener_set_ssl_version(backend_server->server_ssl, (char *)value) != 0)
{
MXS_ERROR("Unknown parameter value for 'ssl_version' for"
" service '%s': %s",
MXS_ERROR("Found unknown optional parameter value for 'ssl_version' for"
" service '%s': %s, ignoring it.",
inst->service->name,
value);
}
@ -2830,7 +2874,37 @@ blr_handle_config_item(const char *name, const char *value, ROUTER_INSTANCE *ins
/* Connect options */
else if (strcmp(name, "master_heartbeat_period") == 0)
{
inst->heartbeat = atol((char*)value);
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
{
@ -3328,3 +3402,11 @@ static bool blr_open_gtid_maps_storage(ROUTER_INSTANCE *inst)
return true;
}
void blr_log_disabled_heartbeat(const ROUTER_INSTANCE *inst)
{
MXS_WARNING("%s: %s",
inst->service->name,
"MASTER_HEARTBEAT_PERIOD has been set to 0 (disabled): "
"a master network inactivity will not be handled.");
}

View File

@ -3169,6 +3169,7 @@ blr_file_write_master_config(ROUTER_INSTANCE *router, char *error)
/* Connect options */
fprintf(config_file, "master_heartbeat_period=%lu\n", router->heartbeat);
fprintf(config_file, "master_connect_retry=%d\n", router->retry_interval);
fclose(config_file);

View File

@ -2923,8 +2923,6 @@ static void blr_register_cache_response(ROUTER_INSTANCE *router,
*/
static void blr_start_master_registration(ROUTER_INSTANCE *router, GWBUF *buf)
{
char task_name[BLRM_TASK_NAME_LEN + 1] = "";
switch (router->master_state)
{
case BLRM_TIMESTAMP:
@ -3232,6 +3230,7 @@ static void blr_start_master_registration(ROUTER_INSTANCE *router, GWBUF *buf)
*/
if (router->heartbeat > 0)
{
char task_name[BLRM_TASK_NAME_LEN + 1] = "";
snprintf(task_name,
BLRM_TASK_NAME_LEN,
"%s heartbeat",

View File

@ -354,7 +354,7 @@ static int binary_logs_find_file_cb(void *data,
static void blr_log_config_changes(ROUTER_INSTANCE *router,
MASTER_SERVER_CFG *current_master,
CHANGE_MASTER_OPTIONS *change_master);
extern void blr_log_disabled_heartbeat(const ROUTER_INSTANCE *inst);
/**
* Process a request packet from the slave server.
*
@ -3977,15 +3977,42 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
{
if (h_val == 0)
{
MXS_WARNING("%s: %s",
router->service->name,
"MASTER_HEARTBEAT_PERIOD has been set to 0 (disabled): "
"a master network inactivity will not be handled.");
blr_log_disabled_heartbeat(router);
}
router->heartbeat = h_val;
}
}
char *master_connect_retry = change_master.connect_retry;
if (master_connect_retry)
{
int h_val = (int)strtol(master_connect_retry, NULL, 10);
if (h_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);
MXS_ERROR("%s: %s", router->service->name, error);
/* restore previous master_host and master_port */
blr_master_restore_config(router, current_master);
blr_master_free_parsed_options(&change_master);
spinlock_release(&router->lock);
return -1;
}
else
{
router->retry_interval = h_val;
}
}
/* Set new binlog position from parsed SQL command */
master_log_pos = change_master.binlog_pos;
if (master_log_pos == NULL)
@ -8958,21 +8985,34 @@ static void blr_log_config_changes(ROUTER_INSTANCE *router,
MASTER_SERVER_CFG *current_master,
CHANGE_MASTER_OPTIONS *change_master)
{
/* Prepare heartbeat msg */
int len = change_master->heartbeat_period ?
strlen(change_master->heartbeat_period) :
0;
char heartbeat_msg[strlen("MASTER_HEARTBEAT_PERIOD=") + len + 1];
/* Prepare heartbeat and retry msgs */
static const char heartbeat[] = ", MASTER_HEARTBEAT_PERIOD=";
static const char retry[] = ", MASTER_CONNECT_RETRY=";
int h_len = change_master->heartbeat_period ?
strlen(change_master->heartbeat_period) :
0;
int r_len = change_master->connect_retry ?
strlen(change_master->connect_retry) :
0;
char heartbeat_msg[sizeof(heartbeat) + h_len];
char retry_msg[sizeof(retry) + r_len];
heartbeat_msg[0] = 0;
retry_msg[0] = 0;
if (len)
if (h_len)
{
sprintf(heartbeat_msg,
"MASTER_HEARTBEAT_PERIOD=%lu",
"%s%lu",
heartbeat,
router->heartbeat); // Display the current "long" value
}
else
if (r_len)
{
heartbeat_msg[0] = 0;
sprintf(retry_msg,
"%s%d",
retry,
router->retry_interval); // Display the current "long" value
}
/* Prepare GTID msg */
@ -8987,7 +9027,7 @@ static void blr_log_config_changes(ROUTER_INSTANCE *router,
"New state is MASTER_HOST='%s', MASTER_PORT=%i, "
"MASTER_LOG_FILE='%s', MASTER_LOG_POS=%lu, "
"MASTER_USER='%s'"
"%s, %s",
"%s%s%s",
router->service->name,
current_master->host,
current_master->port,
@ -9000,5 +9040,6 @@ static void blr_log_config_changes(ROUTER_INSTANCE *router,
router->current_pos,
router->user,
gtid_msg,
heartbeat_msg);
heartbeat_msg,
retry_msg);
}