diff --git a/mod_wsgi.c b/mod_wsgi.c index fd304bd..c65344e 100644 --- a/mod_wsgi.c +++ b/mod_wsgi.c @@ -13659,14 +13659,37 @@ static int wsgi_hook_init(apr_pool_t *pconf, apr_pool_t *ptemp, * Init function gets called twice during startup, we only * need to actually do anything on the second time it is * called. This avoids unecessarily initialising and then - * destroying Python for no reason. + * destroying Python for no reason. We also though have to + * deal with a special case when a graceful restart is done. + * For that we are only called once, which is generally okay + * as the 'wsgi_init' key will be set from initial start up + * of the server. The exception to this is where the module + * is only loaded into Apache when the server is already + * running. In this case we have to detect that it is not + * the initial startup, but a subsequent restart. We can do + * this by looking at whether the scoreboard has been + * initialised yet. That is probably enough, but to be safe, + * also check what generation it is. */ apr_pool_userdata_get(&data, userdata_key, s->process->pool); if (!data) { apr_pool_userdata_set((const void *)1, userdata_key, apr_pool_cleanup_null, s->process->pool); - return OK; + + /* + * Check for the special case of a graceful restart and + * the module being loaded for the first time. In this + * case we still go onto perform initialisation as the + * initialisation routine for the module will not be + * called a second time. + */ + + if (!ap_scoreboard_image || + ap_get_scoreboard_global()->running_generation == 0) { + + return OK; + } } /* Setup module version information. */