mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
Send new protocol keepalive messages to standby servers.
Allows streaming replication users to calculate transfer latency and apply delay via internal functions. No external functions yet.
This commit is contained in:
@ -28,6 +28,7 @@
|
||||
#include "replication/walreceiver.h"
|
||||
#include "storage/pmsignal.h"
|
||||
#include "storage/shmem.h"
|
||||
#include "utils/timestamp.h"
|
||||
|
||||
WalRcvData *WalRcv = NULL;
|
||||
|
||||
@ -238,3 +239,65 @@ GetWalRcvWriteRecPtr(XLogRecPtr *latestChunkStart)
|
||||
|
||||
return recptr;
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the replication apply delay in ms
|
||||
*/
|
||||
int
|
||||
GetReplicationApplyDelay(void)
|
||||
{
|
||||
/* use volatile pointer to prevent code rearrangement */
|
||||
volatile WalRcvData *walrcv = WalRcv;
|
||||
|
||||
XLogRecPtr receivePtr;
|
||||
XLogRecPtr replayPtr;
|
||||
|
||||
long secs;
|
||||
int usecs;
|
||||
|
||||
SpinLockAcquire(&walrcv->mutex);
|
||||
receivePtr = walrcv->receivedUpto;
|
||||
SpinLockRelease(&walrcv->mutex);
|
||||
|
||||
replayPtr = GetXLogReplayRecPtr(NULL);
|
||||
|
||||
if (XLByteLE(receivePtr, replayPtr))
|
||||
return 0;
|
||||
|
||||
TimestampDifference(GetCurrentChunkReplayStartTime(),
|
||||
GetCurrentTimestamp(),
|
||||
&secs, &usecs);
|
||||
|
||||
return (((int) secs * 1000) + (usecs / 1000));
|
||||
}
|
||||
|
||||
/*
|
||||
* Returns the network latency in ms, note that this includes any
|
||||
* difference in clock settings between the servers, as well as timezone.
|
||||
*/
|
||||
int
|
||||
GetReplicationTransferLatency(void)
|
||||
{
|
||||
/* use volatile pointer to prevent code rearrangement */
|
||||
volatile WalRcvData *walrcv = WalRcv;
|
||||
|
||||
TimestampTz lastMsgSendTime;
|
||||
TimestampTz lastMsgReceiptTime;
|
||||
|
||||
long secs = 0;
|
||||
int usecs = 0;
|
||||
int ms;
|
||||
|
||||
SpinLockAcquire(&walrcv->mutex);
|
||||
lastMsgSendTime = walrcv->lastMsgSendTime;
|
||||
lastMsgReceiptTime = walrcv->lastMsgReceiptTime;
|
||||
SpinLockRelease(&walrcv->mutex);
|
||||
|
||||
TimestampDifference(lastMsgSendTime,
|
||||
lastMsgReceiptTime,
|
||||
&secs, &usecs);
|
||||
|
||||
ms = ((int) secs * 1000) + (usecs / 1000);
|
||||
|
||||
return ms;
|
||||
}
|
||||
|
Reference in New Issue
Block a user