Skip to content

Commit 108e399

Browse files
committed
Display old and new values in pg_resetxlog -n output.
For extra clarity. Rajeev Rastogi, reviewed by Amit Kapila
1 parent 22310b8 commit 108e399

File tree

2 files changed

+76
-18
lines changed

2 files changed

+76
-18
lines changed

doc/src/sgml/ref/pg_resetxlog.sgml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,10 @@ PostgreSQL documentation
177177
<para>
178178
The <option>-n</> (no operation) option instructs
179179
<command>pg_resetxlog</command> to print the values reconstructed from
180-
<filename>pg_control</> and then exit without modifying anything.
181-
This is mainly a debugging tool, but can be useful as a sanity check
182-
before allowing <command>pg_resetxlog</command> to proceed for real.
180+
<filename>pg_control</> and values about to be changed, and then exit
181+
without modifying anything. This is mainly a debugging tool, but can be
182+
useful as a sanity check before allowing <command>pg_resetxlog</command>
183+
to proceed for real.
183184
</para>
184185

185186
<para>

src/bin/pg_resetxlog/pg_resetxlog.c

Lines changed: 72 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,18 @@ static ControlFileData ControlFile; /* pg_control values */
6464
static XLogSegNo newXlogSegNo; /* new XLOG segment # */
6565
static bool guessed = false; /* T if we had to guess at any values */
6666
static const char *progname;
67+
static uint32 set_xid_epoch = (uint32) -1;
68+
static TransactionId set_xid = 0;
69+
static Oid set_oid = 0;
70+
static MultiXactId set_mxid = 0;
71+
static MultiXactOffset set_mxoff = (MultiXactOffset) -1;
72+
static uint32 minXlogTli = 0;
73+
static XLogSegNo minXlogSegNo = 0;
6774

6875
static bool ReadControlFile(void);
6976
static void GuessControlValues(void);
7077
static void PrintControlValues(bool guessed);
78+
static void PrintNewControlValues(void);
7179
static void RewriteControlFile(void);
7280
static void FindEndOfXLOG(void);
7381
static void KillExistingXLOG(void);
@@ -82,14 +90,7 @@ main(int argc, char *argv[])
8290
int c;
8391
bool force = false;
8492
bool noupdate = false;
85-
uint32 set_xid_epoch = (uint32) -1;
86-
TransactionId set_xid = 0;
87-
Oid set_oid = 0;
88-
MultiXactId set_mxid = 0;
8993
MultiXactId set_oldestmxid = 0;
90-
MultiXactOffset set_mxoff = (MultiXactOffset) -1;
91-
uint32 minXlogTli = 0;
92-
XLogSegNo minXlogSegNo = 0;
9394
char *endptr;
9495
char *endptr2;
9596
char *DataDir;
@@ -301,6 +302,13 @@ main(int argc, char *argv[])
301302
*/
302303
FindEndOfXLOG();
303304

305+
/*
306+
* If we're not going to proceed with the reset, print the current control
307+
* file parameters.
308+
*/
309+
if ((guessed && !force) || noupdate)
310+
PrintControlValues(guessed);
311+
304312
/*
305313
* Adjust fields if required by switches. (Do this now so that printout,
306314
* if any, includes these values.)
@@ -356,7 +364,7 @@ main(int argc, char *argv[])
356364
*/
357365
if ((guessed && !force) || noupdate)
358366
{
359-
PrintControlValues(guessed);
367+
PrintNewControlValues();
360368
if (!noupdate)
361369
{
362370
printf(_("\nIf these values seem acceptable, use -f to force reset.\n"));
@@ -556,12 +564,11 @@ static void
556564
PrintControlValues(bool guessed)
557565
{
558566
char sysident_str[32];
559-
char fname[MAXFNAMELEN];
560567

561568
if (guessed)
562569
printf(_("Guessed pg_control values:\n\n"));
563570
else
564-
printf(_("pg_control values:\n\n"));
571+
printf(_("Current pg_control values:\n\n"));
565572

566573
/*
567574
* Format system_identifier separately to keep platform-dependent format
@@ -570,10 +577,6 @@ PrintControlValues(bool guessed)
570577
snprintf(sysident_str, sizeof(sysident_str), UINT64_FORMAT,
571578
ControlFile.system_identifier);
572579

573-
XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID, newXlogSegNo);
574-
575-
printf(_("First log segment after reset: %s\n"),
576-
fname);
577580
printf(_("pg_control version number: %u\n"),
578581
ControlFile.pg_control_version);
579582
printf(_("Catalog version number: %u\n"),
@@ -631,6 +634,60 @@ PrintControlValues(bool guessed)
631634
}
632635

633636

637+
/*
638+
* Print the values to be changed.
639+
*/
640+
static void
641+
PrintNewControlValues()
642+
{
643+
char fname[MAXFNAMELEN];
644+
645+
/* This will be always printed in order to keep format same. */
646+
printf(_("\n\nValues to be changed:\n\n"));
647+
648+
XLogFileName(fname, ControlFile.checkPointCopy.ThisTimeLineID, newXlogSegNo);
649+
printf(_("First log segment after reset: %s\n"), fname);
650+
651+
if (set_mxid != 0)
652+
{
653+
printf(_("NextMultiXactId: %u\n"),
654+
ControlFile.checkPointCopy.nextMulti);
655+
printf(_("OldestMultiXid: %u\n"),
656+
ControlFile.checkPointCopy.oldestMulti);
657+
printf(_("OldestMulti's DB: %u\n"),
658+
ControlFile.checkPointCopy.oldestMultiDB);
659+
}
660+
661+
if (set_mxoff != -1)
662+
{
663+
printf(_("NextMultiOffset: %u\n"),
664+
ControlFile.checkPointCopy.nextMultiOffset);
665+
}
666+
667+
if (set_oid != 0)
668+
{
669+
printf(_("NextOID: %u\n"),
670+
ControlFile.checkPointCopy.nextOid);
671+
}
672+
673+
if (set_xid != 0)
674+
{
675+
printf(_("NextXID: %u\n"),
676+
ControlFile.checkPointCopy.nextXid);
677+
printf(_("OldestXID: %u\n"),
678+
ControlFile.checkPointCopy.oldestXid);
679+
printf(_("OldestXID's DB: %u\n"),
680+
ControlFile.checkPointCopy.oldestXidDB);
681+
}
682+
683+
if (set_xid_epoch != -1)
684+
{
685+
printf(_("NextXID Epoch: %u\n"),
686+
ControlFile.checkPointCopy.nextXidEpoch);
687+
}
688+
}
689+
690+
634691
/*
635692
* Write out the new pg_control file.
636693
*/
@@ -1039,7 +1096,7 @@ usage(void)
10391096
printf(_(" -f force update to be done\n"));
10401097
printf(_(" -l XLOGFILE force minimum WAL starting location for new transaction log\n"));
10411098
printf(_(" -m MXID,MXID set next and oldest multitransaction ID\n"));
1042-
printf(_(" -n no update, just show extracted control values (for testing)\n"));
1099+
printf(_(" -n no update, just show what would be done (for testing)\n"));
10431100
printf(_(" -o OID set next OID\n"));
10441101
printf(_(" -O OFFSET set next multitransaction offset\n"));
10451102
printf(_(" -V, --version output version information, then exit\n"));

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy