On Tue, Sep 08, 2020 at 06:25:03PM +0000, Jameson, Hunter 'James' wrote:
> Hi, I ran across a small (but annoying) bug in initializing parallel BTree 
> scans, which causes the parallel-scan state machine to get confused. The fix 
> is one line; the description is a bit longer—

What postgres version was this ?

> Before, function _bt_first() would exit immediately if the specified scan 
> keys could never be satisfied--without notifying other parallel workers, if 
> any, that the scan key was done. This moved that particular worker to a scan 
> key beyond what was in the shared parallel-query state, so that it would 
> later try to read in "InvalidBlockNumber", without recognizing it as a 
> special sentinel value.
> 
> The basic bug is that the BTree parallel query state machine assumes that a 
> worker process is working on a key <= the global key--a worker process can be 
> behind (i.e., hasn't finished its work on a previous key), but never ahead. 
> By allowing the first worker to move on to the next scan key, in this one 
> case, without notifying other workers, the global key ends up < the first 
> worker's local key.
> 
> Symptoms of the bug are: on R/O, we get an error saying we can't extend the 
> index relation, while on an R/W we just extend the index relation by 1 block.

What's the exact error ?  Are you able to provide a backtrace ?

> To reproduce, you need a query that:
> 
> 1. Executes parallel BTree index scan;
> 2. Has an IN-list of size > 1;

Do you mean you have an index on col1 and a query condition like: col1 IN 
(a,b,c...) ?

> 3. Has an additional index filter that makes it impossible to satisfy the
>     first IN-list condition.

.. AND col1::text||'foo' = '';
I think you mean that the "impossible" condition makes it so that a btree
worker exits early.

> (We encountered such a query, and therefore the bug, on a production 
> instance.)

Could you send the "shape" of the query or its plan, obfuscated and redacted as
need be ?

-- 
Justin


Reply via email to