Re: parallel mode and parallel contexts

From: Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>
To: Robert Haas <robertmhaas(at)gmail(dot)com>
Cc: Simon Riggs <simon(at)2ndquadrant(dot)com>, "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: parallel mode and parallel contexts
Date: 2015-01-15 14:09:51
Message-ID: CAA4eK1L3QUWYX7mj10xPwuEbuEEAjrgd=c2jBWrSAjT-CsJ8KA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Thu, Jan 15, 2015 at 6:52 PM, Robert Haas <robertmhaas(at)gmail(dot)com> wrote:
>
> On Thu, Jan 15, 2015 at 7:00 AM, Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>
wrote:
> > +HandleParallelMessages(void)
> > +{
> > ..
> > ..
> > + for (i = 0; i < pcxt->nworkers; ++i)
> > + {
> > + /*
> > + * Read messages for as long as we have an error queue; if we
> > + * have hit (or hit while reading) ReadyForQuery, this will go to
> > + * NULL.
> > + */
> > + while (pcxt->worker[i].error_mqh != NULL)
> > + {
> > + shm_mq_result res;
> > +
> > + CHECK_FOR_INTERRUPTS();
> > +
> > + res = shm_mq_receive(pcxt->worker[i].error_mqh, &nbytes,
> > + &data, true);
> > + if (res == SHM_MQ_SUCCESS)
> >
> > Here we are checking the error queue for all the workers and this loop
> > will continue untill all have sent ReadyForQuery() message ('Z') which
> > will make this loop continue till all workers have finished their work.
> > Assume situation where first worker has completed the work and sent
> > 'Z' message and second worker is still sending some tuples, now above
> > code will keep on waiting for 'Z' message from second worker and won't
> > allow to receive tuples sent by second worker till it send 'Z' message.
> >
> > As each worker send its own 'Z' message after completion, so ideally
> > the above code should receive the message only for worker which has
> > sent the message. I think for that it needs worker information who has
> > sent the message.
>
> Are you talking about HandleParallelMessages() or
> WaitForParallelWorkersToFinish()? The former doesn't wait for
> anything; it just handles any messages that are available now.

I am talking about HandleParallelMessages(). It doesn't wait but
it is looping which will make it run for longer time as explained
above. Just imagine a case where there are two workers and first
worker has sent 'Z' message and second worker is doing some
work, now in such a scenario loop will not finish until second worker
also send 'Z' message or error. Am I missing something?

With Regards,
Amit Kapila.
EnterpriseDB: http://www.enterprisedb.com

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2015-01-15 14:17:20 Re: s_lock.h default definitions are rather confused
Previous Message Merlin Moncure 2015-01-15 14:02:28 Re: hung backends stuck in spinlock heavy endless loop