bgwritter_or_checkpoint_proc_moving_buf_to_freelist.patch

text/plain

Filename: bgwritter_or_checkpoint_proc_moving_buf_to_freelist.patch
Type: text/plain
Part: 0
Message: [WIP PATCH] for Performance Improvement in Buffer Management

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: unified
File+
src/backend/storage/buffer/bufmgr.c 28 2
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index dba19eb..2b9cfbb 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -1660,8 +1660,20 @@ SyncOneBuffer(int buf_id, bool skip_recently_used)
 
 	if (!(bufHdr->flags & BM_VALID) || !(bufHdr->flags & BM_DIRTY))
 	{
-		/* It's clean, so nothing to do */
-		UnlockBufHdr(bufHdr);
+		/*
+		 * If the buffer is unused then move it to freelist
+		 */
+		if ((bufHdr->flags & BM_VALID)
+			&& (bufHdr->refcount == 0 && bufHdr->usage_count == 0)
+			&& (bufHdr->freeNext == FREENEXT_NOT_IN_LIST))
+		{
+			InvalidateBuffer(bufHdr);
+		}
+		else
+		{
+			/* It's clean, so nothing to do */
+			UnlockBufHdr(bufHdr);
+		}
 		return result;
 	}
 
@@ -1677,6 +1689,20 @@ SyncOneBuffer(int buf_id, bool skip_recently_used)
 	LWLockRelease(bufHdr->content_lock);
 	UnpinBuffer(bufHdr, true);
 
+
+	/*
+	 * If the buffer is unused then move it to freelist
+	 */
+	LockBufHdr(bufHdr);
+	if (bufHdr->refcount == 0 && bufHdr->usage_count == 0)
+	{
+		InvalidateBuffer(bufHdr);
+	}
+	else
+	{
+		UnlockBufHdr(bufHdr);
+	}
+
 	return result | BUF_WRITTEN;
 }