Skip to content

Commit ce9bb92

Browse files
committed
Add -f/--follow option to pg_xlogdump.
This is useful for seeing what WAL records are inserted in real-time, by pointing pg_xlogdump to a live server.
1 parent 86cf41e commit ce9bb92

File tree

2 files changed

+39
-3
lines changed

2 files changed

+39
-3
lines changed

contrib/pg_xlogdump/pg_xlogdump.c

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ typedef struct XLogDumpPrivate
3232
char *inpath;
3333
XLogRecPtr startptr;
3434
XLogRecPtr endptr;
35+
bool endptr_reached;
3536
} XLogDumpPrivate;
3637

3738
typedef struct XLogDumpConfig
@@ -40,6 +41,7 @@ typedef struct XLogDumpConfig
4041
bool bkp_details;
4142
int stop_after_records;
4243
int already_displayed_records;
44+
bool follow;
4345

4446
/* filter options */
4547
int filter_by_rmgr;
@@ -308,7 +310,10 @@ XLogDumpReadPage(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen,
308310
else if (targetPagePtr + reqLen <= private->endptr)
309311
count = private->endptr - targetPagePtr;
310312
else
313+
{
314+
private->endptr_reached = true;
311315
return -1;
316+
}
312317
}
313318

314319
XLogDumpXLogRead(private->inpath, private->timeline, targetPagePtr,
@@ -386,6 +391,7 @@ usage(void)
386391
printf("\nOptions:\n");
387392
printf(" -b, --bkp-details output detailed information about backup blocks\n");
388393
printf(" -e, --end=RECPTR stop reading at log position RECPTR\n");
394+
printf(" -f, --follow keep retrying after reaching end of WAL\n");
389395
printf(" -n, --limit=N number of records to display\n");
390396
printf(" -p, --path=PATH directory in which to find log segment files\n");
391397
printf(" (default: ./pg_xlog)\n");
@@ -414,6 +420,7 @@ main(int argc, char **argv)
414420
static struct option long_options[] = {
415421
{"bkp-details", no_argument, NULL, 'b'},
416422
{"end", required_argument, NULL, 'e'},
423+
{"follow", no_argument, NULL, 'f'},
417424
{"help", no_argument, NULL, '?'},
418425
{"limit", required_argument, NULL, 'n'},
419426
{"path", required_argument, NULL, 'p'},
@@ -436,10 +443,12 @@ main(int argc, char **argv)
436443
private.timeline = 1;
437444
private.startptr = InvalidXLogRecPtr;
438445
private.endptr = InvalidXLogRecPtr;
446+
private.endptr_reached = false;
439447

440448
config.bkp_details = false;
441449
config.stop_after_records = -1;
442450
config.already_displayed_records = 0;
451+
config.follow = false;
443452
config.filter_by_rmgr = -1;
444453
config.filter_by_xid = InvalidTransactionId;
445454
config.filter_by_xid_enabled = false;
@@ -450,7 +459,7 @@ main(int argc, char **argv)
450459
goto bad_argument;
451460
}
452461

453-
while ((option = getopt_long(argc, argv, "be:?n:p:r:s:t:Vx:",
462+
while ((option = getopt_long(argc, argv, "be:?fn:p:r:s:t:Vx:",
454463
long_options, &optindex)) != -1)
455464
{
456465
switch (option)
@@ -467,6 +476,9 @@ main(int argc, char **argv)
467476
}
468477
private.endptr = (uint64) xlogid << 32 | xrecoff;
469478
break;
479+
case 'f':
480+
config.follow = true;
481+
break;
470482
case '?':
471483
usage();
472484
exit(EXIT_SUCCESS);
@@ -683,9 +695,22 @@ main(int argc, char **argv)
683695
(uint32) (first_record >> 32), (uint32) first_record,
684696
(uint32) (first_record - private.startptr));
685697

686-
while ((record = XLogReadRecord(xlogreader_state, first_record, &errormsg)))
698+
for (;;)
687699
{
688-
/* continue after the last record */
700+
/* try to read the next record */
701+
record = XLogReadRecord(xlogreader_state, first_record, &errormsg);
702+
if (!record)
703+
{
704+
if (!config.follow || private.endptr_reached)
705+
break;
706+
else
707+
{
708+
sleep(1);
709+
continue;
710+
}
711+
}
712+
713+
/* after reading the first record, continue at next one */
689714
first_record = InvalidXLogRecPtr;
690715
XLogDumpDisplayRecord(&config, xlogreader_state->ReadRecPtr, record);
691716

doc/src/sgml/pg_xlogdump.sgml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,17 @@ PostgreSQL documentation
9191
</listitem>
9292
</varlistentry>
9393

94+
<varlistentry>
95+
<term><option>-f</option></term>
96+
<term><option>--follow</option></term>
97+
<listitem>
98+
<para>
99+
After reaching the end of valid WAL, keep polling once per second for
100+
new WAL to appear.
101+
</para>
102+
</listitem>
103+
</varlistentry>
104+
94105
<varlistentry>
95106
<term><option>-n <replaceable>limit</replaceable></option></term>
96107
<term><option>--limit=<replaceable>limit</replaceable></option></term>

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