Mysqlmon formatting changes

Fixed indentation, bracket alignment and other minor things.
This commit is contained in:
Markus Makela
2015-11-16 13:14:34 +02:00
parent 1bd16db593
commit f3a4bedbf5

View File

@ -106,8 +106,7 @@ version()
void
ModuleInit()
{
LOGIF(LM, (skygw_log_write(
LOGFILE_MESSAGE,
LOGIF(LM, (skygw_log_write(LOGFILE_MESSAGE,
"Initialise the MySQL Monitor module %s.",
version_str)));
}
@ -300,7 +299,8 @@ static inline void monitor_mysql100_db(MONITOR_SERVERS* database)
{
/* get Slave_IO_Running and Slave_SQL_Running values*/
if (strncmp(row[12], "Yes", 3) == 0
&& strncmp(row[13], "Yes", 3) == 0) {
&& strncmp(row[13], "Yes", 3) == 0)
{
isslave += 1;
}
@ -309,7 +309,8 @@ static inline void monitor_mysql100_db(MONITOR_SERVERS* database)
* root master server.
* Please note, there could be no slaves at all if Slave_SQL_Running == 'No'
*/
if (strncmp(row[12], "Yes", 3) == 0) {
if (strncmp(row[12], "Yes", 3) == 0)
{
/* get Master_Server_Id values */
master_id = atol(row[41]);
if (master_id == 0)
@ -325,10 +326,14 @@ static inline void monitor_mysql100_db(MONITOR_SERVERS* database)
/* If all configured slaves are running set this node as slave */
if (isslave > 0 && isslave == i)
{
isslave = 1;
}
else
{
isslave = 0;
}
}
/* Remove addition info */
monitor_clear_pending_status(database, SERVER_SLAVE_OF_EXTERNAL_MASTER);
@ -344,7 +349,9 @@ static inline void monitor_mysql100_db(MONITOR_SERVERS* database)
monitor_set_pending_status(database, SERVER_SLAVE);
/* Avoid any possible stale Master state */
monitor_clear_pending_status(database, SERVER_MASTER);
} else {
}
else
{
/* Avoid any possible Master/Slave stale state */
monitor_clear_pending_status(database, SERVER_SLAVE);
monitor_clear_pending_status(database, SERVER_MASTER);
@ -374,7 +381,8 @@ static inline void monitor_mysql55_db(MONITOR_SERVERS* database)
{
/* get Slave_IO_Running and Slave_SQL_Running values*/
if (strncmp(row[10], "Yes", 3) == 0
&& strncmp(row[11], "Yes", 3) == 0) {
&& strncmp(row[11], "Yes", 3) == 0)
{
isslave = 1;
}
@ -383,7 +391,8 @@ static inline void monitor_mysql55_db(MONITOR_SERVERS* database)
* root master server.
* Please note, there could be no slaves at all if Slave_SQL_Running == 'No'
*/
if (strncmp(row[10], "Yes", 3) == 0) {
if (strncmp(row[10], "Yes", 3) == 0)
{
/* get Master_Server_Id values */
master_id = atol(row[39]);
if (master_id == 0)
@ -410,7 +419,9 @@ static inline void monitor_mysql55_db(MONITOR_SERVERS* database)
monitor_set_pending_status(database, SERVER_SLAVE);
/* Avoid any possible stale Master state */
monitor_clear_pending_status(database, SERVER_MASTER);
} else {
}
else
{
/* Avoid any possible Master/Slave stale state */
monitor_clear_pending_status(database, SERVER_SLAVE);
monitor_clear_pending_status(database, SERVER_MASTER);
@ -440,7 +451,8 @@ static inline void monitor_mysql51_db(MONITOR_SERVERS* database)
{
/* get Slave_IO_Running and Slave_SQL_Running values*/
if (strncmp(row[10], "Yes", 3) == 0
&& strncmp(row[11], "Yes", 3) == 0) {
&& strncmp(row[11], "Yes", 3) == 0)
{
isslave = 1;
}
}
@ -461,7 +473,9 @@ static inline void monitor_mysql51_db(MONITOR_SERVERS* database)
monitor_set_pending_status(database, SERVER_SLAVE);
/* Avoid any possible stale Master state */
monitor_clear_pending_status(database, SERVER_MASTER);
} else {
}
else
{
/* Avoid any possible Master/Slave stale state */
monitor_clear_pending_status(database, SERVER_SLAVE);
monitor_clear_pending_status(database, SERVER_MASTER);
@ -560,6 +574,7 @@ static MONITOR_SERVERS *build_mysql51_replication_tree(MONITOR *mon)
}
return rval;
}
/**
* Monitor an individual server
*
@ -730,8 +745,7 @@ detect_stale_master = handle->detectStaleMaster;
if (mysql_thread_init())
{
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"Fatal : mysql_thread_init failed in monitor "
"module. Exiting.\n")));
return;
@ -787,7 +801,8 @@ detect_stale_master = handle->detectStaleMaster;
monitorDatabase(mon, ptr);
/* reset the slave list of current node */
if (ptr->server->slaves) {
if (ptr->server->slaves)
{
free(ptr->server->slaves);
}
/* create a new slave list */
@ -800,8 +815,7 @@ detect_stale_master = handle->detectStaleMaster;
if (SRV_MASTER_STATUS(ptr->mon_prev_status))
{
/** Master failed, can't recover */
LOGIF(LM, (skygw_log_write(
LOGFILE_MESSAGE,
LOGIF(LM, (skygw_log_write(LOGFILE_MESSAGE,
"Server %s:%d lost the master status.",
ptr->server->name,
ptr->server->port)));
@ -827,15 +841,13 @@ detect_stale_master = handle->detectStaleMaster;
if (mon_status_changed(ptr))
{
#if defined(SS_DEBUG)
LOGIF(LT, (skygw_log_write_flush(
LOGFILE_TRACE,
LOGIF(LT, (skygw_log_write_flush(LOGFILE_TRACE,
"Backend server %s:%d state : %s",
ptr->server->name,
ptr->server->port,
STRSRVSTATUS(ptr->server))));
#else
LOGIF(LD, (skygw_log_write_flush(
LOGFILE_DEBUG,
LOGIF(LD, (skygw_log_write_flush(LOGFILE_DEBUG,
"Backend server %s:%d state : %s",
ptr->server->name,
ptr->server->port,
@ -859,8 +871,10 @@ detect_stale_master = handle->detectStaleMaster;
ptr = mon->databases;
/* if only one server is configured, that's is Master */
if (num_servers == 1) {
if (SERVER_IS_RUNNING(ptr->server)) {
if (num_servers == 1)
{
if (SERVER_IS_RUNNING(ptr->server))
{
ptr->server->depth = 0;
/* status cleanup */
monitor_clear_pending_status(ptr, SERVER_SLAVE);
@ -872,7 +886,9 @@ detect_stale_master = handle->detectStaleMaster;
handle->master = ptr;
root_master = ptr;
}
} else {
}
else
{
/* Compute the replication tree */
if (handle->mysql51_replication)
root_master = build_mysql51_replication_tree(mon);
@ -886,7 +902,8 @@ detect_stale_master = handle->detectStaleMaster;
ptr = mon->databases;
while (ptr)
{
if (! SERVER_IN_MAINT(ptr->server)) {
if (!SERVER_IN_MAINT(ptr->server))
{
/* If "detect_stale_master" option is On, let's use the previus master */
if (detect_stale_master &&
root_master &&
@ -902,9 +919,9 @@ detect_stale_master = handle->detectStaleMaster;
server_set_status(ptr->server, SERVER_STALE_STATUS);
/* log it once */
if (mon_status_changed(ptr)) {
LOGIF(LM, (skygw_log_write_flush(
LOGFILE_MESSAGE,
if (mon_status_changed(ptr))
{
LOGIF(LM, (skygw_log_write_flush(LOGFILE_MESSAGE,
"[mysql_mon]: root server "
"[%s:%i] is no longer Master,"
" let's use it again even "
@ -913,7 +930,9 @@ detect_stale_master = handle->detectStaleMaster;
ptr->server->name,
ptr->server->port)));
}
} else {
}
else
{
ptr->server->status = ptr->pending_status;
}
}
@ -948,29 +967,31 @@ detect_stale_master = handle->detectStaleMaster;
mon_status_changed(root_master) &&
!(root_master->server->status & SERVER_STALE_STATUS))
{
if (root_master->pending_status & (SERVER_MASTER) && SERVER_IS_RUNNING(root_master->server)) {
if (root_master->pending_status & (SERVER_MASTER) && SERVER_IS_RUNNING(root_master->server))
{
if (!(root_master->mon_prev_status & SERVER_STALE_STATUS) &&
!(root_master->server->status & SERVER_MAINT))
{
LOGIF(LM, (skygw_log_write(
LOGFILE_MESSAGE,
LOGIF(LM, (skygw_log_write(LOGFILE_MESSAGE,
"Info : A Master Server is now available: %s:%i",
root_master->server->name,
root_master->server->port)));
}
} else {
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
}
else
{
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"Error : No Master can be determined. Last known was %s:%i",
root_master->server->name,
root_master->server->port)));
}
log_no_master = 1;
} else {
}
else
{
if (!root_master && log_no_master)
{
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"Error : No Master can be determined")));
log_no_master = 0;
}
@ -985,7 +1006,8 @@ detect_stale_master = handle->detectStaleMaster;
set_master_heartbeat(handle, root_master);
ptr = mon->databases;
while (ptr) {
while (ptr)
{
if ((!SERVER_IN_MAINT(ptr->server)) && SERVER_IS_RUNNING(ptr->server))
{
if (ptr->server->node_id != root_master->server->node_id &&
@ -1050,12 +1072,14 @@ MYSQL_MONITOR *handle = (MYSQL_MONITOR *)arg;
* @return The server with the required server_id
*/
static MONITOR_SERVERS *
getServerByNodeId(MONITOR_SERVERS *ptr, long node_id) {
getServerByNodeId(MONITOR_SERVERS *ptr, long node_id)
{
SERVER *current;
while (ptr)
{
current = ptr->server;
if (current->node_id == node_id) {
if (current->node_id == node_id)
{
return ptr;
}
ptr = ptr->next;
@ -1071,12 +1095,14 @@ getServerByNodeId(MONITOR_SERVERS *ptr, long node_id) {
* @return The slave server of this node_id
*/
static MONITOR_SERVERS *
getSlaveOfNodeId(MONITOR_SERVERS *ptr, long node_id) {
getSlaveOfNodeId(MONITOR_SERVERS *ptr, long node_id)
{
SERVER *current;
while (ptr)
{
current = ptr->server;
if (current->master_id == node_id) {
if (current->master_id == node_id)
{
return ptr;
}
ptr = ptr->next;
@ -1092,24 +1118,25 @@ getSlaveOfNodeId(MONITOR_SERVERS *ptr, long node_id) {
* @param handle The monitor handle
* @param database The number database server
*/
static void set_master_heartbeat(MYSQL_MONITOR *handle, MONITOR_SERVERS *database) {
static void set_master_heartbeat(MYSQL_MONITOR *handle, MONITOR_SERVERS *database)
{
unsigned long id = handle->id;
time_t heartbeat;
time_t purge_time;
char heartbeat_insert_query[512] = "";
char heartbeat_purge_query[512] = "";
if (handle->master == NULL) {
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
if (handle->master == NULL)
{
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"[mysql_mon]: set_master_heartbeat called without an available Master server")));
return;
}
/* create the maxscale_schema database */
if (mysql_query(database->con, "CREATE DATABASE IF NOT EXISTS maxscale_schema")) {
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
if (mysql_query(database->con, "CREATE DATABASE IF NOT EXISTS maxscale_schema"))
{
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"[mysql_mon]: Error creating maxscale_schema database in Master server"
": %s", mysql_error(database->con))));
@ -1123,9 +1150,9 @@ static void set_master_heartbeat(MYSQL_MONITOR *handle, MONITOR_SERVERS *databas
"master_server_id INT NOT NULL, "
"master_timestamp INT UNSIGNED NOT NULL, "
"PRIMARY KEY ( master_server_id, maxscale_id ) ) "
"ENGINE=MYISAM DEFAULT CHARSET=latin1")) {
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
"ENGINE=MYISAM DEFAULT CHARSET=latin1"))
{
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"[mysql_mon]: Error creating maxscale_schema.replication_heartbeat table in Master server"
": %s", mysql_error(database->con))));
@ -1137,9 +1164,9 @@ static void set_master_heartbeat(MYSQL_MONITOR *handle, MONITOR_SERVERS *databas
sprintf(heartbeat_purge_query, "DELETE FROM maxscale_schema.replication_heartbeat WHERE master_timestamp < %lu", purge_time);
if (mysql_query(database->con, heartbeat_purge_query)) {
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
if (mysql_query(database->con, heartbeat_purge_query))
{
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"[mysql_mon]: Error deleting from maxscale_schema.replication_heartbeat table: [%s], %s",
heartbeat_purge_query,
mysql_error(database->con))));
@ -1153,43 +1180,48 @@ static void set_master_heartbeat(MYSQL_MONITOR *handle, MONITOR_SERVERS *databas
sprintf(heartbeat_insert_query, "UPDATE maxscale_schema.replication_heartbeat SET master_timestamp = %lu WHERE master_server_id = %li AND maxscale_id = %lu", heartbeat, handle->master->server->node_id, id);
/* Try to insert MaxScale timestamp into master */
if (mysql_query(database->con, heartbeat_insert_query)) {
if (mysql_query(database->con, heartbeat_insert_query))
{
database->server->rlag = -1;
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"[mysql_mon]: Error updating maxscale_schema.replication_heartbeat table: [%s], %s",
heartbeat_insert_query,
mysql_error(database->con))));
} else {
if (mysql_affected_rows(database->con) == 0) {
}
else
{
if (mysql_affected_rows(database->con) == 0)
{
heartbeat = time(0);
sprintf(heartbeat_insert_query, "REPLACE INTO maxscale_schema.replication_heartbeat (master_server_id, maxscale_id, master_timestamp ) VALUES ( %li, %lu, %lu)", handle->master->server->node_id, id, heartbeat);
if (mysql_query(database->con, heartbeat_insert_query)) {
if (mysql_query(database->con, heartbeat_insert_query))
{
database->server->rlag = -1;
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"[mysql_mon]: Error inserting into maxscale_schema.replication_heartbeat table: [%s], %s",
heartbeat_insert_query,
mysql_error(database->con))));
} else {
}
else
{
/* Set replication lag to 0 for the master */
database->server->rlag = 0;
LOGIF(LD, (skygw_log_write_flush(
LOGFILE_DEBUG,
LOGIF(LD, (skygw_log_write_flush(LOGFILE_DEBUG,
"[mysql_mon]: heartbeat table inserted data for %s:%i", database->server->name, database->server->port)));
}
} else {
}
else
{
/* Set replication lag as 0 for the master */
database->server->rlag = 0;
LOGIF(LD, (skygw_log_write_flush(
LOGFILE_DEBUG,
LOGIF(LD, (skygw_log_write_flush(LOGFILE_DEBUG,
"[mysql_mon]: heartbeat table updated for Master %s:%i", database->server->name, database->server->port)));
}
}
@ -1203,7 +1235,8 @@ static void set_master_heartbeat(MYSQL_MONITOR *handle, MONITOR_SERVERS *databas
* @param handle The monitor handle
* @param database The number database server
*/
static void set_slave_heartbeat(MONITOR* mon, MONITOR_SERVERS *database) {
static void set_slave_heartbeat(MONITOR* mon, MONITOR_SERVERS *database)
{
MYSQL_MONITOR *handle = (MYSQL_MONITOR*) mon->handle;
unsigned long id = handle->id;
time_t heartbeat;
@ -1211,9 +1244,9 @@ static void set_slave_heartbeat(MONITOR* mon, MONITOR_SERVERS *database) {
MYSQL_ROW row;
MYSQL_RES *result;
if (handle->master == NULL) {
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
if (handle->master == NULL)
{
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"[mysql_mon]: set_slave_heartbeat called without an available Master server")));
return;
}
@ -1227,10 +1260,12 @@ static void set_slave_heartbeat(MONITOR* mon, MONITOR_SERVERS *database) {
/* if there is a master then send the query to the slave with master_id */
if (handle->master != NULL && (mysql_query(database->con, select_heartbeat_query) == 0
&& (result = mysql_store_result(database->con)) != NULL)) {
&& (result = mysql_store_result(database->con)) != NULL))
{
int rows_found = 0;
while ((row = mysql_fetch_row(result))) {
while ((row = mysql_fetch_row(result)))
{
int rlag = -1;
time_t slave_read;
@ -1239,11 +1274,13 @@ static void set_slave_heartbeat(MONITOR* mon, MONITOR_SERVERS *database) {
heartbeat = time(0);
slave_read = strtoul(row[0], NULL, 10);
if ((errno == ERANGE && (slave_read == LONG_MAX || slave_read == LONG_MIN)) || (errno != 0 && slave_read == 0)) {
if ((errno == ERANGE && (slave_read == LONG_MAX || slave_read == LONG_MIN)) || (errno != 0 && slave_read == 0))
{
slave_read = 0;
}
if (slave_read) {
if (slave_read)
{
/* set the replication lag */
rlag = heartbeat - slave_read;
}
@ -1251,41 +1288,47 @@ static void set_slave_heartbeat(MONITOR* mon, MONITOR_SERVERS *database) {
/* set this node_ts as master_timestamp read from replication_heartbeat table */
database->server->node_ts = slave_read;
if (rlag >= 0) {
if (rlag >= 0)
{
/* store rlag only if greater than monitor sampling interval */
database->server->rlag = (rlag > (mon->interval / 1000)) ? rlag : 0;
} else {
}
else
{
database->server->rlag = -1;
}
LOGIF(LD, (skygw_log_write_flush(
LOGFILE_DEBUG,
LOGIF(LD, (skygw_log_write_flush(LOGFILE_DEBUG,
"[mysql_mon]: replication heartbeat: "
"Slave %s:%i has %i seconds lag",
database->server->name,
database->server->port,
database->server->rlag)));
}
if (!rows_found) {
if (!rows_found)
{
database->server->rlag = -1;
database->server->node_ts = 0;
}
mysql_free_result(result);
} else {
}
else
{
database->server->rlag = -1;
database->server->node_ts = 0;
if (handle->master->server->node_id < 0) {
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
if (handle->master->server->node_id < 0)
{
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"[mysql_mon]: error: replication heartbeat: "
"master_server_id NOT available for %s:%i",
database->server->name,
database->server->port)));
} else {
LOGIF(LE, (skygw_log_write_flush(
LOGFILE_ERROR,
}
else
{
LOGIF(LE, (skygw_log_write_flush(LOGFILE_ERROR,
"[mysql_mon]: error: replication heartbeat: "
"failed selecting from hearthbeat table of %s:%i : [%s], %s",
database->server->name,
@ -1307,7 +1350,8 @@ static void set_slave_heartbeat(MONITOR* mon, MONITOR_SERVERS *database) {
* @return The server at root level with SERVER_MASTER bit
*/
static MONITOR_SERVERS *get_replication_tree(MONITOR *mon, int num_servers) {
static MONITOR_SERVERS *get_replication_tree(MONITOR *mon, int num_servers)
{
MYSQL_MONITOR* handle = (MYSQL_MONITOR*) mon->handle;
MONITOR_SERVERS *ptr;
MONITOR_SERVERS *backend;
@ -1325,7 +1369,8 @@ static MONITOR_SERVERS *get_replication_tree(MONITOR *mon, int num_servers) {
* that means SERVER_IS_RUNNING returns 0
* Let's check only for SERVER_IS_DOWN: server is not running
*/
if (SERVER_IS_DOWN(ptr->server)) {
if (SERVER_IS_DOWN(ptr->server))
{
ptr = ptr->next;
continue;
}
@ -1333,52 +1378,70 @@ static MONITOR_SERVERS *get_replication_tree(MONITOR *mon, int num_servers) {
current = ptr->server;
node_id = current->master_id;
if (node_id < 1) {
if (node_id < 1)
{
MONITOR_SERVERS *find_slave;
find_slave = getSlaveOfNodeId(mon->databases, current->node_id);
if (find_slave == NULL) {
if (find_slave == NULL)
{
current->depth = -1;
ptr = ptr->next;
continue;
} else {
}
else
{
current->depth = 0;
}
} else {
}
else
{
depth++;
}
while(depth <= num_servers) {
while (depth <= num_servers)
{
/* set the root master at lowest depth level */
if (current->depth > -1 && current->depth < root_level) {
if (current->depth > -1 && current->depth < root_level)
{
root_level = current->depth;
handle->master = ptr;
}
backend = getServerByNodeId(mon->databases, node_id);
if (backend) {
if (backend)
{
node_id = backend->server->master_id;
} else {
}
else
{
node_id = -1;
}
if (node_id > 0) {
if (node_id > 0)
{
current->depth = depth + 1;
depth++;
} else {
}
else
{
MONITOR_SERVERS *master;
current->depth = depth;
master = getServerByNodeId(mon->databases, current->master_id);
if (master && master->server && master->server->node_id > 0) {
if (master && master->server && master->server->node_id > 0)
{
add_slave_to_master(master->server->slaves, MONITOR_MAX_NUM_SLAVES, current->node_id);
master->server->depth = current->depth - 1;
monitor_set_pending_status(master, SERVER_MASTER);
handle->master = master;
} else {
if (current->master_id > 0) {
}
else
{
if (current->master_id > 0)
{
/* this server is slave of another server not in MaxScale configuration
* we cannot use it as a real slave.
*/
@ -1398,14 +1461,20 @@ static MONITOR_SERVERS *get_replication_tree(MONITOR *mon, int num_servers) {
* Return the root master
*/
if (handle->master != NULL) {
if (handle->master != NULL)
{
/* If the root master is in MAINT, return NULL */
if (SERVER_IN_MAINT(handle->master->server)) {
if (SERVER_IN_MAINT(handle->master->server))
{
return NULL;
} else {
}
else
{
return handle->master;
}
} else {
}
else
{
return NULL;
}
}
@ -1419,10 +1488,12 @@ static MONITOR_SERVERS *get_replication_tree(MONITOR *mon, int num_servers) {
* @param node_id The node_id of the slave to be inserted
* @return 1 for inserted value and 0 otherwise
*/
static int add_slave_to_master(long *slaves_list, int list_size, long node_id) {
int i;
for (i = 0; i< list_size; i++) {
if (slaves_list[i] == 0) {
static int add_slave_to_master(long *slaves_list, int list_size, long node_id)
{
for (int i = 0; i < list_size; i++)
{
if (slaves_list[i] == 0)
{
memcpy(&slaves_list[i], &node_id, sizeof(long));
return 1;
}
@ -1443,6 +1514,7 @@ static monitor_event_t mysql_events[] = {
NEW_SLAVE_EVENT,
MAX_MONITOR_EVENT
};
/**
* Check if the MySQL monitor is monitoring this event type.
* @param event Event to check
@ -1593,7 +1665,6 @@ bool check_replicate_wild_do_table(MONITOR_SERVERS* database)
return rval;
}
/**
* Check if replicate_wild_ignore_table is defined and if it matches
* maxscale_schema.replication_heartbeat.