On Mon, 27 Jul 2020 at 3:48 AM, Thomas Munro <thomas.mu...@gmail.com> wrote:
> On Mon, Jul 27, 2020 at 1:58 AM Dilip Kumar <dilipbal...@gmail.com> wrote: > > On Sun, Jul 26, 2020 at 6:42 PM Dilip Kumar <dilipbal...@gmail.com> > wrote: > > > > > > I would like to propose a patch for enabling the parallelism for the > > > bitmap index scan path. > > Workers Planned: 4 > -> Parallel Bitmap Heap Scan on tenk1 > Recheck Cond: (hundred > 1) > - -> Bitmap Index Scan on tenk1_hundred > + -> Parallel Bitmap Index Scan on tenk1_hundred > Index Cond: (hundred > 1) > > +1, this is a very good feature to have. > > + /* Merge bitmap to a common > shared bitmap */ > + SpinLockAcquire(&pstate->mutex); > + tbm_merge(tbm, > &pstate->tbm_shared, &pstate->pt_shared); > + SpinLockRelease(&pstate->mutex); > > This doesn't look like a job for a spinlock. Yes I agree with that. You have a barrier so that you can wait until all workers have > finished merging their partial bitmap into the complete bitmap, which > makes perfect sense. You also use that spinlock (probably should be > LWLock) to serialise the bitmap merging work... Hmm, I suppose there > would be an alternative design which also uses the barrier to > serialise the merge, and has the merging done entirely by one process, > like this: > > bool chosen_to_merge = false; > > /* Attach to the barrier, and see what phase we're up to. */ > switch (BarrierAttach()) > { > case PBH_BUILDING: > ... build my partial bitmap in shmem ... > chosen_to_merge = BarrierArriveAndWait(); > /* Fall through */ > > case PBH_MERGING: > if (chosen_to_merge) > ... perform merge of all partial results into final shmem bitmap ... > BarrierArriveAndWait(); > /* Fall through */ > > case PBH_SCANNING: > /* We attached too late to help build the bitmap. */ > BarrierDetach(); > break; > } > > Just an idea, not sure if it's a good one. I find it a little easier > to reason about the behaviour of late-attaching workers when the > phases are explicitly named and handled with code like that (it's not > immediately clear to me whether your coding handles late attachers > correctly, which seems to be one of the main problems to think about > with "dynamic party" parallelism...). Yeah this seems better idea. I am handling late attachers case but the idea of using the barrier phase looks quite clean. I will change it this way. > -- Regards, Dilip Kumar EnterpriseDB: http://www.enterprisedb.com