From: Teodor Sigaev Date: Wed, 30 May 2018 16:45:39 +0000 (+0300) Subject: Move _bt_upgrademetapage() into critical section. X-Git-Tag: REL_11_BETA2~104 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=08186dc05b3eed9c1f29b3349b122487d84ef3eb;p=postgresql Move _bt_upgrademetapage() into critical section. Any changes on page should be done in critical section, so move _bt_upgrademetapage into critical section. Improve comment. Found by Amit Kapila during post-commit review of 857f9c36. Author: Amit Kapila --- diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c index 3d5936f186..907cce0724 100644 --- a/src/backend/access/nbtree/nbtinsert.c +++ b/src/backend/access/nbtree/nbtinsert.c @@ -2150,10 +2150,6 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf) metapg = BufferGetPage(metabuf); metad = BTPageGetMeta(metapg); - /* upgrade metapage if needed */ - if (metad->btm_version < BTREE_VERSION) - _bt_upgrademetapage(metapg); - /* * Create downlink item for left page (old root). Since this will be the * first item in a non-leaf page, it implicitly has minus-infinity key @@ -2178,6 +2174,10 @@ _bt_newroot(Relation rel, Buffer lbuf, Buffer rbuf) /* NO EREPORT(ERROR) from here till newroot op is logged */ START_CRIT_SECTION(); + /* upgrade metapage if needed */ + if (metad->btm_version < BTREE_VERSION) + _bt_upgrademetapage(metapg); + /* set btree special data */ rootopaque = (BTPageOpaque) PageGetSpecialPointer(rootpage); rootopaque->btpo_prev = rootopaque->btpo_next = P_NONE; diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index 22b4a7578f..a24e64156a 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -341,10 +341,6 @@ _bt_getroot(Relation rel, int access) LockBuffer(metabuf, BUFFER_LOCK_UNLOCK); LockBuffer(metabuf, BT_WRITE); - /* upgrade metapage if needed */ - if (metad->btm_version < BTREE_VERSION) - _bt_upgrademetapage(metapg); - /* * Race condition: if someone else initialized the metadata between * the time we released the read lock and acquired the write lock, we @@ -379,6 +375,10 @@ _bt_getroot(Relation rel, int access) /* NO ELOG(ERROR) till meta is updated */ START_CRIT_SECTION(); + /* upgrade metapage if needed */ + if (metad->btm_version < BTREE_VERSION) + _bt_upgrademetapage(metapg); + metad->btm_root = rootblkno; metad->btm_level = 0; metad->btm_fastroot = rootblkno; diff --git a/src/include/access/nbtree.h b/src/include/access/nbtree.h index 15a7b4c212..04ecb4cbc0 100644 --- a/src/include/access/nbtree.h +++ b/src/include/access/nbtree.h @@ -103,7 +103,7 @@ typedef struct BTMetaPageData BlockNumber btm_fastroot; /* current "fast" root location */ uint32 btm_fastlevel; /* tree level of the "fast" root page */ /* following fields are available since page version 3 */ - TransactionId btm_oldest_btpo_xact; /* oldest btpo_xact among of deleted + TransactionId btm_oldest_btpo_xact; /* oldest btpo_xact among all deleted * pages */ float8 btm_last_cleanup_num_heap_tuples; /* number of heap tuples * during last cleanup */