I wrote:
> Robert Haas <robertmh...@gmail.com> 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.
 
And version 3 which might actually work.  [sigh]
 
-Kevin

*** a/src/backend/storage/lmgr/predicate.c
--- b/src/backend/storage/lmgr/predicate.c
***************
*** 3757,3762 **** CheckTargetForConflictsIn(PREDICATELOCKTARGETTAG *targettag)
--- 3757,3773 ----
                                        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.
+                                        */
+                                       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);
--- 3781,3799 ----
                        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 (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs

Reply via email to