Report wait events for local shell commands like archive_command.
authorFujii Masao <[email protected]>
Mon, 22 Nov 2021 01:28:21 +0000 (10:28 +0900)
committerFujii Masao <[email protected]>
Mon, 22 Nov 2021 01:28:21 +0000 (10:28 +0900)
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
src/backend/access/transam/xlog.c
src/backend/access/transam/xlogarchive.c
src/backend/postmaster/pgarch.c
src/backend/utils/activity/wait_event.c
src/include/access/xlogarchive.h
src/include/utils/wait_event.h

index 3173ec25660606045949a33edc700b28c5d0c3b8..af6914872b1ed9242d531c83e15c87ab5a1e4dd7 100644 (file)
@@ -1569,7 +1569,17 @@ postgres   27093  0.0  0.0  30096  2752 ?        Ss   11:34   0:00 postgres: ser
       <entry>Waiting for subplan nodes of an <literal>Append</literal> plan
        node to be ready.</entry>
      </row>
-    <row>
+     <row>
+      <entry><literal>ArchiveCleanupCommand</literal></entry>
+      <entry>Waiting for <xref linkend="guc-archive-cleanup-command"/> to
+       complete.</entry>
+     </row>
+     <row>
+      <entry><literal>ArchiveCommand</literal></entry>
+      <entry>Waiting for <xref linkend="guc-archive-command"/> to
+       complete.</entry>
+     </row>
+     <row>
       <entry><literal>BackendTermination</literal></entry>
       <entry>Waiting for the termination of another backend.</entry>
      </row>
@@ -1747,6 +1757,11 @@ postgres   27093  0.0  0.0  30096  2752 ?        Ss   11:34   0:00 postgres: ser
       <entry>Waiting for recovery conflict resolution for dropping a
        tablespace.</entry>
      </row>
+     <row>
+      <entry><literal>RecoveryEndCommand</literal></entry>
+      <entry>Waiting for <xref linkend="guc-recovery-end-command"/> to
+       complete.</entry>
+     </row>
      <row>
       <entry><literal>RecoveryPause</literal></entry>
       <entry>Waiting for recovery to be resumed.</entry>
@@ -1761,6 +1776,11 @@ postgres   27093  0.0  0.0  30096  2752 ?        Ss   11:34   0:00 postgres: ser
       <entry>Waiting for a replication slot to become inactive so it can be
        dropped.</entry>
      </row>
+     <row>
+      <entry><literal>RestoreCommand</literal></entry>
+      <entry>Waiting for <xref linkend="guc-restore-command"/> to
+       complete.</entry>
+     </row>
      <row>
       <entry><literal>SafeSnapshot</literal></entry>
       <entry>Waiting to obtain a valid snapshot for a <literal>READ ONLY
index 16164483688fa935254061bda713f126496aeb97..33bb0229aa74c54e44750a7b00ddbafac539cf90 100644 (file)
@@ -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;
 }
index e9ca3aa48b26f1e1c728b7892dd83fa49b97252e..4ddeac1fb9287c09ca4d3e4b5e4108199c70a34a 100644 (file)
@@ -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)
        {
                /*
index 3b33e01d95ec166bacc53d0b8bdaae23809a5d7b..434939be9bc2100b16c859496b6d7b356b3e6e6e 100644 (file)
@@ -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)
        {
                /*
index 4a5b7502f5e28dce8b224622c8bdf2d6d3893135..4d53f040e8112e55f7595c337118647d8f38d8fa 100644 (file)
@@ -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;
index 7dcf1bd2dd2e873451ba0d9c182dd1f76bd6ee8d..9dba1c3fb1477eed6127895a9d004b6d768b5cbb 100644 (file)
@@ -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);
index c22142365f15cb4816c991c95cff99844c8d7f58..8785a8e12c1dd06895b52ff8a5ff0f14b26a83d3 100644 (file)
@@ -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,