From 927bb883f48bed9984c37eccb1251036bca5634a Mon Sep 17 00:00:00 2001 From: Matthias van de Meent Date: Sat, 21 Dec 2024 02:15:32 +0100 Subject: [PATCH] MD smgr: Clarify FileTag-based unlinking Only "tombstone" files (first segment of main fork) are unlinked after checkpoints, so make sure that the register function is clear about this. Additionally, add an assertion in mdunlinkfiletag that the FileTag only contains expected values. Reviewed-by: Thomas Munro --- src/backend/storage/smgr/md.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index f99c9d900134..1ef27ebffab7 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -137,8 +137,7 @@ static void mdunlinkfork(RelFileLocatorBackend rlocator, ForkNumber forknum, static MdfdVec *mdopenfork(SMgrRelation reln, ForkNumber forknum, int behavior); static void register_dirty_segment(SMgrRelation reln, ForkNumber forknum, MdfdVec *seg); -static void register_unlink_segment(RelFileLocatorBackend rlocator, ForkNumber forknum, - BlockNumber segno); +static void register_unlink_tombstone(RelFileLocatorBackend rlocator); static void register_forget_request(RelFileLocatorBackend rlocator, ForkNumber forknum, BlockNumber segno); static void _fdvec_resize(SMgrRelation reln, @@ -410,7 +409,7 @@ mdunlinkfork(RelFileLocatorBackend rlocator, ForkNumber forknum, bool isRedo) /* Register request to unlink first segment later */ save_errno = errno; - register_unlink_segment(rlocator, forknum, 0 /* first seg */ ); + register_unlink_tombstone(rlocator); errno = save_errno; } @@ -1532,15 +1531,16 @@ register_dirty_segment(SMgrRelation reln, ForkNumber forknum, MdfdVec *seg) } /* - * register_unlink_segment() -- Schedule a file to be deleted after next checkpoint + * register_unlink_tombstone() + * + * Schedule a file to be deleted after next checkpoint */ static void -register_unlink_segment(RelFileLocatorBackend rlocator, ForkNumber forknum, - BlockNumber segno) +register_unlink_tombstone(RelFileLocatorBackend rlocator) { FileTag tag; - INIT_MD_FILETAG(tag, rlocator.locator, forknum, segno); + INIT_MD_FILETAG(tag, rlocator.locator, MAIN_FORKNUM, 0); /* Should never be used with temp relations */ Assert(!RelFileLocatorBackendIsTemp(rlocator)); @@ -1933,6 +1933,9 @@ mdunlinkfiletag(const FileTag *ftag, char *path) { RelPathStr p; + /* We only unlink tombstone files through this mechanism */ + Assert(ftag->forknum == MAIN_FORKNUM && ftag->segno == 0); + /* Compute the path. */ p = relpathperm(ftag->rlocator, MAIN_FORKNUM); strlcpy(path, p.str, MAXPGPATH);