You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by jl...@locus.apache.org on 2000/04/01 19:37:29 UTC

cvs commit: jakarta-tomcat/src/native/apache/jserv jserv_wrapper_unix.c

jluc        00/04/01 09:37:29

  Modified:    src/native/apache/jserv jserv_wrapper_unix.c
  Log:
  solved (at least I think) the double initialization (Unix) due to Apache defensive startup. We now start the JVM  only in the 2nd pass (in automatic mode).
  
  This works well if you take care to set the :
  ApJServVMTimeout value in jserv.conf big enough to start & initialize the servlet engine + servlets loaded at startup.
  This value is for me 10 seconds to start Tomcat, JServ works with 4.
  
  This was I think the major reason to not use automatic startup of Tomcat by Apache
  
  Jean-Luc
  
  Revision  Changes    Path
  1.3       +33 -12    jakarta-tomcat/src/native/apache/jserv/jserv_wrapper_unix.c
  
  Index: jserv_wrapper_unix.c
  ===================================================================
  RCS file: /home/cvs/jakarta-tomcat/src/native/apache/jserv/jserv_wrapper_unix.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- jserv_wrapper_unix.c	2000/03/30 09:26:57	1.2
  +++ jserv_wrapper_unix.c	2000/04/01 17:37:29	1.3
  @@ -55,9 +55,9 @@
   
   /*****************************************************************************
    * Description: wrapper protocol implementation for Win32 systems            *
  - * Author:      Pierpaolo Fumagalli <ia...@iname.com>,                      *
  - *              Ed Korthof <ed...@ultimanet.com>                                *
  - * Version:     $Revision: 1.2 $                                             *
  + * Author:      Pierpaolo Fumagalli <ia...@iname.com>,                      *
  + *              Ed Korthof <ed...@ultimanet.com>                                *
  + * Version:     $Revision: 1.3 $                                             *
    *****************************************************************************/
   #include "jserv.h"
   #include "http_conf_globals.h"
  @@ -121,7 +121,10 @@
       sleep(1);
     }
     if( waitpid(jvm_pid,NULL,WNOHANG)==0 ) {
  +    jserv_error(JSERV_LOG_INFO, wrapper_data->config,
  +		"wrapper: kill (SIGKILL) Java VM (PID=%d)", getpid());
       kill(jvm_pid, SIGKILL);
  +    waitpid(jvm_pid,NULL,0); /* if it does not died, KERNEL bug! */
     }
     jvm_pid=0;
   }
  @@ -178,6 +181,18 @@
       char **arg;
       char **env;
   
  +   /* Apache on Unix has a 2 phases startup initialization : */
  +   /* we will here spawn only one JVM in the 2nd pass.       */ 
  +    if (ap_standalone && getppid() == 1) {
  +        jserv_error(JSERV_LOG_INFO,wrapper_data->config,
  +                    "Apache-JServ 2nd  initialization starting JVM now: %d %d %d", ap_standalone, getpid(), getppid()); 
  +    }
  +    else {
  +        jserv_error(JSERV_LOG_INFO,wrapper_data->config,
  +                    "Apache-JServ 1rst  initialization: JVM will be started later %d %d %d", ap_standalone, getpid(), getppid()); 
  +        return 0;
  +    }
  +
       /* Fork the process and return child pid to parent */
       proc=fork();
       /*jserv_error(JSERV_LOG_INFO,wrapper_data->config,
  @@ -192,10 +207,6 @@
   
       if (proc!=0) return proc;
           
  -    /* Sleep two seconds waiting for first init to finish and to kill this
  -     * process  - TODO remove this and find a nicer soulution to doublestart */
  -    sleep(3);
  -
       /* If we get a TERM signal, shut down the JVM nicely, then exit.
        */
       signal(SIGTERM, wrapper_shutdown);
  @@ -297,7 +308,7 @@
           /* Change uid to the server's User, if appropriate */
           if (
   #ifdef _OSD_POSIX
  -            os_init_job_environment(cfg->config->server, ap_user_name) != 0 ||
  +            os_init_job_environment(cfg->config->server, ap_user_name, 0) != 0 ||
   #endif
               setuid(cfg->config->server->server_uid) == -1) {
   
  @@ -332,12 +343,17 @@
   
       if (jvm_pid != 0) { /* The parent in this fork will be the watcher process */
           int last_restart = time(NULL);
  +        jserv_error(JSERV_LOG_DEBUG,wrapper_data->config,
  +                "wrapper: watching processes in %d seconds(PID=%d,PPID=%d,JVM PID=%d)",
  +                wrapper_data->config->vmtimeout, getpid(),getppid(), jvm_pid);
           sleep(wrapper_data->config->vmtimeout);
         
  -        jserv_error(JSERV_LOG_INFO,wrapper_data->config,
  -                "wrapper: watching processes (PID=%d,PPID=%d,JVM PID=%d)",
  -                getpid(),getppid(), jvm_pid);
  -        /* Check every second */
  +        jserv_error(JSERV_LOG_DEBUG,wrapper_data->config,
  +                "wrapper: watching processes every %d seconds(PID=%d,PPID=%d,JVM PID=%d)",
  +                wrapper_data->config->vminterval, getpid(),getppid(), jvm_pid);
  +
  +        /* Check every ApJServVMInterval seconds */
  +
           while (1) {
   	  sighandler_t old_handler;
   
  @@ -424,11 +440,16 @@
   				       wrapper_exec_jserv_core(arg[0], arg, env);
   				     }
   				     last_restart = time(NULL);
  +				     jserv_error(JSERV_LOG_DEBUG, wrapper_data->config,
  +					      "wrapper: sleep config->vmtimeout %d (PID=%d)", wrapper_data->config->vmtimeout, getpid());
   				     sleep(wrapper_data->config->vmtimeout);
  +                                     continue;
   				}
   			}
   
   			/* delay before rechecking for jvm (jluc: hope it's the rigth place) */
  +                        jserv_error(JSERV_LOG_DEBUG, wrapper_data->config,
  +                                    "wrapper: sleep config->vminterval %d (PID=%d)", wrapper_data->config->vminterval, getpid());
   			sleep(wrapper_data->config->vminterval);
           }
       }