From 1546aa0d9fdf2a18f1fae73e48a72df7ce7cf1eb Mon Sep 17 00:00:00 2001 From: jeff-davis Date: Tue, 4 Jan 2022 22:42:21 -0800 Subject: [PATCH] Columnar: use proper generic WAL interface. (#5543) Previously, we cheated by using the RM_GENERIC_ID record type, but not actually using the generic WAL API. This worked because we always took a full page image, and saved the extra work of allocating and copying to a temporary page. But it introduced complexity, and perhaps fragility, so better to just use the API properly. The performance penalty for a serial data load seems to be less than 1%. --- src/backend/columnar/columnar_storage.c | 26 ++++++------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/src/backend/columnar/columnar_storage.c b/src/backend/columnar/columnar_storage.c index f5a35c1cf..5d5b8cf6d 100644 --- a/src/backend/columnar/columnar_storage.c +++ b/src/backend/columnar/columnar_storage.c @@ -38,6 +38,7 @@ #include "safe_lib.h" +#include "access/generic_xlog.h" #include "catalog/storage.h" #include "miscadmin.h" #include "storage/bufmgr.h" @@ -699,9 +700,12 @@ WriteToBlock(Relation rel, BlockNumber blockno, uint32 offset, char *buf, uint32 len, bool clear) { Buffer buffer = ReadBuffer(rel, blockno); + GenericXLogState *state = GenericXLogStart(rel); + LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); - Page page = BufferGetPage(buffer); + Page page = GenericXLogRegisterBuffer(state, buffer, GENERIC_XLOG_FULL_IMAGE); + PageHeader phdr = (PageHeader) page; if (PageIsNew(page) || clear) { @@ -734,28 +738,10 @@ WriteToBlock(Relation rel, BlockNumber blockno, uint32 offset, char *buf, phdr->pd_lower = offset; } - START_CRIT_SECTION(); - memcpy_s(page + phdr->pd_lower, phdr->pd_upper - phdr->pd_lower, buf, len); phdr->pd_lower += len; - MarkBufferDirty(buffer); - - if (RelationNeedsWAL(rel)) - { - XLogBeginInsert(); - - /* - * Since columnar will mostly write whole pages we force the transmission of the - * whole image in the buffer - */ - XLogRegisterBuffer(0, buffer, REGBUF_FORCE_IMAGE); - - XLogRecPtr recptr = XLogInsert(RM_GENERIC_ID, 0); - PageSetLSN(page, recptr); - } - - END_CRIT_SECTION(); + GenericXLogFinish(state); UnlockReleaseBuffer(buffer); }