From 5b0b02de3eaacce089ade50850782da6d58d6e82 Mon Sep 17 00:00:00 2001
From: Matthias van de Meent <boekewurm+postgres@gmail.com>
Date: Sat, 21 Dec 2024 02:15:32 +0100
Subject: [PATCH v2] 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 <thomas.munro@gmail.com>
---
 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 11fccda475f..e94ea9d2c9f 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -116,8 +116,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,
@@ -382,7 +381,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;
 	}
 
@@ -1406,15 +1405,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));
@@ -1813,6 +1813,9 @@ mdunlinkfiletag(const FileTag *ftag, char *path)
 {
 	char	   *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, MAXPGPATH);
-- 
2.45.2

