+Heikki, Hi Heikki,
Could you please help provide a case to elaborate why we need the LWLock here? or could you please tell me to whom should I ask this question? Thanks, Kenan On Tue, Dec 22, 2015 at 11:41 AM, Kenan Yao <k...@pivotal.io> wrote: > Hi Amit, > > Thanks for the reply! > > Yes, in LockAcquireExtended, after exiting WaitOnLock, there would be a > read access to proclock, however, since the lock has either been granted or > rejected by deadlock check, I can think of no possible concurrent write > access to the proclock, so is it really necessary to acquire the LWLock? > > Thanks, > Kenan > > On Fri, Dec 18, 2015 at 10:25 PM, Amit Kapila <amit.kapil...@gmail.com> > wrote: > >> On Thu, Dec 17, 2015 at 1:51 PM, Kenan Yao <k...@pivotal.io> wrote: >> >>> Hi there, >>> >>> In function ProcSleep, after the process has been waken up, either with >>> lock granted or deadlock detected, it would re-acquire the lock table's >>> partition LWLock. >>> >>> The code episode is here: >>> >>> /* >>> * Re-acquire the lock table's partition lock. We have to do this to >>> hold >>> * off cancel/die interrupts before we can mess with lockAwaited (else >>> we >>> * might have a missed or duplicated locallock update). >>> */ >>> LWLockAcquire(partitionLock, LW_EXCLUSIVE); >>> >>> /* >>> * We no longer want LockErrorCleanup to do anything. >>> */ >>> lockAwaited = NULL; >>> >>> /* >>> * If we got the lock, be sure to remember it in the locallock table. >>> */ >>> if (MyProc->waitStatus == STATUS_OK) >>> GrantAwaitedLock(); >>> >>> /* >>> * We don't have to do anything else, because the awaker did all the >>> * necessary update of the lock table and MyProc. >>> */ >>> return MyProc->waitStatus; >>> >>> >>> Questions are: >>> >>> (1) The comment says that "we might have a missed or duplicated >>> locallock update", in what cases would we hit this if without holding the >>> LWLock? >>> >>> (2) The comment says "we have to do this to hold off cancel/die >>> interrupts", then: >>> >>> - why using LWLockAcquire instead of HOLD_INTERRUPTS directly? >>> - From the handler of SIGINT and SIGTERM, seems nothing serious >>> would be processed here, since no CHECK_FOR_INTERRUPS is called before >>> releasing this LWLock. Why we should hold off cancel/die interrupts here? >>> >>> (3) Before releasing this LWLock, the only share memory access is >>> MyProc->waitStatus; since the process has been granted the lock or removed >>> from the lock's waiting list because of deadlock, is it possible some other >>> processes would access this field? if not, then why we need LWLock here? >>> what does this lock protect? >>> >>> >> I think the other thing which needs protection of LWLock is >> access to proclock which is done in the caller >> (LockAcquireExtended). >> >> >> >> >> With Regards, >> Amit Kapila. >> EnterpriseDB: http://www.enterprisedb.com >> > >