Alvaro Herrera <[email protected]> wrote:
> On 2019-Nov-22, Antonin Houska wrote:
>
> > As I pointed out in
> >
> > https://www.postgresql.org/message-id/88183.1574261429%40antos
> >
> > seg.ws_off only replaced readOff in XLogReaderState. So we should only
> > update
> > ws_off where readOff was updated before commit 709d003. This does happen in
> > ReadPageInternal (see HEAD) and I see no reason for the final patch to
> > update
> > ws_off anywhere else.
>
> Oh you're right.
>
> I see no reason to leave ws_off. We can move that to XLogReaderState; I
> did that here. We also need the offset in WALReadError, though, so I
> added it there too. Conceptually it seems clearer to me this way.
>
> What do you think of the attached?
It looks good to me. Attached is just a fix of a minor problem in error
reporting that Michael pointed out earlier.
> BTW I'm not clear what errors can pread()/pg_pread() report that do not
> set errno. I think lines 1083/1084 of WALRead are spurious now.
All I can say is that the existing calls of pg_pread() do not clear errno, so
you may be right. I'd appreciate more background about the "partial read" that
Michael mentions here:
https://www.postgresql.org/message-id/20191125033048.GG37821%40paquier.xyz
--
Antonin Houska
Web: https://www.cybertec-postgresql.com
diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c
index 04124bc254..eda81c1df1 100644
--- a/src/bin/pg_waldump/pg_waldump.c
+++ b/src/bin/pg_waldump/pg_waldump.c
@@ -354,9 +354,11 @@ WALDumpReadPage(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen,
state->segcxt.ws_segsize);
if (errinfo.wre_errno != 0)
- fatal_error("could not read in file %s, offset %u, length %zu: %s",
- fname, errinfo.wre_off, (Size) errinfo.wre_req,
- strerror(errinfo.wre_errno));
+ {
+ errno = errinfo.wre_errno;
+ fatal_error("could not read in file %s, offset %u, length %zu: %m",
+ fname, errinfo.wre_off, (Size) errinfo.wre_req);
+ }
else
fatal_error("could not read in file %s, offset %u: length: %zu",
fname, errinfo.wre_off, (Size) errinfo.wre_req);