Robert Haas <[email protected]> wrote:
> If you could send a revised patch, that would be great.
Attached. I put it in the same spot relative to the lock
acquisition that was used earlier in the function.
-Kevin
*** a/src/backend/storage/lmgr/predicate.c
--- b/src/backend/storage/lmgr/predicate.c
***************
*** 3757,3762 **** CheckTargetForConflictsIn(PREDICATELOCKTARGETTAG *targettag)
--- 3757,3774 ----
LWLockRelease(partitionLock);
LWLockRelease(SerializablePredicateLockListLock);
LWLockAcquire(partitionLock, LW_SHARED);
+
+ /*
+ * The list may have been altered by
another process
+ * while we weren't holding the
partition lock. Start
+ * over at the front.
+ */
+ LWLockAcquire(partitionLock, LW_SHARED);
+ nextpredlock = (PREDICATELOCK *)
+
SHMQueueNext(&(target->predicateLocks),
+
&(target->predicateLocks),
+
offsetof(PREDICATELOCK, targetLink));
+
LWLockAcquire(SerializableXactHashLock,
LW_SHARED);
}
}
***************
*** 3770,3776 **** CheckTargetForConflictsIn(PREDICATELOCKTARGETTAG *targettag)
LWLockRelease(SerializableXactHashLock);
LWLockAcquire(SerializableXactHashLock, LW_EXCLUSIVE);
! FlagRWConflict(sxact, (SERIALIZABLEXACT *)
MySerializableXact);
LWLockRelease(SerializableXactHashLock);
LWLockAcquire(SerializableXactHashLock, LW_SHARED);
--- 3782,3800 ----
LWLockRelease(SerializableXactHashLock);
LWLockAcquire(SerializableXactHashLock, LW_EXCLUSIVE);
! /*
! * Re-check after getting exclusive lock because the
other
! * transaction may have flagged a conflict.
! */
! if (!SxactIsRolledBack(sxact)
! && (!SxactIsCommitted(sxact)
! ||
TransactionIdPrecedes(GetTransactionSnapshot()->xmin,
!
sxact->finishedBefore))
! && !RWConflictExists(sxact,
!
(SERIALIZABLEXACT *) MySerializableXact))
! {
! FlagRWConflict(sxact, (SERIALIZABLEXACT *)
MySerializableXact);
! }
LWLockRelease(SerializableXactHashLock);
LWLockAcquire(SerializableXactHashLock, LW_SHARED);
--
Sent via pgsql-bugs mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs