MXS-1156: Disable heartbeat if value is set to 0

MXS-1156: Disable heartbeat if value is set to 0.

A warning log is written in maxscale log file when heartbeat is not set.
This commit is contained in:
MassimilianoPinto 2017-08-25 17:43:08 +02:00
parent 5b2cfac3cb
commit 0f5f9f8228
3 changed files with 64 additions and 26 deletions

View File

@ -647,7 +647,7 @@ createInstance(SERVICE *service, char **options)
{
int h_val = (int)strtol(value, NULL, 10);
if (h_val <= 0 ||
if (h_val < 0 ||
(errno == ERANGE) ||
h_val > BLR_HEARTBEAT_MAX_INTERVAL)
{
@ -658,6 +658,13 @@ 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;
}
}
@ -1570,8 +1577,9 @@ diagnostics(MXS_ROUTER *router, DCB *dcb)
dcb_printf(dcb, "\tBinlog directory: %s\n",
router_inst->binlogdir);
dcb_printf(dcb, "\tHeartbeat period (seconds): %lu\n",
router_inst->heartbeat);
dcb_printf(dcb, "\tHeartbeat period (seconds): %lu%s\n",
router_inst->heartbeat,
router_inst->heartbeat ? "" : "(disabled)");
dcb_printf(dcb, "\tNumber of master connects: %d\n",
router_inst->stats.n_masterstarts);
dcb_printf(dcb, "\tNumber of delayed reconnects: %d\n",

View File

@ -103,7 +103,7 @@ void blr_notify_all_slaves(ROUTER_INSTANCE *router);
extern bool blr_notify_waiting_slave(ROUTER_SLAVE *slave);
extern bool blr_save_mariadb_gtid(ROUTER_INSTANCE *inst);
static void blr_register_serverid(ROUTER_INSTANCE *router, GWBUF *buf);
static void blr_register_heartbeat(ROUTER_INSTANCE *router, GWBUF *buf);
static bool blr_register_heartbeat(ROUTER_INSTANCE *router, GWBUF *buf);
static void blr_register_setchecksum(ROUTER_INSTANCE *router, GWBUF *buf);
static void blr_register_getchecksum(ROUTER_INSTANCE *router, GWBUF *buf);
static void blr_register_handle_checksum(ROUTER_INSTANCE *router, GWBUF *buf);
@ -2328,11 +2328,15 @@ void blr_notify_all_slaves(ROUTER_INSTANCE *router)
* Handles previous reply from Master and sends
* SET @master_heartbeat_period to master
*
* The statement is sent only if router->heartbeat > 0
*
* @param router Current router instance
* @param buf GWBUF with server reply to previous
* registration command
* @return True if hearbeat request has been sent
* false otherwise (router->heartbeat = 0)
*/
static void blr_register_heartbeat(ROUTER_INSTANCE *router, GWBUF *buf)
static bool blr_register_heartbeat(ROUTER_INSTANCE *router, GWBUF *buf)
{
char query[BLRM_SET_HEARTBEAT_QUERY_LEN];
char *val = blr_extract_column(buf, 2);
@ -2359,11 +2363,17 @@ static void blr_register_heartbeat(ROUTER_INSTANCE *router, GWBUF *buf)
}
MXS_FREE(val);
// Prepare new registration message
sprintf(query,
"SET @master_heartbeat_period = %lu000000000",
router->heartbeat);
blr_register_send_command(router, query, BLRM_HBPERIOD);
/* Send Heartbeat request ony if router->heartbeat is set */
if (router->heartbeat > 0)
{
// Prepare new registration message
sprintf(query,
"SET @master_heartbeat_period = %lu000000000",
router->heartbeat);
blr_register_send_command(router, query, BLRM_HBPERIOD);
}
return router->heartbeat != 0;
}
/**
@ -2378,11 +2388,18 @@ static void blr_register_heartbeat(ROUTER_INSTANCE *router, GWBUF *buf)
*/
static void blr_register_setchecksum(ROUTER_INSTANCE *router, GWBUF *buf)
{
// Response from master should be stored
blr_register_cache_response(router,
&router->saved_master.heartbeat,
"heartbeat",
buf);
/**
* Response from master (set heartbeat reply) should be stored
* only if router->heartbeat is set
*/
if (router->heartbeat > 0)
{
blr_register_cache_response(router,
&router->saved_master.heartbeat,
"heartbeat",
buf);
}
// New registration message
blr_register_send_command(router,
"SET @master_binlog_checksum ="
@ -2858,8 +2875,11 @@ static void blr_start_master_registration(ROUTER_INSTANCE *router, GWBUF *buf)
router->retry_backoff = 1;
break;
case BLRM_SERVERID:
blr_register_heartbeat(router, buf);
break;
// If set heartbeat is not being sent, next state is BLRM_HBPERIOD
if (blr_register_heartbeat(router, buf))
{
break;
}
case BLRM_HBPERIOD:
blr_register_setchecksum(router, buf);
break;
@ -3146,14 +3166,17 @@ static void blr_start_master_registration(ROUTER_INSTANCE *router, GWBUF *buf)
/**
* Set heartbeat check task
*/
snprintf(task_name,
BLRM_TASK_NAME_LEN,
"%s heartbeat",
router->service->name);
hktask_add(task_name,
blr_check_last_master_event,
router,
router->heartbeat);
if (router->heartbeat > 0)
{
snprintf(task_name,
BLRM_TASK_NAME_LEN,
"%s heartbeat",
router->service->name);
hktask_add(task_name,
blr_check_last_master_event,
router,
router->heartbeat);
}
break;
}

View File

@ -3949,7 +3949,7 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
{
int h_val = (int)strtol(master_heartbeat, NULL, 10);
if (h_val <= 0 ||
if (h_val < 0 ||
(errno == ERANGE) ||
h_val > BLR_HEARTBEAT_MAX_INTERVAL)
{
@ -3973,6 +3973,13 @@ int blr_handle_change_master(ROUTER_INSTANCE* router,
}
else
{
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.");
}
router->heartbeat = h_val;
}
}