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 2003/03/02 21:48:56 UTC

cvs commit: jakarta-tomcat-connectors/jk/native2/common jk_worker_status.c

costin      2003/03/02 12:48:56

  Modified:    jk/native2/common jk_worker_status.c
  Log:
  The entries in the scoreboard will be presented as beans. A bit hacky, but
  works without too much overhead.
  
  Revision  Changes    Path
  1.38      +156 -4    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.37
  retrieving revision 1.38
  diff -u -r1.37 -r1.38
  --- jk_worker_status.c	1 Mar 2003 05:49:58 -0000	1.37
  +++ jk_worker_status.c	2 Mar 2003 20:48:56 -0000	1.38
  @@ -77,6 +77,8 @@
   
   #define JK_CHECK_NULL( str ) ( ((str)==NULL) ? "null" : (str) )
   
  +/** Display info for one endpoint
  + */
   static void jk2_worker_status_displayStat(jk_env_t *env, jk_ws_service_t *s,
                                             jk_stat_t *stat,
                                             int *totalReqP, int *totalErrP,
  @@ -127,6 +129,8 @@
       *totalErrP=totalErr;
   }
   
  +/** Displays the totals
  + */
   static void jk2_worker_status_displayAggregate(jk_env_t *env, jk_ws_service_t *s,
                                                  int totalReq, int totalErr,
                                                  unsigned long totalTime, unsigned long maxTime )
  @@ -150,6 +154,11 @@
       s->jkprintf(env, s, "</tr></table>\n");
   }
   
  +/** Information for the internal endpoints ( in this process ).
  +    Duplicates info from the scoreboard. This is used for debugging and for
  +    cases where scoreboard is not available. No longer included in the
  +    normal display to avoid confusion.
  + */
   static void jk2_worker_status_displayEndpointInfo(jk_env_t *env, jk_ws_service_t *s,
                                                     jk_workerEnv_t *wenv)
   {
  @@ -193,6 +202,10 @@
                                           totalReq, totalErr, totalTime, maxTime);
   }
   
  +/** Special case for endpoints - the info is stored in a shm segment, to be able
  + *   to access info from all other processes in a multi-process server.
  + *  For single process servers - the scoreboard is just a local char*.
  + */
   static void jk2_worker_status_displayScoreboardInfo(jk_env_t *env, jk_ws_service_t *s,
                                                       jk_workerEnv_t *wenv)
   {
  @@ -416,6 +429,119 @@
       s->jkprintf( env,s , "</table>\n" );
   }
   
  +/** List metadata for endpoints ( from scoreboard ) using the remote-jmx style
  +  */
  +static void jk2_worker_status_lstEndpoints(jk_env_t *env, jk_ws_service_t *s,
  +                                           jk_workerEnv_t *wenv)
  +{
  +    jk_map_t *map=wenv->initData;
  +    int i;
  +    int j;
  +    int totalReq=0;
  +    int totalErr=0;
  +    unsigned long totalTime=0;
  +    unsigned long maxTime=0;
  +    int needHeader=JK_TRUE;
  +    
  +    if( wenv->shm==NULL || wenv->shm->head==NULL) {
  +        return;
  +    }
  +
  +    for( i=1; i < wenv->shm->head->lastSlot; i++ ) {
  +        jk_shm_slot_t *slot= wenv->shm->getSlot( env, wenv->shm, i );
  +
  +        if( slot==NULL ) continue;
  +        
  +        if( strncmp( slot->name, "epStat", 6 ) == 0 ) {
  +            /* This is an endpoint slot */
  +            void *data=slot->data;
  +            char *name=JK_CHECK_NULL(slot->name);
  +
  +            for( j=0; j<slot->structCnt ; j++ ) {
  +                jk_stat_t *statArray=(jk_stat_t *)data;
  +                jk_stat_t *stat=statArray + j;
  +
  +                s->jkprintf(env, s, "N|endpoint|endpoint:%s%d\n", name, j );
  +
  +                s->jkprintf(env, s, "G|endpoint:%s%d|id\n", name, j); 
  +                s->jkprintf(env, s, "G|endpoint:%s%d|requests\n", name, j); 
  +                s->jkprintf(env, s, "G|endpoint:%s%d|errors\n", name, j); 
  +                s->jkprintf(env, s, "G|endpoint:%s%d|lastRequest\n", name, j); 
  +                s->jkprintf(env, s, "G|endpoint:%s%d|lastConnectionTime\n", name, j); 
  +                s->jkprintf(env, s, "G|endpoint:%s%d|totalTime\n", name, j); 
  +                s->jkprintf(env, s, "G|endpoint:%s%d|maxTime\n", name, j); 
  +                s->jkprintf(env, s, "G|endpoint:%s%d|requestStart\n", name, j); 
  +                s->jkprintf(env, s, "G|endpoint:%s%d|jkTime\n", name, j); 
  +                s->jkprintf(env, s, "G|endpoint:%s%d|requestEnd\n", name, j);
  +            }
  +        }
  +    }
  +}
  +
  +
  +/** List values for endpoints ( from scoreboard ) using the remote-jmx style
  +  */
  +static void jk2_worker_status_dmpEndpoints(jk_env_t *env, jk_ws_service_t *s,
  +                                           jk_workerEnv_t *wenv)
  +{
  +    jk_map_t *map=wenv->initData;
  +    int i;
  +    int j;
  +    int totalReq=0;
  +    int totalErr=0;
  +    unsigned long totalTime=0;
  +    unsigned long maxTime=0;
  +    int needHeader=JK_TRUE;
  +
  +    if( wenv->shm==NULL || wenv->shm->head==NULL) {
  +        return;
  +    }
  +
  +    for( i=1; i < wenv->shm->head->lastSlot; i++ ) {
  +        jk_shm_slot_t *slot= wenv->shm->getSlot( env, wenv->shm, i );
  +
  +        if( slot==NULL ) continue;
  +        
  +        if( strncmp( slot->name, "epStat", 6 ) == 0 ) {
  +            /* This is an endpoint slot */
  +            void *data=slot->data;
  +            char *name=JK_CHECK_NULL(slot->name);
  +
  +            /* XXX Add info about number of slots */
  +            for( j=0; j<slot->structCnt ; j++ ) {
  +                jk_stat_t *statArray=(jk_stat_t *)data;
  +                jk_stat_t *stat=statArray + j;
  +				
  +                s->jkprintf(env, s, "G|endpoint:%s%d|id|%d\n", name, j,
  +                            stat->workerId); 
  +                s->jkprintf(env, s, "G|endpoint:%s%d|requests|%d\n", name, j,
  +                            stat->reqCnt);
  +                s->jkprintf(env, s, "G|endpoint:%s%d|errors|%d\n", name, j,
  +                            stat->errCnt);
  +                s->jkprintf(env, s, "G|endpoint:%s%d|lastRequest|%s\n", name, j,
  +                            JK_CHECK_NULL(stat->active)); 
  +#ifdef HAS_APR
  +                {
  +                    char ctimeBuf[APR_CTIME_LEN];
  +                    apr_ctime( ctimeBuf, stat->connectedTime );
  +                    s->jkprintf(env, s, "G|endpoint:%s%d|lastConnectionTime|%s\n", name, j, ctimeBuf);
  +                    
  +                    s->jkprintf(env, s, "G|endpoint:%s%d|totalTime|%ld\n", name, j, (long)stat->totalTime );
  +                    s->jkprintf(env, s, "G|endpoint:%s%d|maxTime|%ld\n", name, j, (long)stat->maxTime ); 
  +
  +                    s->jkprintf(env, s, "G|endpoint:%s%d|requestStart|%lu\n", name, j, (long)stat->startTime); 
  +                    s->jkprintf(env, s, "G|endpoint:%s%d|jkTime|%ld\n", name, j,
  +                                (long)(stat->jkStartTime - stat->startTime) );
  +                    s->jkprintf(env, s, "G|endpoint:%s%d|requestEnd|%ld\n", name, j,
  +                                (long)(stat->endTime - stat->startTime) );
  +                }
  +#endif
  +            }
  +
  +        }
  +    }
  +}
  +
   static int JK_METHOD jk2_worker_status_list(jk_env_t *env,
                                               jk_worker_t *w, 
                                               jk_ws_service_t *s)
  @@ -434,7 +560,7 @@
       }
       if( qryLen >0 ) {
           if( cName[strlen(cName)-1] == '*' ) {
  -            printf("Exact match off %s\n", cName );
  +/*             printf("Exact match off %s\n", cName ); */
               cName[strlen(cName)-1]='\0';
               exact=0;
               qryLen--;
  @@ -453,7 +579,15 @@
           /* Prefix */
           if( (! exact)  && qryLen != 0 && strncmp( name, cName, qryLen )!= 0 )
               continue;
  -        
  +
  +        /* Endpoints are treated specially ( scoreboard to get the ep from other
  +            processes */
  +        if( strncmp( "endpoint", mbean->type, 8 ) == 0 )
  +            continue;
  +
  +        if( strncmp( "threadMutex", mbean->type, 11 ) == 0 )
  +            continue;
  +
           /* Exact */
           if( exact && qryLen != 0 && strcmp( name, cName )!= 0 )
               continue;
  @@ -471,8 +605,9 @@
               s->jkprintf(env, s, "S|%s|%s\n", name, *setAtt);
               setAtt++;
           }
  -        
  +
       }
  +    jk2_worker_status_lstEndpoints( env, s, s->workerEnv);
       return JK_OK;
   }
   
  @@ -494,7 +629,7 @@
       }
       if( qryLen >0 ) {
           if( cName[strlen(cName)-1] == '*' ) {
  -            printf("Exact match off %s\n", cName );
  +/*             printf("Exact match off %s\n", cName ); */
               cName[strlen(cName)-1]='\0';
               exact=0;
               qryLen--;
  @@ -510,6 +645,14 @@
           if( strchr( name, ':' )==NULL )
               continue;
           
  +        /* Endpoints are treated specially ( scoreboard to get the ep from other
  +            processes */
  +        if( strncmp( "endpoint", mbean->type, 8 ) == 0 )
  +            continue;
  +
  +        if( strncmp( "threadMutex", mbean->type, 11 ) == 0 )
  +            continue;
  +
           /* Prefix */
           if( ! exact  && qryLen != 0 && strncmp( name, cName, qryLen )!= 0 )
               continue;
  @@ -529,6 +672,7 @@
                   getAtt++;
           }
       }
  +    jk2_worker_status_dmpEndpoints( env, s, s->workerEnv);
       return JK_OK;
   }
   
  @@ -598,7 +742,12 @@
           
           if( strcmp( name, cName ) == 0 &&
               mbean->setAttribute != NULL ) {
  +
  +            /* Found the object */
               int res=mbean->setAttribute( env, mbean, attName, attVal );
  +            /* Increment the version */
  +            mbean->ver++;
  +            
               s->jkprintf( env, s, "OK|%s|%s|%d", cName, attName, res );
               return JK_OK;
           }
  @@ -706,6 +855,9 @@
   
       if( strncmp( s->query_string, "scoreboard=", 11) == 0 ) {
           jk2_worker_status_displayScoreboardInfo(env, s, s->workerEnv );
  +        return JK_OK;
  +    }
  +    if( strncmp( s->query_string, "endpoints=", 11) == 0 ) {
           jk2_worker_status_displayEndpointInfo( env, s, s->workerEnv );
           return JK_OK;
       }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org