Description:
Currently the logic to calc the Seconds_behind_master is as following.
current Seconds_Behind_Master
long time_diff= ((long)(time(0) - mi->rli->last_master_timestamp)
- mi->clock_diff_with_master);
How ever if the server is very idle, the value will become very large, which really combuse us, some monitor agent may relay on this value.
How to repeat:
n/a
Suggested fix:
We could record a time stamp of the queue_event call, such as:
/* XXX: 'synced' should be updated by queue_event to indicate
whether event has been synced to disk */
bool synced= 0;
if (queue_event(mi, event_buf, event_len))
{
mi->report(ERROR_LEVEL, ER_SLAVE_RELAY_LOG_WRITE_FAILURE,
ER(ER_SLAVE_RELAY_LOG_WRITE_FAILURE),
"could not queue event from master");
goto err;
}
/* if any event queued update the time */
mi->last_master_timestamp = time(0);
if (RUN_HOOK(binlog_relay_io, after_queue_event,
(thd, mi, event_buf, event_len, synced)))
{
Where mi->last_master_timestamp is a newly variables to hold the last call time of queue_event, then we change the seconds_behind_master logic as following in function show_slave_status
/*
long time_diff= ((long)(time(0) - mi->rli->last_master_timestamp)
- mi->clock_diff_with_master);
*/
long time_diff= ((long)(mi->last_master_timestamp - mi->rli->last_master_timestamp)
- mi->clock_diff_with_master);
I think this logic will be better current.
Description: Currently the logic to calc the Seconds_behind_master is as following. current Seconds_Behind_Master long time_diff= ((long)(time(0) - mi->rli->last_master_timestamp) - mi->clock_diff_with_master); How ever if the server is very idle, the value will become very large, which really combuse us, some monitor agent may relay on this value. How to repeat: n/a Suggested fix: We could record a time stamp of the queue_event call, such as: /* XXX: 'synced' should be updated by queue_event to indicate whether event has been synced to disk */ bool synced= 0; if (queue_event(mi, event_buf, event_len)) { mi->report(ERROR_LEVEL, ER_SLAVE_RELAY_LOG_WRITE_FAILURE, ER(ER_SLAVE_RELAY_LOG_WRITE_FAILURE), "could not queue event from master"); goto err; } /* if any event queued update the time */ mi->last_master_timestamp = time(0); if (RUN_HOOK(binlog_relay_io, after_queue_event, (thd, mi, event_buf, event_len, synced))) { Where mi->last_master_timestamp is a newly variables to hold the last call time of queue_event, then we change the seconds_behind_master logic as following in function show_slave_status /* long time_diff= ((long)(time(0) - mi->rli->last_master_timestamp) - mi->clock_diff_with_master); */ long time_diff= ((long)(mi->last_master_timestamp - mi->rli->last_master_timestamp) - mi->clock_diff_with_master); I think this logic will be better current.