Alvaro Herrera <alvhe...@2ndquadrant.com> 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);