[Devel] [Fwd: Re: [Serdev] main_loop() initialization order]
Klaus Darilion
klaus.mailinglists at pernau.at
Wed Feb 14 14:53:45 CET 2007
Does this address openser too?
regards
klaus
-------- Original Message --------
Subject: Re: [Serdev] main_loop() initialization order
Date: Wed, 14 Feb 2007 14:14:16 +0100
From: Jan Janak <jan at iptel.org>
To: Jan Andres <jan.andres at freenet-ag.de>
CC: serdev at iptel.org
References: <20070213085456.GA26505 at localhost.localdomain>
Jan Andres wrote:
> Hi,
>
> We have found a bug in SER and are currently a bit unsure what is the
> correct approach to fix it.
>
> The problem: main_loop() must call init_child() from the main process
> before forking off the TCP listener processes. init_child() will call
> the child initialization functions of all the loaded modules, and some
> of them may open database sessions. The TCP listeners will inherit these
> sessions after the fork(), so all TCP listeners attempt to communicate
> with the database over the same TCP session, which of course fails sooner
> or later, producing weird errors that are quite hard to debug.
>
> This problem was specifically observed with the usrloc module, but it
> likely affects other modules as well.
>
> Potential solutions:
> 1. Fix all modules so that they don't open database sessions when their
> child init functions are called in PROC_MAIN. Also, database sessions
> are possibly not be the only thing affected by this issue.
> 2. Never run any modules' child_init_function when init_child(PROC_MAIN)
> is called. As far as I can see, after it has forked all the children,
> the main process does nothing but signal handling, so there should be
> no need to init the modules for that process.
>
> What are the list's opinions on this?
It appears to me that the problem is in child_init being called before
fork. I am not sure why does that happen in TCP listeners (this is
probably a question for Andrei), but child_init functions should be
called after the fork (only mod_init is called before fork). All
modules assume this behavior and hence open database connections from
child_init (to avoid inherited database connections).
Thanks for the report, we will take a look at it.
Jan.
_______________________________________________
Serdev mailing list
Serdev at lists.iptel.org
http://lists.iptel.org/mailman/listinfo/serdev
--
Klaus Darilion
nic.at
More information about the Devel
mailing list