Report wait events for local shell commands like archive_command.
authorFujii Masao <fujii@postgresql.org>
Mon, 22 Nov 2021 01:28:21 +0000 (10:28 +0900)
committerFujii Masao <fujii@postgresql.org>
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,