Thread
-
[PATCH v36 11/17] Allow init fork to be dropped
Kyotaro Horiguchi <horikyota.ntt@gmail.com> — 2024-11-29T07:21:43Z
Building on features introduced in previous commits, this commit adds the ability to drop init fork transactionally. Dropping an init fork is deferred until transaction commit, using the pendingDeletes mechanism. No user side code is provided. --- src/backend/catalog/storage.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index b4495cb1ab1..67f2b3727a9 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -373,10 +373,9 @@ RelationPreserveStorage(RelFileLocator rlocator, bool atCommit) { next = pending->next; if (RelFileLocatorEquals(rlocator, pending->rlocator) - && pending->atCommit == atCommit) + && pending->atCommit == atCommit + && FORKBITMAP_ISSET(pending->forks, MAIN_FORKNUM)) { - Assert(pending->forks == FORKBITMAP_ALLFORKS()); - found = true; /* unlink and delete list entry */ @@ -807,8 +806,6 @@ smgrDoPendingDeletes(bool isCommit) { SMgrRelation srel; - Assert(pending->forks == FORKBITMAP_ALLFORKS()); - srel = smgropen(pending->rlocator, pending->procNumber); /* allocate the initial array, or extend it, if needed */ @@ -1109,8 +1106,18 @@ AtSubCommit_smgr(void) for (pending = pendingDeletes; pending != NULL; pending = pending->next) { - if (pending->nestLevel >= nestLevel) - pending->nestLevel = nestLevel - 1; + if (pending->nestLevel < nestLevel) + { +#ifdef USE_ASSERT_CHECKING + /* all the remaining entries must be of upper subtransactions */ + for (; pending ; pending = pending->next) + Assert(pending->nestLevel < nestLevel); +#endif + break; + } + + /* move this entry to the immediately upper subtransaction */ + pending->nestLevel = nestLevel - 1; } } @@ -1324,10 +1331,11 @@ smgr_undoevent(ULogEvent event) SMgrRelation reln; ForkNumber forks[3]; BlockNumber firstblocks[3] = {0}; - int nforks = 0; + int nforks; for (int i = 0 ; i < rlocs_len ; i++) { + nforks = 0; forks[nforks++] = MAIN_FORKNUM; /* -- 2.43.5 ----Next_Part(Fri_Dec_27_17_25_02_2024_357)-- Content-Type: Text/X-Patch; charset=us-ascii Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="v36-0012-Prepare-for-preventing-DML-operations-on-relatio.patch"