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"));