Display old and new values in pg_resetxlog -n output.

For extra clarity.

Rajeev Rastogi, reviewed by Amit Kapila
This commit is contained in:
Heikki Linnakangas 2013-12-12 11:54:57 +02:00
parent 22310b808d
commit 108e3992cd
2 changed files with 76 additions and 18 deletions

View 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>

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