From 46bc1b9a51687340223cf1a8715a518e4290784b Mon Sep 17 00:00:00 2001
From: Andrey Borodin <amborodin@acm.org>
Date: Mon, 7 Sep 2020 12:08:00 +0500
Subject: [PATCH] nbtree faster logging

---
 src/backend/access/nbtree/nbtsort.c | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c
index efee86784b..a0ff1df648 100644
--- a/src/backend/access/nbtree/nbtsort.c
+++ b/src/backend/access/nbtree/nbtsort.c
@@ -254,6 +254,9 @@ typedef struct BTWriteState
 	BlockNumber btws_pages_alloced; /* # pages allocated */
 	BlockNumber btws_pages_written; /* # pages written out */
 	Page		btws_zeropage;	/* workspace for filling zeroes */
+
+	BlockNumber last_written;
+	BlockNumber last_logged;
 } BTWriteState;
 
 
@@ -570,6 +573,9 @@ _bt_leafbuild(BTSpool *btspool, BTSpool *btspool2)
 	wstate.btws_pages_written = 0;
 	wstate.btws_zeropage = NULL;	/* until needed */
 
+	wstate.last_logged = BTREE_METAPAGE;
+	wstate.last_written = BTREE_METAPAGE;
+
 	pgstat_progress_update_param(PROGRESS_CREATEIDX_SUBPHASE,
 								 PROGRESS_BTREE_PHASE_LEAF_LOAD);
 	_bt_load(&wstate, btspool, btspool2);
@@ -643,8 +649,24 @@ _bt_blwritepage(BTWriteState *wstate, Page page, BlockNumber blkno)
 	/* XLOG stuff */
 	if (wstate->btws_use_wal)
 	{
-		/* We use the XLOG_FPI record type for this */
-		log_newpage(&wstate->index->rd_node, MAIN_FORKNUM, blkno, page, true);
+		if (blkno != BTREE_METAPAGE &&
+			blkno == wstate->last_written + 1 &&
+			blkno < wstate->last_logged + XLR_MAX_BLOCK_ID)
+		{
+			/* Fast path for batching */
+		}
+		else
+		{
+			if (blkno != wstate->last_written + 1)
+				/* We use the XLOG_FPI record type for this */
+				log_newpage(&wstate->index->rd_node, MAIN_FORKNUM, blkno, page, true);
+			else
+				wstate->last_written++;
+			if (wstate->last_logged < wstate->last_written)
+				log_newpage_range(&wstate->index->rd_node, MAIN_FORKNUM,
+								wstate->last_logged + 1, wstate->last_logged + 1, true);
+			wstate->last_logged = wstate->last_written = blkno;
+		}
 	}
 
 	/*
-- 
2.24.3 (Apple Git-128)

