From 1b06d7bac901e5fd20bba597188bae2882bf954b Mon Sep 17 00:00:00 2001 From: Fujii Masao Date: Mon, 22 Nov 2021 10:28:21 +0900 Subject: [PATCH] Report wait events for local shell commands like archive_command. This commit introduces new wait events for archive_command, archive_cleanup_command, restore_command and recovery_end_command. Author: Fujii Masao Reviewed-by: Bharath Rupireddy, Michael Paquier Discussion: https://postgr.es/m/4ca4f920-6b48-638d-08b2-93598356f5d3@oss.nttdata.com --- doc/src/sgml/monitoring.sgml | 22 +++++++++++++++++++++- src/backend/access/transam/xlog.c | 6 ++++-- src/backend/access/transam/xlogarchive.c | 9 ++++++++- src/backend/postmaster/pgarch.c | 3 +++ src/backend/utils/activity/wait_event.c | 12 ++++++++++++ src/include/access/xlogarchive.h | 2 +- src/include/utils/wait_event.h | 4 ++++ 7 files changed, 53 insertions(+), 5 deletions(-) diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 3173ec2566..af6914872b 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -1569,7 +1569,17 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser Waiting for subplan nodes of an Append plan node to be ready. - + + ArchiveCleanupCommand + Waiting for to + complete. + + + ArchiveCommand + Waiting for to + complete. + + BackendTermination Waiting for the termination of another backend. @@ -1747,6 +1757,11 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser Waiting for recovery conflict resolution for dropping a tablespace. + + RecoveryEndCommand + Waiting for to + complete. + RecoveryPause Waiting for recovery to be resumed. @@ -1761,6 +1776,11 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser Waiting for a replication slot to become inactive so it can be dropped. + + RestoreCommand + Waiting for to + complete. + SafeSnapshot Waiting to obtain a valid snapshot for a READ ONLY diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 1616448368..33bb0229aa 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -5800,7 +5800,8 @@ CleanupAfterArchiveRecovery(TimeLineID EndOfLogTLI, XLogRecPtr EndOfLog, if (recoveryEndCommand && strcmp(recoveryEndCommand, "") != 0) ExecuteRecoveryCommand(recoveryEndCommand, "recovery_end_command", - true); + true, + WAIT_EVENT_RECOVERY_END_COMMAND); /* * We switched to a new timeline. Clean up segments on the old timeline. @@ -9915,7 +9916,8 @@ CreateRestartPoint(int flags) if (archiveCleanupCommand && strcmp(archiveCleanupCommand, "") != 0) ExecuteRecoveryCommand(archiveCleanupCommand, "archive_cleanup_command", - false); + false, + WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND); return true; } diff --git a/src/backend/access/transam/xlogarchive.c b/src/backend/access/transam/xlogarchive.c index e9ca3aa48b..4ddeac1fb9 100644 --- a/src/backend/access/transam/xlogarchive.c +++ b/src/backend/access/transam/xlogarchive.c @@ -24,6 +24,7 @@ #include "access/xlogarchive.h" #include "common/archive.h" #include "miscadmin.h" +#include "pgstat.h" #include "postmaster/startup.h" #include "postmaster/pgarch.h" #include "replication/walsender.h" @@ -168,7 +169,9 @@ RestoreArchivedFile(char *path, const char *xlogfname, /* * Copy xlog from archival storage to XLOGDIR */ + pgstat_report_wait_start(WAIT_EVENT_RESTORE_COMMAND); rc = system(xlogRestoreCmd); + pgstat_report_wait_end(); PostRestoreCommand(); pfree(xlogRestoreCmd); @@ -284,7 +287,8 @@ not_available: * This is currently used for recovery_end_command and archive_cleanup_command. */ void -ExecuteRecoveryCommand(const char *command, const char *commandName, bool failOnSignal) +ExecuteRecoveryCommand(const char *command, const char *commandName, + bool failOnSignal, uint32 wait_event_info) { char xlogRecoveryCmd[MAXPGPATH]; char lastRestartPointFname[MAXPGPATH]; @@ -354,7 +358,10 @@ ExecuteRecoveryCommand(const char *command, const char *commandName, bool failOn /* * execute the constructed command */ + pgstat_report_wait_start(wait_event_info); rc = system(xlogRecoveryCmd); + pgstat_report_wait_end(); + if (rc != 0) { /* diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index 3b33e01d95..434939be9b 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -555,7 +555,10 @@ pgarch_archiveXlog(char *xlog) snprintf(activitymsg, sizeof(activitymsg), "archiving %s", xlog); set_ps_display(activitymsg); + pgstat_report_wait_start(WAIT_EVENT_ARCHIVE_COMMAND); rc = system(xlogarchcmd); + pgstat_report_wait_end(); + if (rc != 0) { /* diff --git a/src/backend/utils/activity/wait_event.c b/src/backend/utils/activity/wait_event.c index 4a5b7502f5..4d53f040e8 100644 --- a/src/backend/utils/activity/wait_event.c +++ b/src/backend/utils/activity/wait_event.c @@ -313,6 +313,12 @@ pgstat_get_wait_ipc(WaitEventIPC w) case WAIT_EVENT_APPEND_READY: event_name = "AppendReady"; break; + case WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND: + event_name = "ArchiveCleanupCommand"; + break; + case WAIT_EVENT_ARCHIVE_COMMAND: + event_name = "ArchiveCommand"; + break; case WAIT_EVENT_BACKEND_TERMINATION: event_name = "BackendTermination"; break; @@ -427,6 +433,9 @@ pgstat_get_wait_ipc(WaitEventIPC w) case WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE: event_name = "RecoveryConflictTablespace"; break; + case WAIT_EVENT_RECOVERY_END_COMMAND: + event_name = "RecoveryEndCommand"; + break; case WAIT_EVENT_RECOVERY_PAUSE: event_name = "RecoveryPause"; break; @@ -436,6 +445,9 @@ pgstat_get_wait_ipc(WaitEventIPC w) case WAIT_EVENT_REPLICATION_SLOT_DROP: event_name = "ReplicationSlotDrop"; break; + case WAIT_EVENT_RESTORE_COMMAND: + event_name = "RestoreCommand"; + break; case WAIT_EVENT_SAFE_SNAPSHOT: event_name = "SafeSnapshot"; break; diff --git a/src/include/access/xlogarchive.h b/src/include/access/xlogarchive.h index 7dcf1bd2dd..9dba1c3fb1 100644 --- a/src/include/access/xlogarchive.h +++ b/src/include/access/xlogarchive.h @@ -21,7 +21,7 @@ extern bool RestoreArchivedFile(char *path, const char *xlogfname, const char *recovername, off_t expectedSize, bool cleanupEnabled); extern void ExecuteRecoveryCommand(const char *command, const char *commandName, - bool failOnSignal); + bool failOnSignal, uint32 wait_event_info); extern void KeepFileRestoredFromArchive(const char *path, const char *xlogfname); extern void XLogArchiveNotify(const char *xlog); extern void XLogArchiveNotifySeg(XLogSegNo segno, TimeLineID tli); diff --git a/src/include/utils/wait_event.h b/src/include/utils/wait_event.h index c22142365f..8785a8e12c 100644 --- a/src/include/utils/wait_event.h +++ b/src/include/utils/wait_event.h @@ -80,6 +80,8 @@ typedef enum typedef enum { WAIT_EVENT_APPEND_READY = PG_WAIT_IPC, + WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND, + WAIT_EVENT_ARCHIVE_COMMAND, WAIT_EVENT_BACKEND_TERMINATION, WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE, WAIT_EVENT_BGWORKER_SHUTDOWN, @@ -118,9 +120,11 @@ typedef enum WAIT_EVENT_PROMOTE, WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT, WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE, + WAIT_EVENT_RECOVERY_END_COMMAND, WAIT_EVENT_RECOVERY_PAUSE, WAIT_EVENT_REPLICATION_ORIGIN_DROP, WAIT_EVENT_REPLICATION_SLOT_DROP, + WAIT_EVENT_RESTORE_COMMAND, WAIT_EVENT_SAFE_SNAPSHOT, WAIT_EVENT_SYNC_REP, WAIT_EVENT_WAL_RECEIVER_EXIT, -- 2.30.2