Re: BUG #15290: Stuck Parallel Index Scan query

Andres Freund <andres@anarazel.de>

From: Andres Freund <andres@anarazel.de>
To: Thomas Munro <thomas.munro@enterprisedb.com>
Cc: Victor Yegorov <vyegorov@gmail.com>, PostgreSQL mailing lists <pgsql-bugs@lists.postgresql.org>
Date: 2018-07-25T02:08:05Z
Lists: pgsql-bugs
On 2018-07-25 14:04:11 +1200, Thomas Munro wrote:
> Ok, I see it:
> 
>                         /* check for interrupts while we're not
> holding any buffer lock */
>                         CHECK_FOR_INTERRUPTS();
>                         /* step right one page */
>                         so->currPos.buf = _bt_getbuf(rel, blkno, BT_READ);
>                         ...
>                         /* nope, keep going */
>                         if (scan->parallel_scan != NULL)
>                         {
>                                 status = _bt_parallel_seize(scan, &blkno);
> 
> That leads to a condition variable wait, while we still hold that
> buffer lock.  That prevents interrupts.  Oops.

Heh, guessed right.  I kinda wonder if we shouldn't add a
CHECK_FOR_INTERRUPTS_FOR_REALZ() that asserts if interrupts aren't
held. There are plenty places where we rely on that being the case, for
correctness.

Greetings,

Andres Freund


Commits

  1. Fix the buffer release order for parallel index scans.