From 18808f8c893d4f425f2d21b2a1ffc8e51f1bd0ba Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Fri, 3 Apr 2020 12:15:56 +0900 Subject: [PATCH] Add wait events for recovery conflicts. This commit introduces new wait events RecoveryConflictSnapshot and RecoveryConflictTablespace. The former is reported while waiting for recovery conflict resolution on a vacuum cleanup. The latter is reported while waiting for recovery conflict resolution on dropping tablespace. Also this commit changes the code so that the wait event Lock is reported while waiting in ResolveRecoveryConflictWithVirtualXIDs() for recovery conflict resolution on a lock. Basically the wait event Lock is reported during that wait, but previously was not reported only when that wait happened in ResolveRecoveryConflictWithVirtualXIDs(). Author: Masahiko Sawada Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/CA+fd4k4mXWTwfQLS3RPwGr4xnfAEs1ysFfgYHvmmoUgv6Zxvmg@mail.gmail.com --- doc/src/sgml/monitoring.sgml | 10 +++++++++- src/backend/postmaster/pgstat.c | 6 ++++++ src/backend/storage/ipc/standby.c | 16 ++++++++++++---- src/include/pgstat.h | 2 ++ 4 files changed, 29 insertions(+), 5 deletions(-) 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,