diff --git a/server/modules/include/blr.h b/server/modules/include/blr.h index 93011e88f..662a3d779 100644 --- a/server/modules/include/blr.h +++ b/server/modules/include/blr.h @@ -172,6 +172,7 @@ typedef struct router_slave { int overrun; uint32_t rank; /*< Replication rank */ uint8_t seqno; /*< Replication dump sequence no */ + uint32_t lastEventTimestamp;/*< Last event timestamp sent */ SPINLOCK catch_lock; /*< Event catchup lock */ unsigned int cstate; /*< Catch up state */ SPINLOCK rses_lock; /*< Protects rses_deleted */ @@ -257,6 +258,7 @@ typedef struct router_instance { SESSION *session; /*< Fake session for master connection */ unsigned int master_state; /*< State of the master FSM */ uint8_t lastEventReceived; + uint32_t lastEventTimestamp; /*< Timestamp from last event */ GWBUF *residual; /*< Any residual binlog event */ MASTER_RESPONSES saved_master; /*< Saved master responses */ char *binlogdir; /*< The directory with the binlog files */ diff --git a/server/modules/routing/binlog/blr.c b/server/modules/routing/binlog/blr.c index bab386a20..4b13744ef 100644 --- a/server/modules/routing/binlog/blr.c +++ b/server/modules/routing/binlog/blr.c @@ -367,6 +367,7 @@ unsigned char *defuuid; inst->residual = NULL; inst->slaves = NULL; inst->next = NULL; + inst->lastEventTimestamp = 0; /* * Read any cached response messages @@ -486,6 +487,7 @@ ROUTER_SLAVE *slave; slave->file = NULL; strcpy(slave->binlogfile, "unassigned"); slave->connect_time = time(0); + slave->lastEventTimestamp = 0; /** * Add this session to the list of active sessions. @@ -777,11 +779,18 @@ struct tm tm; buf); dcb_printf(dcb, "\t (%d seconds ago)\n", time(0) - router_inst->stats.lastReply); - dcb_printf(dcb, "\tLast event from master: 0x%x (%s)\n", + dcb_printf(dcb, "\tLast event from master: 0x%x, %s", router_inst->lastEventReceived, (router_inst->lastEventReceived >= 0 && router_inst->lastEventReceived < 0x24) ? event_names[router_inst->lastEventReceived] : "unknown"); + if (router_inst->lastEventTimestamp) + { + localtime_r(&router_inst->lastEventTimestamp, &tm); + asctime_r(&tm, buf); + dcb_printf(dcb, "\tLast binlog event timestamp: %ld (%s)\n", + router_inst->lastEventTimestamp, buf); + } if (router_inst->active_logs) dcb_printf(dcb, "\tRouter processing binlog records\n"); if (router_inst->reconnect_pending) @@ -865,6 +874,9 @@ struct tm tm; dcb_printf(dcb, "\t\tNo. events sent: %u\n", session->stats.n_events); + dcb_printf(dcb, + "\t\tNo. bytes sent: %u\n", + session->stats.n_bytes); dcb_printf(dcb, "\t\tNo. bursts sent: %u\n", session->stats.n_bursts); @@ -890,6 +902,14 @@ struct tm tm; dcb_printf(dcb, "\t\tNo. of distribute action 2 %u\n", session->stats.n_actions[1]); dcb_printf(dcb, "\t\tNo. of distribute action 3 %u\n", session->stats.n_actions[2]); #endif + if (session->lastEventTimestamp + && router_inst->lastEventTimestamp) + { + localtime_r(&session->lastEventTimestamp, &tm); + asctime_r(&tm, buf); + dcb_printf(dcb, "\t\tLast binlog event timestamp %u, %s", session->lastEventTimestamp, buf); + dcb_printf(dcb, "\t\tSeconds behind master %u\n", router_inst->lastEventTimestamp - session->lastEventTimestamp); + } if ((session->cstate & CS_UPTODATE) == 0) { diff --git a/server/modules/routing/binlog/blr_master.c b/server/modules/routing/binlog/blr_master.c index 75ef9e7b9..5733463bf 100644 --- a/server/modules/routing/binlog/blr_master.c +++ b/server/modules/routing/binlog/blr_master.c @@ -925,6 +925,7 @@ static REP_HEADER phdr; } router->stats.n_binlogs++; router->lastEventReceived = hdr.event_type; + router->lastEventTimestamp = hdr.timestamp; // #define SHOW_EVENTS #ifdef SHOW_EVENTS @@ -1291,6 +1292,7 @@ int action; * this is a rotate event. Send the event directly from * memory to the slave. */ + slave->lastEventTimestamp = hdr->timestamp; pkt = gwbuf_alloc(hdr->event_size + 5); buf = GWBUF_DATA(pkt); encode_value(buf, hdr->event_size + 1, 24); @@ -1303,6 +1305,7 @@ int action; blr_slave_rotate(router, slave, ptr); } slave->stats.n_bytes += gwbuf_length(pkt); + slave->stats.n_events++; slave->dcb->func.write(slave->dcb, pkt); if (hdr->event_type != ROTATE_EVENT) { diff --git a/server/modules/routing/binlog/blr_slave.c b/server/modules/routing/binlog/blr_slave.c index dbd02449a..9fb0a694d 100644 --- a/server/modules/routing/binlog/blr_slave.c +++ b/server/modules/routing/binlog/blr_slave.c @@ -1385,6 +1385,7 @@ uint8_t *ptr; *ptr++ = slave->seqno++; *ptr++ = 0; // OK head = gwbuf_append(head, record); + slave->lastEventTimestamp = hdr.timestamp; if (hdr.event_type == ROTATE_EVENT) { unsigned long beat1 = hkheartbeat;