Обсуждение: background worker and normal exit

Поиск
Список
Период
Сортировка

background worker and normal exit

От
Fujii Masao
Дата:
Hi,

I found that the normal exit (i.e., with exit code 0) of bgworker
always leads to
the immediate restart of bgworker whatever bgw_restart_time is. Is
this intentional?
Not only crash but also normal exit should go along with bgw_restart_time?

I'm now writing the bgworker which is allowed to be running only
during recovery.
After recovery ends, that bgworker is expected to exit with code 0. I
was thinking
to avoid the restart of the bgworker after normal exit, by using
BGW_NEVER_RESTART.

Regards,

-- 
Fujii Masao



Re: background worker and normal exit

От
Michael Paquier
Дата:
On Sun, May 26, 2013 at 6:16 AM, Fujii Masao <masao.fujii@gmail.com> wrote:
I found that the normal exit (i.e., with exit code 0) of bgworker
always leads to
the immediate restart of bgworker whatever bgw_restart_time is. Is
this intentional?
Yes, per the docs:
http://www.postgresql.org/docs/devel/static/bgworker.html
"Background workers are expected to be continuously running; if they exit cleanly, postgres will restart them immediately."
 
Not only crash but also normal exit should go along with bgw_restart_time?
bgw_restart_time corresponds to the time a bgworker is restarted in case of a crash only.
 
I'm now writing the bgworker which is allowed to be running only
during recovery.
After recovery ends, that bgworker is expected to exit with code 0. I
was thinking
to avoid the restart of the bgworker after normal exit, by using
BGW_NEVER_RESTART.
This flag makes a worker not to restart only in case of a crash. To solve your problem, you could as well allow your process to restart and put it in indefinite sleep if server is not in recovery such it it will do nothing in your case.

Regards,
--
Michael

Re: background worker and normal exit

От
Bernd Helmle
Дата:

--On 26. Mai 2013 11:38:55 +0900 Michael Paquier 
<michael.paquier@gmail.com> wrote:

>
> This flag makes a worker not to restart only in case of a crash. To solve
> your problem, you could as well allow your process to restart and put it
> in indefinite sleep if server is not in recovery such it it will do
> nothing in your case.

Hmm so you can't have workers just "doing something once" and exit? I have 
to admit, i didn't follow bgworkers closely in the past, but could you give 
a short insight on why this is currently not possible?

-- 
Thanks
Bernd



Re: background worker and normal exit

От
Michael Paquier
Дата:
<div dir="ltr">On Mon, May 27, 2013 at 2:04 AM, Bernd Helmle <span dir="ltr"><<a href="mailto:mailings@oopsware.de"
target="_blank">mailings@oopsware.de</a>></span>wrote:<br /><div class="gmail_extra"><div
class="gmail_quote"><blockquoteclass="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid
rgb(204,204,204);padding-left:1ex"><divclass="im"><br /><br /> --On 26. Mai 2013 11:38:55 +0900 Michael Paquier <<a
href="mailto:michael.paquier@gmail.com"target="_blank">michael.paquier@gmail.com</a>> wrote:<br /><br /><blockquote
class="gmail_quote"style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br /> This
flagmakes a worker not to restart only in case of a crash. To solve<br /> your problem, you could as well allow your
processto restart and put it<br /> in indefinite sleep if server is not in recovery such it it will do<br /> nothing in
yourcase.<br /></blockquote><br /></div> Hmm so you can't have workers just "doing something once" and exit? I have to
admit,i didn't follow bgworkers closely in the past, but could you give a short insight on why this is currently not
possible?<spanclass=""><font color="#888888"><br /></font></span></blockquote></div>Bgworkers are expected to run all
thetime, and will be restarted each time they exit cleanly with a status code 0. Note that they are *still* restarted
immediatelyeven if bgw_restart_time is set at BGW_NEVER_RESTART or to a certain value.<br /></div><div
class="gmail_extra">Thereare actually two ways you can use to have them perform a one-time task:<br /></div><div
class="gmail_extra">-put it in indefinite sleep after the task is accomplished<br /></div><div class="gmail_extra"> -
setbgw_restart_time to BGW_NEVER_RESTART. and have the bgworler exit with non-0 status code.<br /><br /></div><div
class="gmail_extra">Regards,<br/></div>-- <br /><div class="gmail_extra">Michael<br /></div></div> 

Re: background worker and normal exit

От
Robert Haas
Дата:
On Sun, May 26, 2013 at 6:48 PM, Michael Paquier
<michael.paquier@gmail.com> wrote:
>> Hmm so you can't have workers just "doing something once" and exit? I have
>> to admit, i didn't follow bgworkers closely in the past, but could you give
>> a short insight on why this is currently not possible?
>
> Bgworkers are expected to run all the time, and will be restarted each time
> they exit cleanly with a status code 0. Note that they are *still* restarted
> immediately even if bgw_restart_time is set at BGW_NEVER_RESTART or to a
> certain value.
> There are actually two ways you can use to have them perform a one-time
> task:
> - put it in indefinite sleep after the task is accomplished

That's not really the same thing...

> - set bgw_restart_time to BGW_NEVER_RESTART. and have the bgworler exit with
> non-0 status code.

That might be good enough, though.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company



Re: background worker and normal exit

От
Andres Freund
Дата:
On 2013-05-28 10:23:46 -0400, Robert Haas wrote:
> On Sun, May 26, 2013 at 6:48 PM, Michael Paquier
> > - set bgw_restart_time to BGW_NEVER_RESTART. and have the bgworler exit with
> > non-0 status code.
> 
> That might be good enough, though.

I suggested that to Fujii at pgcon, and it seems to work for him. But I
think this sucks since you loose support for a restart upon a FATAL or
similar error. And you cannot mark that as something non-fatal in the
log. To this day I laugh about the following oddity in the xorg log:

[    30.087] (II) RADEON(0): RandR 1.2 enabled, ignore the following RandR disabled message.
[    30.088] (--) RandR disabled

I really don't want to go there.

You actually can only return a 1 since everything else will tear down
the whole cluster...

We actually were discussing this recently:
http://archives.postgresql.org/message-id/20130423134833.GD8499%40alap2.anarazel.de

I think a separate return code for "exited gracefully, don't restart"
would be a good idea.

Greetings,

Andres Freund

-- Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services



Re: background worker and normal exit

От
Robert Haas
Дата:
On Tue, May 28, 2013 at 10:31 AM, Andres Freund <andres@2ndquadrant.com> wrote:
> On 2013-05-28 10:23:46 -0400, Robert Haas wrote:
>> On Sun, May 26, 2013 at 6:48 PM, Michael Paquier
>> > - set bgw_restart_time to BGW_NEVER_RESTART. and have the bgworler exit with
>> > non-0 status code.
>>
>> That might be good enough, though.
>
> I suggested that to Fujii at pgcon, and it seems to work for him. But I
> think this sucks since you loose support for a restart upon a FATAL or
> similar error. And you cannot mark that as something non-fatal in the
> log. To this day I laugh about the following oddity in the xorg log:
>
> [    30.087] (II) RADEON(0): RandR 1.2 enabled, ignore the following RandR disabled message.
> [    30.088] (--) RandR disabled
>
> I really don't want to go there.
>
> You actually can only return a 1 since everything else will tear down
> the whole cluster...
>
> We actually were discussing this recently:
> http://archives.postgresql.org/message-id/20130423134833.GD8499%40alap2.anarazel.de
>
> I think a separate return code for "exited gracefully, don't restart"
> would be a good idea.

Yeah.  Or maybe the restart-timing/restart-when logic should just
apply to the exit(0) case as well.  Not sure what the downside of that
would be.

-- 
Robert Haas
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company



Re: background worker and normal exit

От
Andres Freund
Дата:
On 2013-05-28 10:33:47 -0400, Robert Haas wrote:
> On Tue, May 28, 2013 at 10:31 AM, Andres Freund <andres@2ndquadrant.com> wrote:
> > On 2013-05-28 10:23:46 -0400, Robert Haas wrote:
> >> On Sun, May 26, 2013 at 6:48 PM, Michael Paquier
> >> > - set bgw_restart_time to BGW_NEVER_RESTART. and have the bgworler exit with
> >> > non-0 status code.
> >>
> >> That might be good enough, though.
> >
> > I suggested that to Fujii at pgcon, and it seems to work for him. But I
> > think this sucks since you loose support for a restart upon a FATAL or
> > similar error. And you cannot mark that as something non-fatal in the
> > log. To this day I laugh about the following oddity in the xorg log:
> >
> > [    30.087] (II) RADEON(0): RandR 1.2 enabled, ignore the following RandR disabled message.
> > [    30.088] (--) RandR disabled
> >
> > I really don't want to go there.
> >
> > You actually can only return a 1 since everything else will tear down
> > the whole cluster...
> >
> > We actually were discussing this recently:
> > http://archives.postgresql.org/message-id/20130423134833.GD8499%40alap2.anarazel.de
> >
> > I think a separate return code for "exited gracefully, don't restart"
> > would be a good idea.
> 
> Yeah.  Or maybe the restart-timing/restart-when logic should just
> apply to the exit(0) case as well.  Not sure what the downside of that
> would be.

Loosing the ability to restart a process where the reason for exiting
are non-fatal and shouldn't be logged noisily or are already logged. I
actually could use both capabilities.

Greetings,

Andres Freund

-- Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services