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); int h_val = (int)strtol(value, NULL, 10);
if (h_val <= 0 || if (h_val < 0 ||
(errno == ERANGE) || (errno == ERANGE) ||
h_val > BLR_HEARTBEAT_MAX_INTERVAL) h_val > BLR_HEARTBEAT_MAX_INTERVAL)
{ {
@ -658,6 +658,13 @@ createInstance(SERVICE *service, char **options)
} }
else 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; inst->heartbeat = h_val;
} }
} }
@ -1570,8 +1577,9 @@ diagnostics(MXS_ROUTER *router, DCB *dcb)
dcb_printf(dcb, "\tBinlog directory: %s\n", dcb_printf(dcb, "\tBinlog directory: %s\n",
router_inst->binlogdir); router_inst->binlogdir);
dcb_printf(dcb, "\tHeartbeat period (seconds): %lu\n", dcb_printf(dcb, "\tHeartbeat period (seconds): %lu%s\n",
router_inst->heartbeat); router_inst->heartbeat,
router_inst->heartbeat ? "" : "(disabled)");
dcb_printf(dcb, "\tNumber of master connects: %d\n", dcb_printf(dcb, "\tNumber of master connects: %d\n",
router_inst->stats.n_masterstarts); router_inst->stats.n_masterstarts);
dcb_printf(dcb, "\tNumber of delayed reconnects: %d\n", 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_notify_waiting_slave(ROUTER_SLAVE *slave);
extern bool blr_save_mariadb_gtid(ROUTER_INSTANCE *inst); extern bool blr_save_mariadb_gtid(ROUTER_INSTANCE *inst);
static void blr_register_serverid(ROUTER_INSTANCE *router, GWBUF *buf); 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_setchecksum(ROUTER_INSTANCE *router, GWBUF *buf);
static void blr_register_getchecksum(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); 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 * Handles previous reply from Master and sends
* SET @master_heartbeat_period to master * SET @master_heartbeat_period to master
* *
* The statement is sent only if router->heartbeat > 0
*
* @param router Current router instance * @param router Current router instance
* @param buf GWBUF with server reply to previous * @param buf GWBUF with server reply to previous
* registration command * 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 query[BLRM_SET_HEARTBEAT_QUERY_LEN];
char *val = blr_extract_column(buf, 2); char *val = blr_extract_column(buf, 2);
@ -2359,11 +2363,17 @@ static void blr_register_heartbeat(ROUTER_INSTANCE *router, GWBUF *buf)
} }
MXS_FREE(val); MXS_FREE(val);
/* Send Heartbeat request ony if router->heartbeat is set */
if (router->heartbeat > 0)
{
// Prepare new registration message // Prepare new registration message
sprintf(query, sprintf(query,
"SET @master_heartbeat_period = %lu000000000", "SET @master_heartbeat_period = %lu000000000",
router->heartbeat); router->heartbeat);
blr_register_send_command(router, query, BLRM_HBPERIOD); 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) static void blr_register_setchecksum(ROUTER_INSTANCE *router, GWBUF *buf)
{ {
// Response from master should be stored /**
* Response from master (set heartbeat reply) should be stored
* only if router->heartbeat is set
*/
if (router->heartbeat > 0)
{
blr_register_cache_response(router, blr_register_cache_response(router,
&router->saved_master.heartbeat, &router->saved_master.heartbeat,
"heartbeat", "heartbeat",
buf); buf);
}
// New registration message // New registration message
blr_register_send_command(router, blr_register_send_command(router,
"SET @master_binlog_checksum =" "SET @master_binlog_checksum ="
@ -2858,8 +2875,11 @@ static void blr_start_master_registration(ROUTER_INSTANCE *router, GWBUF *buf)
router->retry_backoff = 1; router->retry_backoff = 1;
break; break;
case BLRM_SERVERID: case BLRM_SERVERID:
blr_register_heartbeat(router, buf); // If set heartbeat is not being sent, next state is BLRM_HBPERIOD
if (blr_register_heartbeat(router, buf))
{
break; break;
}
case BLRM_HBPERIOD: case BLRM_HBPERIOD:
blr_register_setchecksum(router, buf); blr_register_setchecksum(router, buf);
break; break;
@ -3146,6 +3166,8 @@ static void blr_start_master_registration(ROUTER_INSTANCE *router, GWBUF *buf)
/** /**
* Set heartbeat check task * Set heartbeat check task
*/ */
if (router->heartbeat > 0)
{
snprintf(task_name, snprintf(task_name,
BLRM_TASK_NAME_LEN, BLRM_TASK_NAME_LEN,
"%s heartbeat", "%s heartbeat",
@ -3154,6 +3176,7 @@ static void blr_start_master_registration(ROUTER_INSTANCE *router, GWBUF *buf)
blr_check_last_master_event, blr_check_last_master_event,
router, router,
router->heartbeat); router->heartbeat);
}
break; break;
} }

View File

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