Re: pg_rewind WAL segments deletion pitfall - Mailing list pgsql-hackers

From Alexander Kukushkin
Subject Re: pg_rewind WAL segments deletion pitfall
Date
Msg-id CAFh8B==NeH=4c-3Fz3uvra-WyTQYY7QkH95m-vZNPOw2YK_KjQ@mail.gmail.com
Whole thread Raw
In response to Re: pg_rewind WAL segments deletion pitfall  (Sutou Kouhei <kou@clear-code.com>)
List pgsql-hackers
Hi Sutou,

Thank you for picking it up!

On Fri, 12 Jul 2024 at 09:24, Sutou Kouhei <kou@clear-code.com> wrote:

Here are my review comments:

@@ -217,6 +221,26 @@ findLastCheckpoint(const char *datadir, XLogRecPtr forkptr, int tliIndex,
+                       char            xlogfname[MAXFNAMELEN];
+
+                       tli = xlogreader->seg.ws_tli;
+                       segno = xlogreader->seg.ws_segno;
+
+                       snprintf(xlogfname, MAXPGPATH, XLOGDIR "/");
+                       XLogFileName(xlogfname + strlen(xlogfname),
+                                                xlogreader->seg.ws_tli,
+                                                xlogreader->seg.ws_segno, WalSegSz);
+
+                       /*
+                        * Make sure pg_rewind doesn't remove this file, because it is
+                        * required for postgres to start after rewind.
+                        */
+                       insert_keepwalhash_entry(xlogfname);

MAXFNAMELEN is 64 and MAXPGPATH is 1024. strlen(XLOGDIR "/")
is 7 because XLOGDIR is "pg_wal". So xlogfname has enough
size but snprintf(xlogfname, MAXPGPATH) is wrong usage.
(And XLogFileName() uses snprintf(xlogfname, MAXFNAMELEN)
internally.)

Nice catch!

I don't think we need another buffer here, just need to use MAXFNAMELEN, because strlen("pg_wal/$wal_filename") + 1 = 32 perfectly fits into 64 bytes.

The new version is attached.

Regards,
--
Alexander Kukushkin
Attachment

pgsql-hackers by date:

Previous
From: Bertrand Drouvot
Date:
Subject: Re: Restart pg_usleep when interrupted
Next
From: Rafia Sabih
Date:
Subject: Re: Things I don't like about \du's "Attributes" column