]> granicus.if.org Git - postgresql/commitdiff
Display old and new values in pg_resetxlog -n output.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 12 Dec 2013 09:54:57 +0000 (11:54 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Thu, 12 Dec 2013 09:57:18 +0000 (11:57 +0200)
For extra clarity.

Rajeev Rastogi, reviewed by Amit Kapila

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

index c680680fe781c19fb3a319ae26b1ec20f50635a4..b5286650cec9f5ad47257fbc1c38f8efeb9b4a54 100644 (file)
@@ -177,9 +177,10 @@ PostgreSQL documentation
   <para>
    The <option>-n</> (no operation) option instructs
    <command>pg_resetxlog</command> to print the values reconstructed from
-   <filename>pg_control</> and then exit without modifying anything.
-   This is mainly a debugging tool, but can be useful as a sanity check
-   before allowing <command>pg_resetxlog</command> to proceed for real.
+   <filename>pg_control</> and values about to be changed, and then exit
+   without modifying anything. This is mainly a debugging tool, but can be
+   useful as a sanity check before allowing <command>pg_resetxlog</command>
+   to proceed for real.
   </para>
 
   <para>
index f1b5d6d473057de129602ce8a03d31b38904916a..ed0f945679649d3bd21d5c2b65e3660b87824e50 100644 (file)
@@ -64,10 +64,18 @@ static ControlFileData ControlFile;         /* pg_control values */
 static XLogSegNo newXlogSegNo; /* new XLOG segment # */
 static bool guessed = false;   /* T if we had to guess at any values */
 static const char *progname;
+static uint32 set_xid_epoch = (uint32) -1;
+static TransactionId set_xid = 0;
+static Oid     set_oid = 0;
+static MultiXactId set_mxid = 0;
+static MultiXactOffset set_mxoff = (MultiXactOffset) -1;
+static uint32 minXlogTli = 0;
+static XLogSegNo minXlogSegNo = 0;
 
 static bool ReadControlFile(void);
 static void GuessControlValues(void);
 static void PrintControlValues(bool guessed);
+static void PrintNewControlValues(void);
 static void RewriteControlFile(void);
 static void FindEndOfXLOG(void);
 static void KillExistingXLOG(void);
@@ -82,14 +90,7 @@ main(int argc, char *argv[])
        int                     c;
        bool            force = false;
        bool            noupdate = false;
-       uint32          set_xid_epoch = (uint32) -1;
-       TransactionId set_xid = 0;
-       Oid                     set_oid = 0;
-       MultiXactId set_mxid = 0;
        MultiXactId set_oldestmxid = 0;
-       MultiXactOffset set_mxoff = (MultiXactOffset) -1;
-       uint32          minXlogTli = 0;
-       XLogSegNo       minXlogSegNo = 0;
        char       *endptr;
        char       *endptr2;
        char       *DataDir;
@@ -301,6 +302,13 @@ main(int argc, char *argv[])
         */
        FindEndOfXLOG();
 
+       /*
+        * If we're not going to proceed with the reset, print the current control
+        * file parameters.
+        */
+       if ((guessed && !force) || noupdate)
+               PrintControlValues(guessed);
+
        /*
         * Adjust fields if required by switches.  (Do this now so that printout,
         * if any, includes these values.)
@@ -356,7 +364,7 @@ main(int argc, char *argv[])
         */
        if ((guessed && !force) || noupdate)
        {
-               PrintControlValues(guessed);
+               PrintNewControlValues();
                if (!noupdate)
                {
                        printf(_("\nIf these values seem acceptable, use -f to force reset.\n"));
@@ -556,12 +564,11 @@ static void
 PrintControlValues(bool guessed)
 {
        char            sysident_str[32];
-       char            fname[MAXFNAMELEN];
 
        if (guessed)
                printf(_("Guessed pg_control values:\n\n"));
        else
-               printf(_("pg_control values:\n\n"));
+               printf(_("Current pg_control values:\n\n"));
 
        /*
         * Format system_identifier separately to keep platform-dependent format
@@ -570,10 +577,6 @@ PrintControlValues(bool guessed)
        snprintf(sysident_str, sizeof(sysident_str), UINT64_FORMAT,
                         ControlFile.system_identifier);
 
-       XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID, newXlogSegNo);
-
-       printf(_("First log segment after reset:        %s\n"),
-                  fname);
        printf(_("pg_control version number:            %u\n"),
                   ControlFile.pg_control_version);
        printf(_("Catalog version number:               %u\n"),
@@ -631,6 +634,60 @@ PrintControlValues(bool guessed)
 }
 
 
+/*
+ * Print the values to be changed.
+ */
+static void
+PrintNewControlValues()
+{
+       char            fname[MAXFNAMELEN];
+
+       /* This will be always printed in order to keep format same. */
+       printf(_("\n\nValues to be changed:\n\n"));
+
+       XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID, newXlogSegNo);
+       printf(_("First log segment after reset:        %s\n"), fname);
+
+       if (set_mxid != 0)
+       {
+               printf(_("NextMultiXactId:                      %u\n"),
+                          ControlFile.checkPointCopy.nextMulti);
+               printf(_("OldestMultiXid:                       %u\n"),
+                          ControlFile.checkPointCopy.oldestMulti);
+               printf(_("OldestMulti's DB:                     %u\n"),
+                          ControlFile.checkPointCopy.oldestMultiDB);
+       }
+
+       if (set_mxoff != -1)
+       {
+               printf(_("NextMultiOffset:                      %u\n"),
+                          ControlFile.checkPointCopy.nextMultiOffset);
+       }
+
+       if (set_oid != 0)
+       {
+               printf(_("NextOID:                              %u\n"),
+                          ControlFile.checkPointCopy.nextOid);
+       }
+
+       if (set_xid != 0)
+       {
+               printf(_("NextXID:                              %u\n"),
+                          ControlFile.checkPointCopy.nextXid);
+               printf(_("OldestXID:                            %u\n"),
+                          ControlFile.checkPointCopy.oldestXid);
+               printf(_("OldestXID's DB:                       %u\n"),
+                          ControlFile.checkPointCopy.oldestXidDB);
+       }
+
+       if (set_xid_epoch != -1)
+       {
+               printf(_("NextXID Epoch:                        %u\n"),
+                          ControlFile.checkPointCopy.nextXidEpoch);
+       }
+}
+
+
 /*
  * Write out the new pg_control file.
  */
@@ -1039,7 +1096,7 @@ usage(void)
        printf(_("  -f               force update to be done\n"));
        printf(_("  -l XLOGFILE      force minimum WAL starting location for new transaction log\n"));
        printf(_("  -m MXID,MXID     set next and oldest multitransaction ID\n"));
-       printf(_("  -n               no update, just show extracted control values (for testing)\n"));
+       printf(_("  -n               no update, just show what would be done (for testing)\n"));
        printf(_("  -o OID           set next OID\n"));
        printf(_("  -O OFFSET        set next multitransaction offset\n"));
        printf(_("  -V, --version    output version information, then exit\n"));