ssi-cleanup-fix.patch

text/plain

Filename: ssi-cleanup-fix.patch
Type: text/plain
Part: 0
Message: Re: SSI bug?

Patch

Same data as JSON: GET /api/v1/attachments/:id/patch the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes. API reference →
Format: context
File+
src/backend/storage/lmgr/predicate.c 20 0
*** a/src/backend/storage/lmgr/predicate.c
--- b/src/backend/storage/lmgr/predicate.c
***************
*** 2329,2334 **** PredicateLockTupleRowVersionLink(const Relation relation,
--- 2329,2336 ----
  		if (next != NULL)
  		{
  			next->priorVersionOfRow = NULL;
+ 			if (SHMQueueEmpty(&next->predicateLocks))
+ 				PredXact->NeedTargetLinkCleanup = true;
  			oldtarget->nextVersionOfRow = NULL;
  		}
  
***************
*** 3128,3133 **** ClearOldPredicateLocks(void)
--- 3130,3136 ----
  	int			i;
  	HASH_SEQ_STATUS seqstat;
  	PREDICATELOCKTARGET *locktarget;
+ 	PREDICATELOCKTARGET *next;
  
  	LWLockAcquire(SerializableFinishedListLock, LW_EXCLUSIVE);
  	finishedSxact = (SERIALIZABLEXACT *)
***************
*** 3237,3256 **** ClearOldPredicateLocks(void)
  		LWLockAcquire(FirstPredicateLockMgrLock + i, LW_EXCLUSIVE);
  	LWLockAcquire(PredicateLockNextRowLinkLock, LW_SHARED);
  
! 	hash_seq_init(&seqstat, PredicateLockTargetHash);
! 	while ((locktarget = (PREDICATELOCKTARGET *) hash_seq_search(&seqstat)))
  	{
! 		if (SHMQueueEmpty(&locktarget->predicateLocks)
! 			&& locktarget->priorVersionOfRow == NULL
! 			&& locktarget->nextVersionOfRow == NULL)
  		{
! 			hash_search(PredicateLockTargetHash, &locktarget->tag,
! 						HASH_REMOVE, NULL);
  		}
  	}
  
- 	PredXact->NeedTargetLinkCleanup = false;
- 
  	LWLockRelease(PredicateLockNextRowLinkLock);
  	for (i = NUM_PREDICATELOCK_PARTITIONS - 1; i >= 0; i--)
  		LWLockRelease(FirstPredicateLockMgrLock + i);
--- 3240,3267 ----
  		LWLockAcquire(FirstPredicateLockMgrLock + i, LW_EXCLUSIVE);
  	LWLockAcquire(PredicateLockNextRowLinkLock, LW_SHARED);
  
! 	while (PredXact->NeedTargetLinkCleanup)
  	{
! 		PredXact->NeedTargetLinkCleanup = false;
! 		hash_seq_init(&seqstat, PredicateLockTargetHash);
! 		while ((locktarget = (PREDICATELOCKTARGET *) hash_seq_search(&seqstat)))
  		{
! 			if (SHMQueueEmpty(&locktarget->predicateLocks)
! 				&& locktarget->priorVersionOfRow == NULL)
! 			{
! 				next = locktarget->nextVersionOfRow;
! 				if (next != NULL)
! 				{
! 					next->priorVersionOfRow = NULL;
! 					if (SHMQueueEmpty(&next->predicateLocks))
! 						PredXact->NeedTargetLinkCleanup = true;
! 				}
! 				hash_search(PredicateLockTargetHash, &locktarget->tag,
! 							HASH_REMOVE, NULL);
! 			}
  		}
  	}
  
  	LWLockRelease(PredicateLockNextRowLinkLock);
  	for (i = NUM_PREDICATELOCK_PARTITIONS - 1; i >= 0; i--)
  		LWLockRelease(FirstPredicateLockMgrLock + i);