You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modules-dev@httpd.apache.org by Jacques Amar <ja...@amar.com> on 2009/01/04 04:03:54 UTC

Where to initialize a global pool/hash - server create or child_init?

Where to begin ....

I am creating a global pool/hash in which I save cached, hard to 
calculate data (pre-compiled regex expressions etc.). I also store pages 
I've created using this data in memcached (using the APR interface). I 
can't save the calculated regex data in memcached. I initially followed 
the advice of creating a private pool, hash and mutex inside a 
child_init hook in my server config structure, protecting all access 
with the mutex. The module works well enough in regular httpd. However, 
when I tried this in worker MPM I got constant:
[notice] child pid xxxxx exit signal Segmentation fault (11)
after a few page loads.

On a whim, I moved the whole creation of these structures into a server 
config hook. All these issues seem to have vanished. I have "theorized" 
that the pool I am creating at every child creation does not properly work.

I am looking for a discussion of the pros and cons of creating this in a 
per child hook, versus the one time server create hook and any other 
pointers to help decide (and debug) where/when I should use one or the 
other.

Boy, I hope this makes sense.


Re: Where to initialize a global pool/hash - server create or child_init?

Posted by Sorin Manolache <so...@gmail.com>.
On Sun, Jan 4, 2009 at 05:03, Jacques Amar <ja...@amar.com> wrote:
> Where to begin ....
>
> I am creating a global pool/hash in which I save cached, hard to calculate
> data (pre-compiled regex expressions etc.). I also store pages I've created
> using this data in memcached (using the APR interface). I can't save the
> calculated regex data in memcached. I initially followed the advice of
> creating a private pool, hash and mutex inside a child_init hook in my
> server config structure, protecting all access with the mutex. The module
> works well enough in regular httpd. However, when I tried this in worker MPM
> I got constant:
> [notice] child pid xxxxx exit signal Segmentation fault (11)
> after a few page loads.
>
> On a whim, I moved the whole creation of these structures into a server
> config hook. All these issues seem to have vanished. I have "theorized" that
> the pool I am creating at every child creation does not properly work.
>
> I am looking for a discussion of the pros and cons of creating this in a per
> child hook, versus the one time server create hook and any other pointers to
> help decide (and debug) where/when I should use one or the other.

pre/post_config are run as the user who starts the server (root
typically). child_init is run as the httpd user (configured with the
User config directive).

If the hash is read-only (it is never changed after initialisation) I
guess you don't even need the mutex. In this case, I guess there's no
difference between child_init and post_config (except the effective
UID that runs the code, as said above).

If the data is changed by one worker and you want the change be
visible to all other workers, you have to put your initialisation in
post_config.

Regarding debugging, run your apache in debug (single-process) mode
(apache2 -X) and check if you still get the segfaults. If yes, load
apache2 in a debugger (I use gdb):

gdb $HOME/usr/sbin/apache2
set args -f $HOME/etc/apache2/apache2.conf -X
break my_handler
run

Issue a request and check where it segfaults.

Sorin

-- 
A: Because it reverses the logical flow of conversation.
Q: Why is top-posting frowned upon?
A: Top-posting.
Q: What is the most annoying thing in e-mail?