You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by co...@apache.org on 2002/01/12 06:20:18 UTC
cvs commit: jakarta-tomcat-connectors/jk/native2/common jk_worker_status.c
costin 02/01/11 21:20:18
Modified: jk/native2/common jk_worker_status.c
Log:
More code to display status information on the jni worker. Very good for
debugging ( especially lb ).
Revision Changes Path
1.2 +162 -30 jakarta-tomcat-connectors/jk/native2/common/jk_worker_status.c
Index: jk_worker_status.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_worker_status.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- jk_worker_status.c 31 Dec 2001 20:37:01 -0000 1.1
+++ jk_worker_status.c 12 Jan 2002 05:20:17 -0000 1.2
@@ -76,21 +76,167 @@
#define JK_BUF_SIZE 4096
-typedef struct {
+typedef struct jk_buff {
int pos;
int size;
char *buf;
+
+ jk_ws_service_t *s;
+
+ void (*jkprintf)( jk_env_t *env, struct jk_buff *buf, char *frm,... );
+ void (*flush)( jk_env_t *env );
} jk_buff_t;
+static void jk_printf( jk_env_t *env, jk_buff_t *buf, char *fmt,... )
+{
+ va_list vargs;
+ int ret=0;
+
+ va_start(vargs,fmt);
+ buf->pos=0; /* Temp - we don't buffer */
+ ret=apr_vsnprintf(buf->buf + buf->pos, buf->size - buf->pos, fmt, vargs);
+ va_end(vargs);
+
+ buf->s->write( env, buf->s, buf->buf, strlen(buf->buf) );
+ fprintf(stderr, "Writing %d %s \n", ret, buf->buf);
+}
+
+static void jk_worker_status_displayWorkers( jk_env_t *env, jk_buff_t *buf,
+ jk_workerEnv_t *wenv )
+{
+ jk_map_t *map=wenv->worker_map;
+ int i;
+
+ jk_printf(env, buf, "<H2>Workers</H2>\n" );
+ jk_printf(env, buf, "<table border>\n");
+
+ jk_printf(env, buf, "<tr><th>Name</th><th>Retries</th>"
+ "<th>Err</th><th>Recovery</th></tr>");
+
+ for( i=0; i< map->size( env, map ) ; i++ ) {
+ char *name=map->nameAt( env, map, i );
+ jk_worker_t *worker=(jk_worker_t *)map->valueAt( env, map,i );
+
+ jk_printf(env, buf, "<tr id='worker.%s'>", name );
+ jk_printf(env, buf, "<td class='name'>%s</td>", name );
+ jk_printf(env, buf, "<td class='connect_retry'>%d</td>",
+ worker->connect_retry_attempts );
+ jk_printf(env, buf, "<td class='in_error'>%d</td>",
+ worker->in_error_state );
+ jk_printf(env, buf, "<td class='in_error'>%d</td>",
+ worker->in_recovering );
+
+ /* Endpoint cache ? */
+
+ /* special case for status worker */
+
+ jk_printf(env, buf, "</tr>" );
+ }
+ jk_printf(env, buf, "</table>\n");
+}
+
+static void jk_worker_status_displayWorkerEnv( jk_env_t *env, jk_buff_t *buf,
+ jk_workerEnv_t *wenv )
+{
+ jk_map_t *map=wenv->init_data;
+ int i;
+
+ jk_printf(env, buf, "<H2>Worker Env Info</H2>\n");
+
+ jk_printf(env, buf, "<table border>\n");
+ jk_printf(env, buf, "<tr><th>num_workers</th>"
+ "<td id='workersCount'>%d</td></tr>\n",
+ wenv->num_of_workers);
+ /* Could be modified dynamically */
+ jk_printf(env, buf, "<tr><th>LogLevel</th>"
+ "<td id='logLevel'>%d</td></tr>\n",
+ wenv->log_level);
+
+ jk_printf(env, buf, "</table>\n");
+
+ jk_printf(env, buf, "<H3>Properties</H3>\n");
+ jk_printf(env, buf, "<table border>\n");
+ jk_printf(env, buf, "<tr><th>Name</th><th>Value</td></tr>\n");
+ for( i=0; i< map->size( env, map ) ; i++ ) {
+ char *name=map->nameAt( env, map, i );
+ char *value=(char *)map->valueAt( env, map,i );
+
+ jk_printf(env, buf, "<tr><td>%s</td><td>%s</td></tr>", name,
+ value);
+ }
+ jk_printf(env, buf, "</table>\n");
+
+}
+
+static void jk_worker_status_displayWebapps( jk_env_t *env, jk_buff_t *buf,
+ jk_workerEnv_t *wenv )
+{
+ jk_map_t *map=wenv->webapps;
+ int i;
+
+ jk_printf(env, buf, "<H2>Webapps</H2>\n");
+
+ if( map==NULL ) {
+ jk_printf(env, buf, "None\n");
+ return;
+ }
+
+ jk_printf(env, buf, "<table border>\n");
+
+ jk_printf(env, buf, "<tr><th>Name</th><th>DocBase</th>"
+ "<th>Mappings</th></tr>");
+
+ for( i=0; i< map->size( env, map ) ; i++ ) {
+ char *name=map->nameAt( env, map, i );
+ jk_webapp_t *webapp=(jk_webapp_t *)map->valueAt( env, map,i );
+
+ jk_printf(env, buf, "<tr id='webapp.%s'>", name );
+ jk_printf(env, buf, "<td class='name'>%s</td>", name );
+ jk_printf(env, buf, "</tr>" );
+ }
+
+
+ jk_printf(env, buf, "</table>\n");
+}
+
+/* Channels and connections, including 'pooled' ones
+ */
+static void jk_worker_status_displayConnections( jk_env_t *env, jk_buff_t *buf,
+ jk_workerEnv_t *wenv )
+{
+ jk_printf(env, buf, "<H2>Active connections</H2>\n");
+ jk_printf(env, buf, "<table border>\n");
+
+
+ jk_printf(env, buf, "</table>\n");
+
+}
+
+static jk_buff_t *jk_worker_status_createBuffer(jk_env_t *env, jk_endpoint_t *e,
+ jk_ws_service_t *s)
+{
+ jk_buff_t *buff;
+ int bsize=JK_BUF_SIZE;
+
+ env->l->jkLog(env, env->l, JK_LOG_INFO, "create buffer()\n");
+ buff=(jk_buff_t *)s->pool->alloc( env, s->pool, sizeof( jk_buff_t) );
+ buff->s=s;
+ buff->size=bsize;
+ buff->buf=(char *)s->pool->alloc( env, s->pool, bsize );
+ buff->jkprintf=jk_printf;
+
+ return buff;
+}
static int JK_METHOD service(jk_env_t *env, jk_endpoint_t *e,
jk_ws_service_t *s,
int *is_recoverable_error)
{
- char *buff;
- int bsize=JK_BUF_SIZE;
+ jk_buff_t *buff=jk_worker_status_createBuffer(env, e, s );
+ env->l->jkLog(env, env->l, JK_LOG_INFO, "status.service() %p\n", e);
+
/* Generate the header */
s->status=200;
s->msg="OK";
@@ -99,16 +245,17 @@
fprintf(stderr, "Writing head \n");
s->head(env, s );
- /* Body */
- buff=(char *)s->pool->alloc( env, s->pool, bsize );
- strcpy(buff, "Hello\n");
- fprintf(stderr, "Writing %s \n", buff);
- s->write( env, s, buff, strlen( buff ));
+ /* Body */
+ jk_worker_status_displayWorkerEnv(env, buff, s->workerEnv );
+ jk_worker_status_displayWorkers(env, buff, s->workerEnv );
+ jk_worker_status_displayWebapps(env, buff, s->workerEnv );
+ jk_worker_status_displayConnections(env, buff, s->workerEnv );
s->afterRequest( env, s);
fprintf(stderr, "After req %s \n", buff);
return JK_TRUE;
+
}
static int JK_METHOD done(jk_env_t *env, jk_endpoint_t *e)
@@ -135,12 +282,10 @@
jk_pool_t *endpointPool;
if (_this->endpointCache != NULL ) {
-
e=_this->endpointCache->get( env, _this->endpointCache );
-
if (e!=NULL) {
env->l->jkLog(env, env->l, JK_LOG_INFO,
- "lb.getEndpoint(): Reusing endpoint\n");
+ "status.getEndpoint(): Reusing endpoint\n");
*pend = e;
return JK_TRUE;
}
@@ -152,21 +297,19 @@
sizeof(jk_endpoint_t));
if(e==NULL) {
env->l->jkLog(env, env->l, JK_LOG_ERROR,
- "lb_worker.getEndpoint() OutOfMemoryException\n");
+ "status_worker.getEndpoint() OutOfMemoryException\n");
return JK_FALSE;
}
e->pool = endpointPool;
-
e->cPool=endpointPool->create( env,endpointPool, HUGE_POOL_SIZE );
-
e->worker = _this;
e->service = service;
e->done = done;
e->channelData = NULL;
*pend = e;
- env->l->jkLog(env, env->l, JK_LOG_INFO, "lb_worker.getEndpoint()\n");
+ env->l->jkLog(env, env->l, JK_LOG_INFO, "status_worker.getEndpoint() %p\n", e);
return JK_TRUE;
}
@@ -177,21 +320,15 @@
if(w==NULL ) {
env->l->jkLog(env, env->l, JK_LOG_ERROR,
- "lb_worker.destroy() NullPointerException\n");
+ "status_worker.destroy() NullPointerException\n");
return JK_FALSE;
}
- for(i = 0 ; i < w->num_of_workers ; i++) {
- w->lb_workers[i]->destroy( env, w->lb_workers[i]);
- }
-
if( w->endpointCache != NULL ) {
-
for( i=0; i< w->endpointCache->ep_cache_sz; i++ ) {
jk_endpoint_t *e;
e= w->endpointCache->get( env, w->endpointCache );
-
if( e==NULL ) {
// we finished all endpoints in the cache
break;
@@ -204,7 +341,7 @@
w->endpointCache->destroy( env, w->endpointCache );
env->l->jkLog(env, env->l, JK_LOG_DEBUG,
- "lb.destroy() closed %d cached endpoints\n",i);
+ "status.destroy() closed %d cached endpoints\n",i);
}
w->pool->close(env, w->pool);
@@ -221,7 +358,7 @@
if(NULL == name ) {
env->l->jkLog(env, env->l, JK_LOG_ERROR,
- "lb_worker.factory() NullPointerException\n");
+ "status_worker.factory() NullPointerException\n");
return JK_FALSE;
}
@@ -229,7 +366,7 @@
if(_this==NULL) {
env->l->jkLog(env, env->l, JK_LOG_ERROR,
- "lb_worker.factory() OutOfMemoryException\n");
+ "status_worker.factory() OutOfMemoryException\n");
return JK_FALSE;
}
@@ -246,11 +383,6 @@
*result=_this;
- /* env->l->jkLog(env, env->l, JK_LOG_INFO, */
- /* "lb_worker.factory() New lb worker\n"); */
-
- /* name, pool will be set by workerEnv ( our factory ) */
-
return JK_TRUE;
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>