diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 01fad3870f..56128016af 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -1260,6 +1260,10 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser RecoveryApplyDelay Waiting to apply WAL at recovery because it is delayed. + + RecoveryConflict + Waiting for conflict resolution of query running on standby. + diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 7176cf1bbe..1b57c10bbd 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -3426,6 +3426,9 @@ pgstat_get_wait_timeout(WaitEventTimeout w) case WAIT_EVENT_RECOVERY_APPLY_DELAY: event_name = "RecoveryApplyDelay"; break; + case WAIT_EVENT_RECOVERY_CONFLICT: + event_name = "RecoveryConflict"; + break; /* no default case, so that compiler will warn */ } diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index 6532240dd1..eed1581c0b 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -148,8 +148,8 @@ GetStandbyLimitTime(void) } } -#define STANDBY_INITIAL_WAIT_US 1000 -static int standbyWait_us = STANDBY_INITIAL_WAIT_US; +#define STANDBY_INITIAL_WAIT_MS 1 +static int standbyWait_ms = STANDBY_INITIAL_WAIT_MS; /* * Standby wait logic for ResolveRecoveryConflictWithVirtualXIDs. @@ -171,15 +171,19 @@ WaitExceedsMaxStandbyDelay(void) /* * Sleep a bit (this is essential to avoid busy-waiting). */ - pg_usleep(standbyWait_us); + (void) WaitLatch(MyLatch, + WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH, + standbyWait_ms, + WAIT_EVENT_RECOVERY_CONFLICT); + ResetLatch(MyLatch); /* - * Progressively increase the sleep times, but not to more than 1s, since - * pg_usleep isn't interruptable on some platforms. + * Progressively increase the sleep times, but not to more than 1s + * to keep process in a respectable range. */ - standbyWait_us *= 2; - if (standbyWait_us > 1000000) - standbyWait_us = 1000000; + standbyWait_ms *= 2; + if (standbyWait_ms > 1000) + standbyWait_ms = 1000; return false; } @@ -206,8 +210,8 @@ ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlist, while (VirtualTransactionIdIsValid(*waitlist)) { - /* reset standbyWait_us for each xact we wait for */ - standbyWait_us = STANDBY_INITIAL_WAIT_US; + /* reset standbyWait_ms for each xact we wait for */ + standbyWait_ms = STANDBY_INITIAL_WAIT_MS; /* wait until the virtual xid is gone */ while (!VirtualXactLock(*waitlist, false)) diff --git a/src/include/pgstat.h b/src/include/pgstat.h index de8225b989..e5d45b585c 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -800,7 +800,8 @@ typedef enum { WAIT_EVENT_BASE_BACKUP_THROTTLE = PG_WAIT_TIMEOUT, WAIT_EVENT_PG_SLEEP, - WAIT_EVENT_RECOVERY_APPLY_DELAY + WAIT_EVENT_RECOVERY_APPLY_DELAY, + WAIT_EVENT_RECOVERY_CONFLICT } WaitEventTimeout; /* ----------