Comment 35 for bug 1493372

Revision history for this message
Davanum Srinivas (DIMS) (dims-v) wrote :

Notes that will be useful for MOS 8.0, we should stick to the puppet reviews above for MOS 7.0

So, digging into root cause of why mod_wsgi segfaults to have a better fix for MOS 8.0 led to the learning of intricacies of how "apachectl graceful" works with the modules.

mod_wsgi uses ap_hook_post_config to register a wsgi_hook_init which is supposed to fire when the module is initially loaded
https://github.com/GrahamDumpleton/mod_wsgi/blob/develop/src/server/mod_wsgi.c#L15087

in wsgi_hook_init, a global data structure wsgi_server_config is loaded with information:
https://github.com/GrahamDumpleton/mod_wsgi/blob/develop/src/server/mod_wsgi.c#L12360

Note that wsgi_hook_init has a hack to smartly side step the case where wsgi_hook_init is called twice (during apache start)
https://github.com/GrahamDumpleton/mod_wsgi/blob/develop/src/server/mod_wsgi.c#L12307

wsgi_hook_child_init is supposed to be called after wsgi_hook_init and uses the information in wsgi_server_config. Problem is that when graceful is triggered, the mod_wsgi.so is unloaded and reloaded BUT wsgi_hook_init is called just once! As documented in the apache wiki [1] this smart hack fails miserably for our case. As the wiki page eloquently says

"In this case, the post_config hook is executed once after restart and will only set the flag. Module initialization will not be performed, and when child_init and other hooks are called, bad things may happen."

Which is exactly why we fail when we try to use the wsgi_server_config datastructure in wsgi_hook_child_init during the graceful scenario.

Note that all pointers above are to the latest git of mod_wsgi, so it's still not been fixed in mod_wsgi. We need to provide a work around to mod_wsgi community that allows the behavior we need which is load everything the first time wsgi_hook_init is called and don't do anything if it is called again.

[1] https://wiki.apache.org/httpd/ModuleLife