diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 0ebadf0d26..fd8b17ef8f 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -1346,7 +1346,7 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser Waiting in an extension. - IPC + IPC BackupWaitWalArchive Waiting for WAL files required for the backup to be successfully archived. @@ -1482,6 +1482,14 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser Promote Waiting for standby promotion. + + RecoveryConflictSnapshot + Waiting for recovery conflict resolution on a vacuum cleanup. + + + RecoveryConflictTablespace + Waiting for recovery conflict resolution on dropping tablespace. + RecoveryPause Waiting for recovery to be resumed. diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 04274056ca..9ebde47dea 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -3852,6 +3852,12 @@ pgstat_get_wait_ipc(WaitEventIPC w) case WAIT_EVENT_PROMOTE: event_name = "Promote"; break; + case WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT: + event_name = "RecoveryConflictSnapshot"; + break; + case WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE: + event_name = "RecoveryConflictTablespace"; + break; case WAIT_EVENT_RECOVERY_PAUSE: event_name = "RecoveryPause"; break; diff --git a/src/backend/storage/ipc/standby.c b/src/backend/storage/ipc/standby.c index 08f695a980..bdaf10a4b1 100644 --- a/src/backend/storage/ipc/standby.c +++ b/src/backend/storage/ipc/standby.c @@ -43,7 +43,9 @@ int max_standby_streaming_delay = 30 * 1000; static HTAB *RecoveryLockLists; static void ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlist, - ProcSignalReason reason, bool report_waiting); + ProcSignalReason reason, + uint32 wait_event_info, + bool report_waiting); static void SendRecoveryConflictWithBufferPin(ProcSignalReason reason); static XLogRecPtr LogCurrentRunningXacts(RunningTransactions CurrRunningXacts); static void LogAccessExclusiveLocks(int nlocks, xl_standby_lock *locks); @@ -184,7 +186,7 @@ static int standbyWait_us = STANDBY_INITIAL_WAIT_US; * more then we return true, if we can wait some more return false. */ static bool -WaitExceedsMaxStandbyDelay(void) +WaitExceedsMaxStandbyDelay(uint32 wait_event_info) { TimestampTz ltime; @@ -198,7 +200,9 @@ WaitExceedsMaxStandbyDelay(void) /* * Sleep a bit (this is essential to avoid busy-waiting). */ + pgstat_report_wait_start(wait_event_info); pg_usleep(standbyWait_us); + pgstat_report_wait_end(); /* * Progressively increase the sleep times, but not to more than 1s, since @@ -223,7 +227,8 @@ WaitExceedsMaxStandbyDelay(void) */ static void ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlist, - ProcSignalReason reason, bool report_waiting) + ProcSignalReason reason, uint32 wait_event_info, + bool report_waiting) { TimestampTz waitStart = 0; char *new_status; @@ -264,7 +269,7 @@ ResolveRecoveryConflictWithVirtualXIDs(VirtualTransactionId *waitlist, } /* Is it time to kill it? */ - if (WaitExceedsMaxStandbyDelay()) + if (WaitExceedsMaxStandbyDelay(wait_event_info)) { pid_t pid; @@ -317,6 +322,7 @@ ResolveRecoveryConflictWithSnapshot(TransactionId latestRemovedXid, RelFileNode ResolveRecoveryConflictWithVirtualXIDs(backends, PROCSIG_RECOVERY_CONFLICT_SNAPSHOT, + WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT, true); } @@ -346,6 +352,7 @@ ResolveRecoveryConflictWithTablespace(Oid tsid) InvalidOid); ResolveRecoveryConflictWithVirtualXIDs(temp_file_users, PROCSIG_RECOVERY_CONFLICT_TABLESPACE, + WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE, true); } @@ -417,6 +424,7 @@ ResolveRecoveryConflictWithLock(LOCKTAG locktag) */ ResolveRecoveryConflictWithVirtualXIDs(backends, PROCSIG_RECOVERY_CONFLICT_LOCK, + PG_WAIT_LOCK | locktag.locktag_type, false); } else diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 9d351e7714..b8041d9988 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -881,6 +881,8 @@ typedef enum WAIT_EVENT_PARALLEL_FINISH, WAIT_EVENT_PROCARRAY_GROUP_UPDATE, WAIT_EVENT_PROMOTE, + WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT, + WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE, WAIT_EVENT_RECOVERY_PAUSE, WAIT_EVENT_REPLICATION_ORIGIN_DROP, WAIT_EVENT_REPLICATION_SLOT_DROP,