Thread

  1. [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"