Re: Postgres service stops when I kill client backend on Windows - Mailing list pgsql-hackers

From Oleg Bartunov
Subject Re: Postgres service stops when I kill client backend on Windows
Date
Msg-id CAF4Au4wN7k=m2D8ak8OWT2nwDtAKFEeQGdc+kVi=_hB-UHrYyA@mail.gmail.com
Whole thread Raw
In response to Re: Postgres service stops when I kill client backend on Windows  (Dmitry Vasilyev <d.vasilyev@postgrespro.ru>)
Responses Re: Postgres service stops when I kill client backend on Windows
List pgsql-hackers


On Mon, Oct 12, 2015 at 4:42 PM, Dmitry Vasilyev <d.vasilyev@postgrespro.ru> wrote:
Hello, Amit!

On Пн, 2015-10-12 at 11:25 +0530, Amit Kapila wrote:
On Sun, Oct 11, 2015 at 9:12 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
>
> Magnus Hagander <magnus@hagander.net> writes:
> > On Sun, Oct 11, 2015 at 5:22 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
> >> I'm a bit suspicious that we may have leaked a handle to the shared
> >> memory block someplace, for example.  That would explain why this
> >> symptom is visible now when it was not in 2009.  Or maybe it's dependent
> >> on some feature that we didn't test back then --- for instance, if
> >> the logging collector is in use, could it have inherited a handle and
> >> not closed it?
>
> > Even if we leaked it, it should go away when the other processes died.
>
> I'm fairly certain that we do not kill/restart the logging collector
> during a database restart (because it's impossible to reproduce the
> original stderr destination if we do).  

True and it seems this is the reason for issue we are discussing here.
The reason why this happens is that during creation of shared memory
(PGSharedMemoryCreate()), we duplicate the handle such that it
become inheritable by all child processes.  Then during fork
(syslogger_forkexec()->postmaster_forkexec()->internal_forkexec) we
always inherit the handles which causes syslogger to get a copy of
shared memory handle which it neither uses and nor closes it.

I could easily reproduce the issue if logging collector is on and even if
we try to increase the loop count or sleep time in PGSharedMemoryCreate(),
it doesn't change the situation as the syslogger has a valid handle to
shared memory.  One way to fix is to just close the shared memory handle
in sys logger as we are not going to need it and attached patch which does
this fixes the issue for me.  Another invasive fix in case we want to
retain shared memory handle for some purpose (future requirement) could
be to send some signal to syslogger in restart path so that it can release
the shared memory handle.



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

Specified patch with "ifdef WIN32" is working for me. Maybe it’s necessary to check open handlers from replication for example?


Assuming the problem will be fixed, should we release Beta2 soon ?

 

--------------
Dmitry Vasilyev
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

pgsql-hackers by date:

Previous
From: Dmitry Vasilyev
Date:
Subject: Re: Postgres service stops when I kill client backend on Windows
Next
From: Tom Lane
Date:
Subject: Re: Postgres service stops when I kill client backend on Windows