You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2002/10/26 14:38:45 UTC

cvs commit: jakarta-tomcat-connectors/jk/native2/server/apache2 mod_jk2.c jk_service_apache2.c

mturk       2002/10/26 05:38:45

  Modified:    jk/native2/server/apache2 mod_jk2.c jk_service_apache2.c
  Log:
  Move the scoreboard and childId detection from service_apache2 to the
  mod_jk2. Also set the child_init hook as last, so that mpm has
  a chance to create the scoreboard.
  
  Revision  Changes    Path
  1.55      +92 -14    jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk2.c
  
  Index: mod_jk2.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk2.c,v
  retrieving revision 1.54
  retrieving revision 1.55
  diff -u -r1.54 -r1.55
  --- mod_jk2.c	9 Oct 2002 17:10:52 -0000	1.54
  +++ mod_jk2.c	26 Oct 2002 12:38:45 -0000	1.55
  @@ -69,6 +69,7 @@
   
   #include "jk_apache2.h"
   #include "scoreboard.h"
  +#include "ap_mpm.h"
   
   #include "util_script.h"
   
  @@ -248,6 +249,8 @@
           if( child->mbean->debug > -1 ) {
               fprintf(stderr, "mod_jk2:mergeDirConfig() Merged dir config %#lx %s %s %s %s\n",
                       child, child->uri, parent->uri, child->workerName, parent->workerName);
  +            fprintf(stderr, "mod_jk2:mergeDirConfig() Merged dir config %#lx %s %s %s %s\n",
  +                    child, child->uri, parent->uri, child->workerName, parent->workerName);
           }
       }
   
  @@ -311,7 +314,6 @@
           env->l->jkLog(env, env->l, JK_LOG_ERROR, "Error creating workerEnv\n");
           return;
       }
  -
       workerEnv->initData->add( env, workerEnv->initData, "serverRoot",
                                 workerEnv->pool->pstrdup( env, workerEnv->pool, ap_server_root));
       env->l->jkLog(env, env->l, JK_LOG_INFO, "Set serverRoot %s\n", ap_server_root);
  @@ -329,16 +331,19 @@
   {
       jk_uriEnv_t *newUri;
       jk_bean_t *jkb;
  -
  +    
       if(  workerEnv==NULL ) {
           jk2_create_workerEnv(p, s );
       }
  -    if( s->is_virtual == 1 ) {
  +    if( s->is_virtual ) {
           /* Virtual host */
  -        fprintf( stderr, "Create config for virtual host\n");
  +        ap_log_perror(APLOG_MARK, APLOG_DEBUG, 0, p,
  +                      "mod_jk Create config for virtual host %s\n",
  +                      s->server_hostname );
       } else {
  -        /* Default host */
  -        /*  fprintf( stderr, "Create config for main host\n");         */
  +        ap_log_perror(APLOG_MARK, APLOG_DEBUG, 0, p,
  +                      "mod_jk Create config for default server %s\n",
  +                      s->server_hostname );
       }
   
       jkb = workerEnv->globalEnv->createBean2( workerEnv->globalEnv,
  @@ -363,7 +368,9 @@
       jk_uriEnv_t *base = (jk_uriEnv_t *) basev;
       jk_uriEnv_t *overrides = (jk_uriEnv_t *)overridesv;
       
  -    fprintf(stderr,  "Merging workerEnv \n" );
  +    ap_log_perror(APLOG_MARK, APLOG_DEBUG, 0, p,
  +                  "mod_jk Merging workerEnv\n");
  +
       
       /* The 'mountcopy' option should be implemented in common.
        */
  @@ -375,6 +382,9 @@
       jk_env_t *env;
       if (workerEnv) {
           env=workerEnv->globalEnv;
  +
  +        env->l->jkLog(env, env->l, JK_LOG_INFO,
  +                      "mod_jk2 Shutting down\n");
           workerEnv->close(env, workerEnv);
           workerEnv = NULL;
       }
  @@ -394,6 +404,10 @@
   static char * jk2_init(jk_env_t *env, apr_pool_t *pconf,
                          jk_workerEnv_t *workerEnv, server_rec *s )
   {
  +    /* Ugly hack to get the childId - the index used in the scoreboard,
  +       which we'll use in the jk scoreboard
  +    */
  +
       workerEnv->init(env, workerEnv );
       workerEnv->server_name   = (char *)ap_get_server_version();
       /* Should be done in post config instead (cf DAV2) */
  @@ -459,7 +473,12 @@
       rc=jk2_apache2_isValidating( plog, &gPool );
   
       env->setAprPool(env, gPool);
  -    
  +
  +    if (!ap_exists_scoreboard_image()) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  +            "jk2_postconfig() No scoreboard image %d\n", getpid());
  +    }
  +
       if( rc == JK_OK && gPool != NULL ) {
           /* This is the first step */
           env->l->jkLog(env, env->l, JK_LOG_INFO,
  @@ -472,6 +491,7 @@
       env->l->jkLog(env, env->l, JK_LOG_INFO,
                     "mod_jk.post_config() second invocation\n" ); 
   
  +
       workerEnv->parentInit( env, workerEnv);
   
   
  @@ -488,6 +508,7 @@
   static void jk2_child_init(apr_pool_t *pconf, 
                              server_rec *s)
   {
  +    apr_proc_t proc;    
       jk_uriEnv_t *serverEnv=(jk_uriEnv_t *)
           ap_get_module_config(s->module_config, &jk2_module);
       jk_env_t *env;
  @@ -496,16 +517,71 @@
           workerEnv = serverEnv->workerEnv;
   
       env=workerEnv->globalEnv;
  +    
  +    if (!workerEnv->childProcessId)
  +        workerEnv->childProcessId = getpid();
  +
  +    proc.pid = workerEnv->childProcessId;
   
  -    if(!workerEnv->was_initialized) {
  +    /* detect if scoreboard exists
  +    */
  +    if (!ap_exists_scoreboard_image()) {
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  +            "jk2_init() Scoreboard image does not exists %d\n", proc.pid);
  +        workerEnv->childId=-2;
  +    }
  +    else
  +        workerEnv->childId = find_child_by_pid(&proc);
  +    /* Avoid looking again
  +    *  and fix the mpm_winnt reporting 0 daemons.
  +    */
  +    if (workerEnv->childId == -1) {
  +        int max_daemons_limit;
  +        ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons_limit);
  +
  +        if (max_daemons_limit == 0) {
  +            workerEnv->childId = 0;    
  +            env->l->jkLog(env, env->l, JK_LOG_INFO, 
  +                "jk2_init() Found child %d in scoreboard slot %d\n",
  +                proc.pid, workerEnv->childId);
  +        }
  +        else {
  +            env->l->jkLog(env, env->l, JK_LOG_ERROR, 
  +                "jk2_init() Can't find child %d in scoreboard\n",
  +                proc.pid);
  +            workerEnv->childId = -2;
  +        }
  +    } else {
  +        env->l->jkLog(env, env->l, JK_LOG_INFO, 
  +            "jk2_init() Found child %d in scoreboard slot %d\n",
  +            proc.pid, workerEnv->childId);
  +    }
  +    /* If the child slot was found in the scoreboard, increment the
  +     * generation status. This will prevent initializing jk2 if something
  +     * goes wrong.
  +     */
  +    if (workerEnv->childId >= 0) {
  +        workerEnv->childGeneration = ap_scoreboard_image->parent[workerEnv->childId].generation;
  +        ++ap_scoreboard_image->parent[workerEnv->childId].generation;
  +    }
  +
  +    if(!workerEnv->was_initialized && !workerEnv->childGeneration) {
           workerEnv->was_initialized = JK_TRUE;        
           
           jk2_init( env, pconf, workerEnv, s );
   
           if( workerEnv->childId <= 0 ) 
  -            env->l->jkLog(env, env->l, JK_LOG_INFO, "mod_jk child init %d %d\n",
  +            env->l->jkLog(env, env->l, JK_LOG_ERROR, "mod_jk child init %d %d\n",
                             workerEnv->was_initialized, workerEnv->childId );
       }
  +    if (workerEnv->childGeneration)
  +        env->l->jkLog(env, env->l, JK_LOG_ERROR, "mod_jk child workerEnv in error state %d\n",
  +                      workerEnv->childGeneration);
  +
  +    /* Restore the process generation */
  +    if (workerEnv->childId >= 0) {
  +        ap_scoreboard_image->parent[workerEnv->childId].generation = workerEnv->childGeneration;
  +    }
       
   }
   
  @@ -633,12 +709,13 @@
       if(r->proxyreq || workerEnv==NULL) {
           return DECLINED;
       }
  -    
  +
  +
       uriEnv=ap_get_module_config( r->per_dir_config, &jk2_module );
       
       /* get_env() */
       env = workerEnv->globalEnv->getEnv( workerEnv->globalEnv );
  -        
  +
       /* This has been mapped to a location by apache
        * In a previous ( experimental ) version we had a sub-map,
        * but that's too complex for now.
  @@ -750,7 +827,8 @@
   {
       ap_hook_handler(jk2_handler, NULL, NULL, APR_HOOK_MIDDLE);
       ap_hook_post_config(jk2_post_config,NULL,NULL,APR_HOOK_MIDDLE);
  -    ap_hook_child_init(jk2_child_init,NULL,NULL,APR_HOOK_MIDDLE);
  +    /* Force the mpm to run before us and set the scoreboard image */
  +    ap_hook_child_init(jk2_child_init,NULL,NULL,APR_HOOK_LAST);
       ap_hook_translate_name(jk2_translate,NULL,NULL,APR_HOOK_FIRST);
       ap_hook_map_to_storage(jk2_map_to_storage, NULL, NULL, APR_HOOK_MIDDLE);
   }
  
  
  
  1.31      +1 -30     jakarta-tomcat-connectors/jk/native2/server/apache2/jk_service_apache2.c
  
  Index: jk_service_apache2.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/jk_service_apache2.c,v
  retrieving revision 1.30
  retrieving revision 1.31
  diff -u -r1.30 -r1.31
  --- jk_service_apache2.c	18 Oct 2002 07:35:06 -0000	1.30
  +++ jk_service_apache2.c	26 Oct 2002 12:38:45 -0000	1.31
  @@ -67,7 +67,6 @@
    */
   #include "jk_apache2.h"
   
  -#include "scoreboard.h"
   #include "util_script.h"
   
   /* #define USE_APRTABLES  */
  @@ -347,34 +346,6 @@
       /* XXX Probably not needed, we're duplicating */
       jk2_requtil_initRequest(env, s);
   
  -    /* Ugly hack to get the childId - the index used in the scoreboard,
  -       which we'll use in the jk scoreboard
  -    */
  -    if( workerEnv->childId == -1 ) 
  -    {
  -        apr_proc_t proc;
  -    
  -        proc.pid=workerEnv->childProcessId;
  -
  -        /* detect if scoreboard exists, the method will SIGFLT
  -           since it doesn't check internally
  -        */
  -        if( r->connection->sbh==NULL ) {
  -            env->l->jkLog(env, env->l, JK_LOG_INFO, 
  -                          "service.init() No scoreboard %d\n", proc.pid);
  -            workerEnv->childId=-2;
  -        }
  -        workerEnv->childId=find_child_by_pid( & proc );
  -        /* Avoid looking again */
  -        if( workerEnv->childId == -1 ) {
  -            env->l->jkLog(env, env->l, JK_LOG_INFO, 
  -                          "service.init() Can't find child in scoreboard %d\n", proc.pid);
  -            workerEnv->childId=-2;
  -        } else {
  -            env->l->jkLog(env, env->l, JK_LOG_INFO, 
  -                          "service.init() Found child in scoreboard %d %d\n", proc.pid, workerEnv->childId);
  -        }
  -    }
   
       s->ws_private = r;
       s->response_started = JK_FALSE;
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>