From: | Amit Kapila <amit(dot)kapila16(at)gmail(dot)com> |
---|---|
To: | Kenan Yao <kyao(at)pivotal(dot)io> |
Cc: | pgsql-hackers <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: A question regarding LWLock in ProcSleep |
Date: | 2015-12-18 14:25:32 |
Message-ID: | CAA4eK1Jyru3Q0dzh7Ti8wrENwAEtaX4ONHxwDE321A3c8q1sow@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On Thu, Dec 17, 2015 at 1:51 PM, Kenan Yao <kyao(at)pivotal(dot)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
From | Date | Subject | |
---|---|---|---|
Next Message | Robert Treat | 2015-12-18 14:52:08 | Re: Remove array_nulls? |
Previous Message | Aleksander Alekseev | 2015-12-18 14:19:33 | Re: Patch: fix lock contention for HASHHDR.mutex |