mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-06 15:24:56 +08:00
Always treat a standby returning an an invalid flush location as async
This ensures that a standby such as pg_receivexlog will not be selected as sync standby - which would cause the master to block waiting for a location that could never happen. Fujii Masao
This commit is contained in:
parent
817d870cf9
commit
0c4b468692
@ -376,10 +376,12 @@ SyncRepReleaseWaiters(void)
|
|||||||
/*
|
/*
|
||||||
* If this WALSender is serving a standby that is not on the list of
|
* If this WALSender is serving a standby that is not on the list of
|
||||||
* potential standbys then we have nothing to do. If we are still starting
|
* potential standbys then we have nothing to do. If we are still starting
|
||||||
* up or still running base backup, then leave quickly also.
|
* up, still running base backup or the current flush position is still
|
||||||
|
* invalid, then leave quickly also.
|
||||||
*/
|
*/
|
||||||
if (MyWalSnd->sync_standby_priority == 0 ||
|
if (MyWalSnd->sync_standby_priority == 0 ||
|
||||||
MyWalSnd->state < WALSNDSTATE_STREAMING)
|
MyWalSnd->state < WALSNDSTATE_STREAMING ||
|
||||||
|
XLogRecPtrIsInvalid(MyWalSnd->flush))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -399,7 +401,8 @@ SyncRepReleaseWaiters(void)
|
|||||||
walsnd->state == WALSNDSTATE_STREAMING &&
|
walsnd->state == WALSNDSTATE_STREAMING &&
|
||||||
walsnd->sync_standby_priority > 0 &&
|
walsnd->sync_standby_priority > 0 &&
|
||||||
(priority == 0 ||
|
(priority == 0 ||
|
||||||
priority > walsnd->sync_standby_priority))
|
priority > walsnd->sync_standby_priority) &&
|
||||||
|
!XLogRecPtrIsInvalid(walsnd->flush))
|
||||||
{
|
{
|
||||||
priority = walsnd->sync_standby_priority;
|
priority = walsnd->sync_standby_priority;
|
||||||
syncWalSnd = walsnd;
|
syncWalSnd = walsnd;
|
||||||
|
@ -281,6 +281,11 @@ WalReceiverMain(void)
|
|||||||
walrcv_connect(conninfo, startpoint);
|
walrcv_connect(conninfo, startpoint);
|
||||||
DisableWalRcvImmediateExit();
|
DisableWalRcvImmediateExit();
|
||||||
|
|
||||||
|
/* Initialize LogstreamResult, reply_message and feedback_message */
|
||||||
|
LogstreamResult.Write = LogstreamResult.Flush = GetXLogReplayRecPtr(NULL);
|
||||||
|
MemSet(&reply_message, 0, sizeof(reply_message));
|
||||||
|
MemSet(&feedback_message, 0, sizeof(feedback_message));
|
||||||
|
|
||||||
/* Loop until end-of-streaming or error */
|
/* Loop until end-of-streaming or error */
|
||||||
for (;;)
|
for (;;)
|
||||||
{
|
{
|
||||||
|
@ -1510,12 +1510,19 @@ pg_stat_get_wal_senders(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
if (walsnd->pid != 0)
|
if (walsnd->pid != 0)
|
||||||
{
|
{
|
||||||
sync_priority[i] = walsnd->sync_standby_priority;
|
/*
|
||||||
|
* Treat a standby such as a pg_basebackup background process
|
||||||
|
* which always returns an invalid flush location, as an
|
||||||
|
* asynchronous standby.
|
||||||
|
*/
|
||||||
|
sync_priority[i] = XLogRecPtrIsInvalid(walsnd->flush) ?
|
||||||
|
0 : walsnd->sync_standby_priority;
|
||||||
|
|
||||||
if (walsnd->state == WALSNDSTATE_STREAMING &&
|
if (walsnd->state == WALSNDSTATE_STREAMING &&
|
||||||
walsnd->sync_standby_priority > 0 &&
|
walsnd->sync_standby_priority > 0 &&
|
||||||
(priority == 0 ||
|
(priority == 0 ||
|
||||||
priority > walsnd->sync_standby_priority))
|
priority > walsnd->sync_standby_priority) &&
|
||||||
|
!XLogRecPtrIsInvalid(walsnd->flush))
|
||||||
{
|
{
|
||||||
priority = walsnd->sync_standby_priority;
|
priority = walsnd->sync_standby_priority;
|
||||||
sync_standby = i;
|
sync_standby = i;
|
||||||
|
Loading…
Reference in New Issue
Block a user