costin 01/12/15 09:36:25 Modified: jk/native2/server/apache2 mod_jk.c Log: Use jk_map for headers. Make sure we copy all data we'll need later in long-lived pools. Changed the option ( that I added few weeks ago ) to set jk properties in httpd.conf to JkSet. All jk options that can be set in workers.properties can also be set using "JkSet name value" instead of "name=value" in the .properties file. Finally added the per-dir configuration that will allow the 'native mapper' to work. This is still experimental, but will provide huge improvements in jk scalability ! The idea is that you can use "JkWorker" in any <Location> ( eventually included in a <VirtualHost> section ) to specify that location is a webapp and what worker to use. Apache will use it's normal mapper to locate the context - without any need to duplicate this in jk. For sites with a large number of virtual hosts/apps this is very significant. ( of course, JkMount remains and we'll add the autoconf, but none of those should be used for large sites, at least not with the current uri mapper ) Revision Changes Path 1.12 +123 -63 jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk.c Index: mod_jk.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/server/apache2/mod_jk.c,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- mod_jk.c 2001/12/14 07:14:59 1.11 +++ mod_jk.c 2001/12/15 17:36:25 1.12 @@ -59,7 +59,7 @@ * Description: Apache 2 plugin for Jakarta/Tomcat * * Author: Gal Shachor <[EMAIL PROTECTED]> * * Henri Gomez <[EMAIL PROTECTED]> * - * Version: $Revision: 1.11 $ * + * Version: $Revision: 1.12 $ * ***************************************************************************/ /* @@ -151,12 +151,39 @@ if (context[0]!='/') return "Context must start with /"; workerEnv->init_data->put( NULL, workerEnv->init_data, - context, worker, NULL ); + ap_pstrdup(cmd->pool,context), + ap_pstrdup(cmd->pool,worker), + NULL ); return NULL; } +/** XXX This should be JkWebapp, it 'defines' the app + */ +static const char *jk_set_worker(cmd_parms *cmd, void *per_dir, + const char *workerName) +{ + jk_uriEnv_t *uriEnv=(jk_uriEnv_t *)per_dir; + jk_webapp_t *webapp; + server_rec *s = cmd->server; + + jk_workerEnv_t *workerEnv = + (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module); + + /* Do we know the url ? */ + webapp=workerEnv->createWebapp( workerEnv, NULL, NULL, NULL ); + uriEnv->webapp=webapp; + webapp->workerName=ap_pstrdup(cmd->pool, workerName); + + uriEnv->workerEnv=workerEnv; + + fprintf(stderr, "XXX Set worker %p %s\n", uriEnv, workerName ); + + return NULL; +} + + /* * JkWorkersFile Directive Handling * @@ -206,7 +233,7 @@ } /* - * JkWorker name value + * JkSet name value */ static const char *jk_worker_property(cmd_parms *cmd, void *dummy, @@ -247,8 +274,10 @@ } if(value) { - void *old = NULL; - m->put(NULL, m, name, value, &old); + m->put(NULL, m, + ap_pstrdup(cmd->pool, name), + ap_pstrdup(cmd->pool, value), + NULL); /*printf("Setting %s %s\n", name, value);*/ } return NULL; @@ -294,7 +323,8 @@ jk_workerEnv_t *workerEnv = (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module); - workerEnv->init_data->put( NULL, workerEnv->init_data, "logger.file.level", log_level, NULL); + workerEnv->init_data->put( NULL, workerEnv->init_data, "logger.file.level", + ap_pstrdup(cmd->pool, log_level), NULL); return NULL; } @@ -311,7 +341,8 @@ jk_workerEnv_t *workerEnv = (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module); - workerEnv->init_data->put( NULL, workerEnv->init_data, "logger.file.timeFormat", log_format, NULL); + workerEnv->init_data->put( NULL, workerEnv->init_data, "logger.file.timeFormat", + ap_pstrdup(cmd->pool,log_format), NULL); return NULL; } @@ -513,7 +544,8 @@ workerEnv->envvars_in_use = JK_TRUE; - workerEnv->envvars->put(NULL, workerEnv->envvars, env_name, default_value, NULL); + workerEnv->envvars->put(NULL, workerEnv->envvars, env_name, + ap_pstrdup(cmd->pool,default_value) , NULL); return NULL; } @@ -521,15 +553,15 @@ static const command_rec jk_cmds[] = { /* - * JkWorkersFile specifies a full path to the location of the worker + * JkWorkersFile specifies a full path to the location of the jk * properties file. - * - * This file defines the different workers used by apache to redirect - * servlet requests. */ AP_INIT_TAKE1( "JkWorkersFile", jk_set_worker_file, NULL, RSRC_CONF, "the name of a worker file for the Jakarta servlet containers"), + AP_INIT_TAKE1( + "JkProperties", jk_set_worker_file, NULL, RSRC_CONF, + "the name of a worker file for the Jakarta servlet containers"), /* * JkWorker allows you to specify worker properties in server.xml. @@ -537,22 +569,10 @@ * as a more convenient way to configure */ AP_INIT_TAKE2( - "JkWorker", jk_worker_property, NULL, RSRC_CONF, - "worker property"), + "JkSet", jk_worker_property, NULL, RSRC_CONF, + "Set a jk property, same syntax and rules as in JkWorkersFile"), /* - * JkAutoMount specifies that the list of handled URLs must be - * asked to the servlet engine (autoconf feature) - */ - /* XXX auto mount will be enabled by default for all context maps - that do not have explicit mappings ( or just all contexts !, - explicit settings will just override the automatic one ) - */ - /* AP_INIT_TAKE12( */ - /* "JkAutoMount", jk_automount_context, NULL, RSRC_CONF, */ - /* "automatic mount points to a Tomcat worker"), */ - - /* * JkMount mounts a url prefix to a worker (the worker need to be * defined in the worker properties file. */ @@ -561,6 +581,13 @@ "A mount point from a context to a Tomcat worker"), /* + * JkWorker sets the worker associated with a <Location> directive. + */ + AP_INIT_TAKE1( + "JkWorker", jk_set_worker, NULL, ACCESS_CONF, + "Worker to be used for a webapp declared as Location"), + + /* * JkMountCopy specifies if mod_jk should copy the mount points * from the main server to the virtual servers. */ @@ -568,10 +595,12 @@ "JkMountCopy", jk_set_mountcopy, NULL, RSRC_CONF, "Should the base server mounts be copied to the virtual server"), + /* -------------------- Should be part of workers.properties ------------ */ /* * JkLogFile & JkLogLevel specifies to where should the plugin log * its information and how much. * JkLogStampFormat specify the time-stamp to be used on log + * XXX We should use error.log ! */ AP_INIT_TAKE1( "JkLogFile", jk_set_log_file, NULL, RSRC_CONF, @@ -650,7 +679,8 @@ jk_uriEnv_t *new = (jk_uriEnv_t *)apr_pcalloc(p, sizeof(jk_uriEnv_t)); - printf("XXX Create dir config %s\n", dummy); + printf("XXX Create dir config %s %p\n", dummy, new); + new->uri = dummy; return new; } @@ -661,8 +691,9 @@ jk_uriEnv_t *add = (jk_uriEnv_t *)addv; jk_uriEnv_t *new = (jk_uriEnv_t *)apr_pcalloc(p,sizeof(jk_uriEnv_t)); + /* XXX */ - printf("XXX Merged dir config \n"); + printf("XXX Merged dir config %p %p\n", base, new); return add; } @@ -682,7 +713,6 @@ /** First create a pool */ -#define NO_APACHE_POOL #ifdef NO_APACHE_POOL jk_pool_create( &globalPool, NULL, 2048 ); #else @@ -708,13 +738,11 @@ #endif env->logger=l; + l->level=JK_LOG_ERROR_LEVEL; - l->jkLog(l, JK_LOG_DEBUG, "Created env and logger\n" ); - /* Create the workerEnv */ workerEnvPool= - env->globalPool->create( env->globalPool, HUGE_POOL_SIZE ); - + env->globalPool->create( env->globalPool, HUGE_POOL_SIZE ); workerEnv= env->getInstance( env, workerEnvPool, "workerEnv", "default"); @@ -830,51 +858,68 @@ return; } +/* Apache will first validate the config then restart. + That will unload all .so modules - including ourself. + Keeping 'was_initialized' in workerEnv is pointless, since both + will disapear. +*/ +static int jk_apache2_isValidating(apr_pool_t *gPool, apr_pool_t **mainPool) { + apr_pool_t *tmpPool=NULL; + void *data=NULL; + int i; + + for( i=0; i<10; i++ ) { + tmpPool=apr_pool_get_parent( gPool ); + if( tmpPool == NULL ) { + break; + } + gPool=tmpPool; + } + + if( tmpPool == NULL ) { + /* We can't detect the root pool */ + return JK_FALSE; + } + if(mainPool != NULL ) + *mainPool=gPool; + + /* We have a global pool ! */ + apr_pool_userdata_get( &data, "mod_jk_init", gPool ); + if( data==NULL ) { + return JK_TRUE; + } else { + return JK_FALSE; + } +} + static int jk_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) { jk_workerEnv_t *workerEnv; - apr_pool_t *gPool=plog; - apr_pool_t *tmpPool=plog; + apr_pool_t *gPool=NULL; void *data=NULL; - int i; + int rc; if(s->is_virtual) return OK; workerEnv = (jk_workerEnv_t *)ap_get_module_config(s->module_config, &jk_module); - - /* Apache will first validate the config then restart. - That will unload all .so modules - including ourself. - Keeping 'was_initialized' in workerEnv is pointless, since both - will disapear. - */ - for( i=0; i<10; i++ ) { - tmpPool=apr_pool_get_parent( gPool ); - if( tmpPool == NULL ) { - /* workerEnv->l->jkLog(workerEnv->l, JK_LOG_INFO, */ - /* "mod_jk.post_config() found global at %d\n",i); */ - break; - } - gPool=tmpPool; - } - if( tmpPool == NULL ) { - /* We have a global pool ! */ - apr_pool_userdata_get( &data, "mod_jk_init", gPool ); - if( data==NULL ) { - workerEnv->l->jkLog(workerEnv->l, JK_LOG_INFO, - "mod_jk.post_config() first invocation\n",i); - apr_pool_userdata_set( "INITOK", "mod_jk_init", NULL, gPool ); - return OK; - } + rc=jk_apache2_isValidating( plog, &gPool ); + if( rc == JK_TRUE ) { + /* This is the first step */ + workerEnv->l->jkLog(workerEnv->l, JK_LOG_INFO, + "mod_jk.post_config() first invocation\n"); + apr_pool_userdata_set( "INITOK", "mod_jk_init", NULL, gPool ); + return OK; } workerEnv->l->jkLog(workerEnv->l, JK_LOG_INFO, "mod_jk.post_config() second invocation\n" ); + if(!workerEnv->was_initialized) { workerEnv->was_initialized = JK_TRUE; init_jk( pconf, workerEnv, s ); @@ -929,13 +974,13 @@ jk_worker_t *worker=NULL; jk_endpoint_t *end = NULL; jk_uriEnv_t *uriEnv; + jk_uriEnv_t *dirEnv; jk_workerEnv_t *workerEnv; uriEnv=ap_get_module_config( r->request_config, &jk_module ); /* not for me, try next handler */ - if(uriEnv==NULL || - strcmp(r->handler,JK_HANDLER)!= 0 ) + if(uriEnv==NULL || strcmp(r->handler,JK_HANDLER)!= 0 ) return DECLINED; /* If this is a proxy request, we'll notify an error */ @@ -962,6 +1007,10 @@ r->uri, worker->name); } else { worker=uriEnv->webapp->worker; + if( worker==NULL && uriEnv->webapp->workerName != NULL ) { + worker=workerEnv->getWorkerForName( workerEnv, uriEnv->webapp->workerName); + uriEnv->webapp->worker=worker; + } } if(worker==NULL ) { @@ -994,6 +1043,8 @@ return OK; /* NOT r->status, even if it has changed. */ } + l->jkLog(l, JK_LOG_ERROR, + "mod_jk.handler() Error connecting to tomcat %d\n", rc); return 500; } @@ -1009,6 +1060,15 @@ if(r->proxyreq) { return DECLINED; } + + uriEnv=ap_get_module_config( r->per_dir_config, &jk_module ); + if( uriEnv!= NULL && uriEnv->webapp!=NULL ) { + fprintf( stderr, "XXX urienv %p %p \n", uriEnv, uriEnv->webapp); + fprintf( stderr, "XXX urienv %s \n", uriEnv->webapp->workerName); + ap_set_module_config( r->request_config, &jk_module, uriEnv ); + r->handler=JK_HANDLER; + return OK; + } workerEnv=(jk_workerEnv_t *)ap_get_module_config(r->server->module_config, &jk_module); @@ -1086,7 +1146,7 @@ { STANDARD20_MODULE_STUFF, create_jk_dir_config,/* dir config creater */ - merge_jk_dir_config, /* dir merger --- default is to override */ + merge_jk_dir_config, /* dir merger --- default is to override */ create_jk_config, /* server config */ merge_jk_config, /* merge server config */ jk_cmds, /* command ap_table_t */
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>