pg_waldump: Add a --quiet option.
authorRobert Haas <rhaas@postgresql.org>
Fri, 3 Apr 2020 00:25:04 +0000 (20:25 -0400)
committerRobert Haas <rhaas@postgresql.org>
Fri, 3 Apr 2020 00:25:04 +0000 (20:25 -0400)
The primary motivation for this change is that it will be used by the
upcoming patch to add backup manifests, but it also seems to have some
potential more general use.

Andres Freund and Robert Haas

Discussion: http://postgr.es/m/20200330020814.nspra4mvby42yoa4@alap3.anarazel.de

doc/src/sgml/ref/pg_waldump.sgml
src/bin/pg_waldump/pg_waldump.c

index 667093f06014ccf2dc5400a56ce598c952b27be2..5fcdfe210acb0e8f26ab23b093d768481394c520 100644 (file)
@@ -125,6 +125,18 @@ PostgreSQL documentation
       </listitem>
      </varlistentry>
 
+     <varlistentry>
+      <term><option>-q</option></term>
+      <term><option>--quiet</option></term>
+      <listitem>
+       <para>
+        Do not print any output, except for errors. This option can be useful
+        when you want to know whether a range of WAL records can be
+        successfully parsed but don't care about the record contents.
+       </para>
+      </listitem>
+     </varlistentry>
+
      <varlistentry>
       <term><option>-r <replaceable>rmgr</replaceable></option></term>
       <term><option>--rmgr=<replaceable>rmgr</replaceable></option></term>
index 279acfa0440c202168121e3de309bfbf51c2ac2f..7c80b5288f12a206a4d74f7629b45eb4cadf6691 100644 (file)
@@ -40,6 +40,7 @@ typedef struct XLogDumpPrivate
 typedef struct XLogDumpConfig
 {
    /* display options */
+   bool        quiet;
    bool        bkp_details;
    int         stop_after_records;
    int         already_displayed_records;
@@ -720,6 +721,7 @@ usage(void)
    printf(_("  -p, --path=PATH        directory in which to find log segment files or a\n"
             "                         directory with a ./pg_wal that contains such files\n"
             "                         (default: current directory, ./pg_wal, $PGDATA/pg_wal)\n"));
+   printf(_("  -q, --quiet            do not print any output, except for errors\n"));
    printf(_("  -r, --rmgr=RMGR        only show records generated by resource manager RMGR;\n"
             "                         use --rmgr=list to list valid resource manager names\n"));
    printf(_("  -s, --start=RECPTR     start reading at WAL location RECPTR\n"));
@@ -755,6 +757,7 @@ main(int argc, char **argv)
        {"help", no_argument, NULL, '?'},
        {"limit", required_argument, NULL, 'n'},
        {"path", required_argument, NULL, 'p'},
+       {"quiet", no_argument, NULL, 'q'},
        {"rmgr", required_argument, NULL, 'r'},
        {"start", required_argument, NULL, 's'},
        {"timeline", required_argument, NULL, 't'},
@@ -794,6 +797,7 @@ main(int argc, char **argv)
    private.endptr = InvalidXLogRecPtr;
    private.endptr_reached = false;
 
+   config.quiet = false;
    config.bkp_details = false;
    config.stop_after_records = -1;
    config.already_displayed_records = 0;
@@ -810,7 +814,7 @@ main(int argc, char **argv)
        goto bad_argument;
    }
 
-   while ((option = getopt_long(argc, argv, "be:fn:p:r:s:t:x:z",
+   while ((option = getopt_long(argc, argv, "be:fn:p:qr:s:t:x:z",
                                 long_options, &optindex)) != -1)
    {
        switch (option)
@@ -840,6 +844,9 @@ main(int argc, char **argv)
            case 'p':
                waldir = pg_strdup(optarg);
                break;
+           case 'q':
+               config.quiet = true;
+               break;
            case 'r':
                {
                    int         i;
@@ -1075,11 +1082,14 @@ main(int argc, char **argv)
            config.filter_by_xid != record->xl_xid)
            continue;
 
-       /* process the record */
-       if (config.stats == true)
-           XLogDumpCountRecord(&config, &stats, xlogreader_state);
-       else
-           XLogDumpDisplayRecord(&config, xlogreader_state);
+       /* perform any per-record work */
+       if (!config.quiet)
+       {
+           if (config.stats == true)
+               XLogDumpCountRecord(&config, &stats, xlogreader_state);
+           else
+               XLogDumpDisplayRecord(&config, xlogreader_state);
+       }
 
        /* check whether we printed enough */
        config.already_displayed_records++;