From 64e196b6efbd58893a4381013a35c84b167b4856 Mon Sep 17 00:00:00 2001
From: Simon Riggs <simon@2ndQuadrant.com>
Date: Sun, 16 Sep 2012 19:53:34 +0100
Subject: [PATCH] Fix bufmgr so CHECKPOINT_END_OF_RECOVERY behaves as a
 shutdown checkpoint. Recovery code documents clearly that a shutdown
 checkpoint is executed at end of recovery - a shutdown checkpoint WAL record
 is written but the buffer manager had been altered to treat end of recovery
 as a normal checkpoint. This bug exacerbates the bufmgr relpersistence bug.

Bug spotted by Andres Freund, patch by me.
---
 src/backend/storage/buffer/bufmgr.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c
index ff92360155d..56095b32501 100644
--- a/src/backend/storage/buffer/bufmgr.c
+++ b/src/backend/storage/buffer/bufmgr.c
@@ -1206,9 +1206,9 @@ BufferSync(int flags)
 
 	/*
 	 * Unless this is a shutdown checkpoint, we write only permanent, dirty
-	 * buffers.  But at shutdown time, we write all dirty buffers.
+	 * buffers.  But at shutdown or end of recovery, we write all dirty buffers.
 	 */
-	if (!(flags & CHECKPOINT_IS_SHUTDOWN))
+	if (!((flags & CHECKPOINT_IS_SHUTDOWN) || (flags & CHECKPOINT_END_OF_RECOVERY)))
 		mask |= BM_PERMANENT;
 
 	/*
-- 
GitLab