On Mon, 2023-01-16 at 19:59 +0100, Torsten Förtsch wrote: > not sure if this is known behavior. > > Server version is 14.6 (Debian 14.6-1.pgdg110+1). > > In a PITR setup I have these settings: > > recovery_target_xid = '852381' > recovery_target_inclusive = 'false' > > In the log file I see this message: > > LOG: recovery stopping before commit of transaction 852381, time 2000-01-01 > 00:00:00+00 > > But: > > postgres=# select * from pg_last_committed_xact(); > xid | timestamp | roident > --------+-------------------------------+--------- > 852380 | 2023-01-16 18:00:35.054495+00 | 0 > > So, the timestamp displayed in the log message is certainly wrong.
Redirected to -hackers. If recovery stops at a WAL record that has no timestamp, you get this bogus recovery stop time. I think we should show the recovery stop time only if time was the target, as in the attached patch. Yours, Laurenz Albe
From 622e52bbd652fc8872448e46c3ca0bc78dd847fe Mon Sep 17 00:00:00 2001 From: Laurenz Albe <laurenz.a...@cybertec.at> Date: Tue, 17 Jan 2023 10:38:40 +0100 Subject: [PATCH] Don't show bogus recovery stop time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If target for archive recovery was different from time, the WAL record that ended recovery might not have a timestamp. In that case, the log message at the end of recovery would show a recovery time of midnight on 2000-01-01. Reported-by: Torsten Förtsch Author: Laurenz Albe Discussion: https://postgr.es/m/cakkg4_kuevpqbmyoflajx7opaqk6cvwkvx0hrcfjspfrptx...@mail.gmail.com --- src/backend/access/transam/xlogrecovery.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index bc3c3eb3e7..ce3718ca2d 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -2570,19 +2570,21 @@ recoveryStopsBefore(XLogReaderState *record) recoveryStopLSN = InvalidXLogRecPtr; recoveryStopName[0] = '\0'; - if (isCommit) + /* for targets other than time, we might have no stop time */ + if (recoveryTarget == RECOVERY_TARGET_XID) { ereport(LOG, - (errmsg("recovery stopping before commit of transaction %u, time %s", + (errmsg("recovery stopping before %s of transaction %u, time %s", + (isCommit ? "commit" : "abort"), recoveryStopXid, timestamptz_to_str(recoveryStopTime)))); } else { ereport(LOG, - (errmsg("recovery stopping before abort of transaction %u, time %s", - recoveryStopXid, - timestamptz_to_str(recoveryStopTime)))); + (errmsg("recovery stopping before %s of transaction %u", + (isCommit ? "commit" : "abort"), + recoveryStopXid))); } } -- 2.39.0