Re: Review: Patch to compute Max LSN of Data Pages

From: Robert Haas <robertmhaas(at)gmail(dot)com>
To: Hari Babu <haribabu(dot)kommi(at)huawei(dot)com>
Cc: Josh Berkus <josh(at)agliodbs(dot)com>, Amit kapila <amit(dot)kapila(at)huawei(dot)com>, Andres Freund <andres(at)2ndquadrant(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: Review: Patch to compute Max LSN of Data Pages
Date: 2013-07-04 17:48:35
Message-ID: CA+Tgmob4rHHn8FtGSeXHxOGPw34bt5V1Lc52rkfdnZkp7AiGkA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

This looks better.

+ fprintf(stderr, _("%s: .. file \"%s\" for seeking: %s\n"),
+ progname, filename, strerror(errno));

Weird error message style - what's with the ".."?

+ fprintf(stderr, _("%s: .. file \"%s\" length is more than segment
size: %d.\n"),
+ progname, filename, RELSEG_SIZE);

Again.

+ fprintf(stderr, _("%s: could not seek to next page \"%s\": %s\n"),
+ progname, filename, strerror(errno));

I think this should be written as: could not seek to offset NUMBER in
file "PATH"

+ fprintf(stderr, _("%s: could not read file \"%s\": %s\n"),
+ progname, filename, strerror(errno));

And this one as: could not read file "PATH" at offset NUMBER

+ printf("File:%s Maximum LSN found is: %X/%X \nWAL segment file
name (fileid,seg): %X/%X\n",

I think that we don't need to display the WAL segment file name for
the per-file progress updates. Instead, let's show the block number
where that LSN was found, like this:

Highest LSN for file "%s" is %X/%X in block %u.

The overall output can stay as you have it.

+ if (0 != result)

Coding style.

+ static int
+ FindMaxLSNinFile(char *filename, XLogRecPtr *maxlsn)

It seems that this function, and a few others, use -1 for a failure
return, 0 for success, and all others undefined. Although this is a
defensible choice, I think it would be more PG-like to make the return
value bool and use true for success and false for failure.

+ if (S_ISREG(statbuf.st_mode))
+ (void) FindMaxLSNinFile(pathbuf, maxlsn);
+ else
+ (void) FindMaxLSNinDir(pathbuf, maxlsn);

I don't see why we're throwing away the return value here. I would
expect the function to have a "bool result = true" at the top and sent
result = false if one of these functions returns false. At the end,
it returns result.

+ This utility can only be run by the user who installed the server, because
+ it requires read/write access to the data directory.

False.

+ LsnSearchPath = argv[optind];
+
+ if (LsnSearchPath == NULL)
+ LsnSearchPath = getenv("PGDATA");

I think you should write the code so that the tool loops over its
input arguments; if none, it processes $PGDATA. (Don't forget to
update the syntax synopsis and documentation to match.)

I think the documentation should say something about the intended uses
of this tool, including cautions against using it for things to which
it is not well-suited. I guess the threshold question for this patch
is whether those uses are enough to justify including the tool in the
core distribution.

--
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Fujii Masao 2013-07-04 17:49:10 Re: Support for REINDEX CONCURRENTLY
Previous Message Bruce Momjian 2013-07-04 16:26:50 Re: strange IS NULL behaviour