From: "Andrey V. Lepikhov" Date: Tue, 2 Apr 2019 09:43:54 +0500 Subject: [PATCH 4/4] SP-GiST-Optimal-WAL-Usage --- src/backend/access/rmgrdesc/spgdesc.c | 5 ---- src/backend/access/spgist/spgdoinsert.c | 12 ++++----- src/backend/access/spgist/spginsert.c | 24 +++-------------- src/backend/access/spgist/spgxlog.c | 35 ------------------------- src/include/access/spgxlog.h | 1 - 5 files changed, 10 insertions(+), 67 deletions(-) diff --git a/src/backend/access/rmgrdesc/spgdesc.c b/src/backend/access/rmgrdesc/spgdesc.c index 37af31a764..40c1c8b3f9 100644 --- a/src/backend/access/rmgrdesc/spgdesc.c +++ b/src/backend/access/rmgrdesc/spgdesc.c @@ -24,8 +24,6 @@ spg_desc(StringInfo buf, XLogReaderState *record) switch (info) { - case XLOG_SPGIST_CREATE_INDEX: - break; case XLOG_SPGIST_ADD_LEAF: { spgxlogAddLeaf *xlrec = (spgxlogAddLeaf *) rec; @@ -88,9 +86,6 @@ spg_identify(uint8 info) switch (info & ~XLR_INFO_MASK) { - case XLOG_SPGIST_CREATE_INDEX: - id = "CREATE_INDEX"; - break; case XLOG_SPGIST_ADD_LEAF: id = "ADD_LEAF"; break; diff --git a/src/backend/access/spgist/spgdoinsert.c b/src/backend/access/spgist/spgdoinsert.c index 0d07b8b291..c34c44cd8b 100644 --- a/src/backend/access/spgist/spgdoinsert.c +++ b/src/backend/access/spgist/spgdoinsert.c @@ -289,7 +289,7 @@ addLeafTuple(Relation index, SpGistState *state, SpGistLeafTuple leafTuple, MarkBufferDirty(current->buffer); - if (RelationNeedsWAL(index)) + if (RelationNeedsWAL(index) && !state->isBuild) { XLogRecPtr recptr; int flags; @@ -516,7 +516,7 @@ moveLeafs(Relation index, SpGistState *state, MarkBufferDirty(current->buffer); MarkBufferDirty(nbuf); - if (RelationNeedsWAL(index)) + if (RelationNeedsWAL(index) && !state->isBuild) { XLogRecPtr recptr; @@ -1334,7 +1334,7 @@ doPickSplit(Relation index, SpGistState *state, saveCurrent.buffer = InvalidBuffer; } - if (RelationNeedsWAL(index)) + if (RelationNeedsWAL(index) && !state->isBuild) { XLogRecPtr recptr; int flags; @@ -1531,7 +1531,7 @@ spgAddNodeAction(Relation index, SpGistState *state, MarkBufferDirty(current->buffer); - if (RelationNeedsWAL(index)) + if (RelationNeedsWAL(index) && !state->isBuild) { XLogRecPtr recptr; @@ -1644,7 +1644,7 @@ spgAddNodeAction(Relation index, SpGistState *state, MarkBufferDirty(saveCurrent.buffer); - if (RelationNeedsWAL(index)) + if (RelationNeedsWAL(index) && !state->isBuild) { XLogRecPtr recptr; int flags; @@ -1840,7 +1840,7 @@ spgSplitNodeAction(Relation index, SpGistState *state, MarkBufferDirty(current->buffer); - if (RelationNeedsWAL(index)) + if (RelationNeedsWAL(index) && !state->isBuild) { XLogRecPtr recptr; diff --git a/src/backend/access/spgist/spginsert.c b/src/backend/access/spgist/spginsert.c index 390ad9ac51..0c3608ad8a 100644 --- a/src/backend/access/spgist/spginsert.c +++ b/src/backend/access/spgist/spginsert.c @@ -22,6 +22,7 @@ #include "access/tableam.h" #include "access/xlog.h" #include "access/xloginsert.h" +#include "access/generic_xlog.h" #include "catalog/index.h" #include "miscadmin.h" #include "storage/bufmgr.h" @@ -105,26 +106,6 @@ spgbuild(Relation heap, Relation index, IndexInfo *indexInfo) SpGistInitBuffer(nullbuffer, SPGIST_LEAF | SPGIST_NULLS); MarkBufferDirty(nullbuffer); - if (RelationNeedsWAL(index)) - { - XLogRecPtr recptr; - - XLogBeginInsert(); - - /* - * Replay will re-initialize the pages, so don't take full pages - * images. No other data to log. - */ - XLogRegisterBuffer(0, metabuffer, REGBUF_WILL_INIT | REGBUF_STANDARD); - XLogRegisterBuffer(1, rootbuffer, REGBUF_WILL_INIT | REGBUF_STANDARD); - XLogRegisterBuffer(2, nullbuffer, REGBUF_WILL_INIT | REGBUF_STANDARD); - - recptr = XLogInsert(RM_SPGIST_ID, XLOG_SPGIST_CREATE_INDEX); - - PageSetLSN(BufferGetPage(metabuffer), recptr); - PageSetLSN(BufferGetPage(rootbuffer), recptr); - PageSetLSN(BufferGetPage(nullbuffer), recptr); - } END_CRIT_SECTION(); @@ -151,6 +132,9 @@ spgbuild(Relation heap, Relation index, IndexInfo *indexInfo) SpGistUpdateMetaPage(index); + if (RelationNeedsWAL(index)) + log_relation(index); + result = (IndexBuildResult *) palloc0(sizeof(IndexBuildResult)); result->heap_tuples = reltuples; result->index_tuples = buildstate.indtuples; diff --git a/src/backend/access/spgist/spgxlog.c b/src/backend/access/spgist/spgxlog.c index 71836ee8a5..ebe6ae8715 100644 --- a/src/backend/access/spgist/spgxlog.c +++ b/src/backend/access/spgist/spgxlog.c @@ -72,38 +72,6 @@ addOrReplaceTuple(Page page, Item tuple, int size, OffsetNumber offset) size); } -static void -spgRedoCreateIndex(XLogReaderState *record) -{ - XLogRecPtr lsn = record->EndRecPtr; - Buffer buffer; - Page page; - - buffer = XLogInitBufferForRedo(record, 0); - Assert(BufferGetBlockNumber(buffer) == SPGIST_METAPAGE_BLKNO); - page = (Page) BufferGetPage(buffer); - SpGistInitMetapage(page); - PageSetLSN(page, lsn); - MarkBufferDirty(buffer); - UnlockReleaseBuffer(buffer); - - buffer = XLogInitBufferForRedo(record, 1); - Assert(BufferGetBlockNumber(buffer) == SPGIST_ROOT_BLKNO); - SpGistInitBuffer(buffer, SPGIST_LEAF); - page = (Page) BufferGetPage(buffer); - PageSetLSN(page, lsn); - MarkBufferDirty(buffer); - UnlockReleaseBuffer(buffer); - - buffer = XLogInitBufferForRedo(record, 2); - Assert(BufferGetBlockNumber(buffer) == SPGIST_NULL_BLKNO); - SpGistInitBuffer(buffer, SPGIST_LEAF | SPGIST_NULLS); - page = (Page) BufferGetPage(buffer); - PageSetLSN(page, lsn); - MarkBufferDirty(buffer); - UnlockReleaseBuffer(buffer); -} - static void spgRedoAddLeaf(XLogReaderState *record) { @@ -976,9 +944,6 @@ spg_redo(XLogReaderState *record) oldCxt = MemoryContextSwitchTo(opCtx); switch (info) { - case XLOG_SPGIST_CREATE_INDEX: - spgRedoCreateIndex(record); - break; case XLOG_SPGIST_ADD_LEAF: spgRedoAddLeaf(record); break; diff --git a/src/include/access/spgxlog.h b/src/include/access/spgxlog.h index 6527fc9eb1..8199b3f250 100644 --- a/src/include/access/spgxlog.h +++ b/src/include/access/spgxlog.h @@ -18,7 +18,6 @@ #include "storage/off.h" /* XLOG record types for SPGiST */ -#define XLOG_SPGIST_CREATE_INDEX 0x00 #define XLOG_SPGIST_ADD_LEAF 0x10 #define XLOG_SPGIST_MOVE_LEAFS 0x20 #define XLOG_SPGIST_ADD_NODE 0x30 -- 2.17.1 --------------58E4AA393B5F48ED79D1D18E Content-Type: application/sql; name="test.sql" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="test.sql" XGVjaG8gJ0dJTiBXQUwgZGlmZiB0ZXN0JwpcbyAvZGV2L251bGwKRFJPUCBUQUJMRSBJRiBF WElTVFMgZ2luX3Rlc3RfdGJsOwpTRUxFQ1Qgc2V0c2VlZCguNDMpOwpDUkVBVEUgVEFCTEUg Z2luX3Rlc3RfdGJsKGkgaW50NFtdKSB3aXRoIChhdXRvdmFjdXVtX2VuYWJsZWQgPSBvZmYp OwoKSU5TRVJUIElOVE8gZ2luX3Rlc3RfdGJsIFNFTEVDVCBhcnJheVtyYW5kb20oKSoxMDAw MDAsIHJhbmRvbSgpKjEwMDAsIGddIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDIwMDAwMDAp IGc7CgpTRUxFQ1QgIHBnX2N1cnJlbnRfd2FsX2luc2VydF9sc24oKSBBUyBwcmV2X2xzbjsg XGdzZXQKQ1JFQVRFIElOREVYIGdpbl90ZXN0X2lkeCBPTiBnaW5fdGVzdF90YmwgVVNJTkcg Z2luIChpKQogIFdJVEggKGZhc3R1cGRhdGUgPSBvbiwgZ2luX3BlbmRpbmdfbGlzdF9saW1p dCA9IDQwOTYpOwpTRUxFQ1QgIHBnX2N1cnJlbnRfd2FsX2luc2VydF9sc24oKTo6cGdfbHNu IEFTIGxzbjsgXGdzZXQKU0VMRUNUIHBnX3dhbF9sc25fZGlmZig6J2xzbic6OnBnX2xzbiwg OidwcmV2X2xzbic6OnBnX2xzbikgQVMgd2FsX2RpZmY7IFxnc2V0ClxvClNFTEVDVCBwZ19z aXplX3ByZXR0eSg6d2FsX2RpZmY6Om51bWVyaWMpOwoKLS0gClxlY2hvICdHSVNUIFdBTCBk aWZmIHRlc3QnClxvIC9kZXYvbnVsbApEUk9QIFRBQkxFIElGIEVYSVNUUyBnaXN0X3BvaW50 X3RibDsKU0VMRUNUIHNldHNlZWQoLjQzKTsKQ1JFQVRFIFRBQkxFIGdpc3RfcG9pbnRfdGJs KGlkIGludDQsIHAgcG9pbnQpOwoKSU5TRVJUIElOVE8gZ2lzdF9wb2ludF90YmwgKGlkLCBw KQpTRUxFQ1QgZywgcG9pbnQocmFuZG9tKCkqMTAwMCwgcmFuZG9tKCkqMTAwMCkgRlJPTSBn ZW5lcmF0ZV9zZXJpZXMoMSwgMTAwMDAwMCkgZzsKClNFTEVDVCAgcGdfY3VycmVudF93YWxf aW5zZXJ0X2xzbigpIEFTIHByZXZfbHNuOyBcZ3NldApDUkVBVEUgSU5ERVggZ2lzdF9wb2lu dGlkeCBPTiBnaXN0X3BvaW50X3RibCBVU0lORyBnaXN0KHApOwpTRUxFQ1QgIHBnX2N1cnJl bnRfd2FsX2luc2VydF9sc24oKTo6cGdfbHNuIEFTIGxzbjsgXGdzZXQKU0VMRUNUIHBnX3dh bF9sc25fZGlmZig6J2xzbic6OnBnX2xzbiwgOidwcmV2X2xzbic6OnBnX2xzbikgQVMgd2Fs X2RpZmY7IFxnc2V0ClxvClNFTEVDVCBwZ19zaXplX3ByZXR0eSg6d2FsX2RpZmY6Om51bWVy aWMpOwoKLS0gClxlY2hvICdTUC1HSVNUIFdBTCBkaWZmIHRlc3QnClxvIC9kZXYvbnVsbAoK ZHJvcCB0YWJsZSBzcGdpc3RfcG9pbnRfdGJsOwpjcmVhdGUgdGFibGUgc3BnaXN0X3BvaW50 X3RibChpZCBpbnQ0LCBwIHBvaW50KTsKClNFTEVDVCBzZXRzZWVkKC40Myk7CgpJTlNFUlQg SU5UTyBzcGdpc3RfcG9pbnRfdGJsIChpZCwgcCkKU0VMRUNUIGcsIHBvaW50KHJhbmRvbSgp KjEwMDAsIHJhbmRvbSgpKjEwMDApIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMDAwMDAp IGc7CgpTRUxFQ1QgIHBnX2N1cnJlbnRfd2FsX2luc2VydF9sc24oKSBBUyBwcmV2X2xzbjsg XGdzZXQKQ1JFQVRFIElOREVYIHNwZ2lzdF9wb2ludF9pZHggT04gc3BnaXN0X3BvaW50X3Ri bCBVU0lORyBzcGdpc3QocCk7ClNFTEVDVCAgcGdfY3VycmVudF93YWxfaW5zZXJ0X2xzbigp OjpwZ19sc24gQVMgbHNuOyBcZ3NldApTRUxFQ1QgcGdfd2FsX2xzbl9kaWZmKDonbHNuJzo6 cGdfbHNuLCA6J3ByZXZfbHNuJzo6cGdfbHNuKSBBUyB3YWxfZGlmZjsgXGdzZXQKXG8KU0VM RUNUIHBnX3NpemVfcHJldHR5KDp3YWxfZGlmZjo6bnVtZXJpYyk7CgovKgptYXN0ZXI6Cj09 PT09PT0KCkdJTiBXQUwgZGlmZiB0ZXN0CiBwZ19zaXplX3ByZXR0eSAKLS0tLS0tLS0tLS0t LS0tLQogMzQ3IE1CCigxIHJvdykKCkdJU1QgV0FMIGRpZmYgdGVzdAogcGdfc2l6ZV9wcmV0 dHkgCi0tLS0tLS0tLS0tLS0tLS0KIDE1NyBNQgooMSByb3cpCgpTUC1HSVNUIFdBTCBkaWZm IHRlc3QKIHBnX3NpemVfcHJldHR5IAotLS0tLS0tLS0tLS0tLS0tCiAxMTkgTUIKKDEgcm93 KQoKcGF0Y2hlZDoKPT09PT09PT0KCkdJTiBXQUwgZGlmZiB0ZXN0CiBwZ19zaXplX3ByZXR0 eSAKLS0tLS0tLS0tLS0tLS0tLQogNjYgTUIKKDEgcm93KQoKR0lTVCBXQUwgZGlmZiB0ZXN0 CiBwZ19zaXplX3ByZXR0eSAKLS0tLS0tLS0tLS0tLS0tLQogNDMgTUIKKDEgcm93KQoKU1At R0lTVCBXQUwgZGlmZiB0ZXN0CiBwZ19zaXplX3ByZXR0eSAKLS0tLS0tLS0tLS0tLS0tLQog MzggTUIKKDEgcm93KQoKKi8K --------------58E4AA393B5F48ED79D1D18E--