Re: A question regarding LWLock in ProcSleep - Mailing list pgsql-hackers

From Amit Kapila
Subject Re: A question regarding LWLock in ProcSleep
Date
Msg-id CAA4eK1Jyru3Q0dzh7Ti8wrENwAEtaX4ONHxwDE321A3c8q1sow@mail.gmail.com
Whole thread Raw
In response to A question regarding LWLock in ProcSleep  (Kenan Yao <kyao@pivotal.io>)
Responses Re: A question regarding LWLock in ProcSleep  (Kenan Yao <kyao@pivotal.io>)
List pgsql-hackers
On Thu, Dec 17, 2015 at 1:51 PM, Kenan Yao <kyao@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

pgsql-hackers by date:

Previous
From: Aleksander Alekseev
Date:
Subject: Re: Patch: fix lock contention for HASHHDR.mutex
Next
From: Robert Treat
Date:
Subject: Re: Remove array_nulls?