From 8136a56cb63ff846b30998d88f211ffff68e0e5b Mon Sep 17 00:00:00 2001
From: Nazir Bilal Yavuz <byavuz81@gmail.com>
Date: Tue, 1 Apr 2025 15:38:51 +0300
Subject: [PATCH v8 3/3] Refactor code more

---
 contrib/pg_prewarm/autoprewarm.c | 116 ++++++++++++++-----------------
 1 file changed, 51 insertions(+), 65 deletions(-)

diff --git a/contrib/pg_prewarm/autoprewarm.c b/contrib/pg_prewarm/autoprewarm.c
index 4f635eaf31c..1f31d6eaa0e 100644
--- a/contrib/pg_prewarm/autoprewarm.c
+++ b/contrib/pg_prewarm/autoprewarm.c
@@ -550,6 +550,7 @@ autoprewarm_database_main(Datum main_arg)
 	 */
 	while (pos < stop_idx && have_free_buffer())
 	{
+		Oid			reloid;
 		BlockInfoRecord *blk = &block_info[pos];
 
 		/*
@@ -564,91 +565,76 @@ autoprewarm_database_main(Datum main_arg)
 				break;
 		}
 
-		/*
-		 * Close the old relation. Note that rel will be NULL if
-		 * try_relation_open failed previously; in that case, there is nothing
-		 * to close.
-		 */
-		if (rel)
-		{
-			relation_close(rel, AccessShareLock);
-			rel = NULL;
-			CommitTransactionCommand();
-		}
+		/* Try to open new relation. */
+		StartTransactionCommand();
+		reloid = RelidByRelfilenumber(blk->tablespace, blk->filenumber);
+		if (OidIsValid(reloid))
+			rel = try_relation_open(reloid, AccessShareLock);
 
-		/*
-		 * Try to open each new relation, but only once, when we first
-		 * encounter it. If it's been dropped, skip the associated blocks.
-		 */
 		if (!rel)
 		{
-			Oid			reloid;
-
-			StartTransactionCommand();
-			reloid = RelidByRelfilenumber(blk->tablespace, blk->filenumber);
-			if (OidIsValid(reloid))
-				rel = try_relation_open(reloid, AccessShareLock);
+			CommitTransactionCommand();
 
-			if (!rel)
+			/* Move to next filenumber. */
+			while (pos < stop_idx && have_free_buffer())
 			{
-				CommitTransactionCommand();
-
-				/* Move to next filenumber. */
-				while (true)
-				{
-					BlockInfoRecord cur_blk = block_info[pos++];
+				BlockInfoRecord cur_blk = block_info[pos++];
 
-					if (cur_blk.database != blk->database ||
-						cur_blk.filenumber != blk->filenumber)
-						break;
-				}
-
-				continue;
+				if (cur_blk.database != blk->database ||
+					cur_blk.filenumber != blk->filenumber)
+					break;
 			}
-			else if (smgrexists(RelationGetSmgr(rel), blk->forknum))
-			{
-				unsigned int nblocks_processed;
 
-				nblocks_in_fork = RelationGetNumberOfBlocksInFork(rel, blk->forknum);
-				nblocks_processed = autoprewarm_prewarm_relation(rel,
-																 pos,
-																 stop_idx,
-																 nblocks_in_fork,
-																 block_info);
+			continue;
+		}
+		else if (smgrexists(RelationGetSmgr(rel), blk->forknum))
+		{
+			unsigned int nblocks_processed;
 
-				apw_state->prewarmed_blocks += nblocks_processed;
+			nblocks_in_fork = RelationGetNumberOfBlocksInFork(rel, blk->forknum);
+			nblocks_processed = autoprewarm_prewarm_relation(rel,
+															 pos,
+															 stop_idx,
+															 nblocks_in_fork,
+															 block_info);
 
-				/* Move pos forward by at least one. */
-				pos += Max(nblocks_processed, 1);
+			apw_state->prewarmed_blocks += nblocks_processed;
 
-				/* Move to next forknum. */
-				while (true)
-				{
-					BlockInfoRecord cur_blk = block_info[pos];
+			/* Move pos forward by at least one. */
+			pos += Max(nblocks_processed, 1);
 
-					if (cur_blk.database == blk->database &&
-						cur_blk.filenumber == blk->filenumber &&
-						cur_blk.forknum == blk->forknum)
-						pos++;
-					else
-						break;
-				}
+			/* Move to next forknum. */
+			while (pos < stop_idx && have_free_buffer())
+			{
+				BlockInfoRecord cur_blk = block_info[pos];
 
-				continue;
+				if (cur_blk.database == blk->database &&
+					cur_blk.filenumber == blk->filenumber &&
+					cur_blk.forknum == blk->forknum)
+					pos++;
+				else
+					break;
 			}
+
+			/* Close the relation. */
+			relation_close(rel, AccessShareLock);
+			rel = NULL;
+			CommitTransactionCommand();
+
+			continue;
+		}
+		else
+		{
+			/* Close the relation. */
+			relation_close(rel, AccessShareLock);
+			rel = NULL;
+			CommitTransactionCommand();
 		}
 
 		pos++;
 	}
 
 	dsm_detach(seg);
-
-	/* Release lock on previous relation. */
-	if (rel)
-	{
-		relation_close(rel, AccessShareLock);
-		CommitTransactionCommand();
-	}
 }
 
 /*
-- 
2.43.0

