You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by rj...@apache.org on 2015/01/05 12:22:38 UTC

svn commit: r1649503 - in /tomcat/jk/trunk/native: apache-1.3/mod_jk.c apache-2.0/mod_jk.c common/jk_ajp_common.c common/jk_ajp_common.h common/jk_lb_worker.c common/jk_service.h common/jk_worker.c common/jk_worker.h

Author: rjung
Date: Mon Jan  5 11:22:37 2015
New Revision: 1649503

URL: http://svn.apache.org/r1649503
Log:
BZ 56703: Improve connection counting used in
status worker for monitoring purposes.

Use a shutdown cleanup handler in mod_jk (Apache)
to correctly count down connections closed by
terminating child processes.

Modified:
    tomcat/jk/trunk/native/apache-1.3/mod_jk.c
    tomcat/jk/trunk/native/apache-2.0/mod_jk.c
    tomcat/jk/trunk/native/common/jk_ajp_common.c
    tomcat/jk/trunk/native/common/jk_ajp_common.h
    tomcat/jk/trunk/native/common/jk_lb_worker.c
    tomcat/jk/trunk/native/common/jk_service.h
    tomcat/jk/trunk/native/common/jk_worker.c
    tomcat/jk/trunk/native/common/jk_worker.h

Modified: tomcat/jk/trunk/native/apache-1.3/mod_jk.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/apache-1.3/mod_jk.c?rev=1649503&r1=1649502&r2=1649503&view=diff
==============================================================================
--- tomcat/jk/trunk/native/apache-1.3/mod_jk.c (original)
+++ tomcat/jk/trunk/native/apache-1.3/mod_jk.c Mon Jan  5 11:22:37 2015
@@ -3543,6 +3543,7 @@ static int jk_fixups(request_rec * r)
 
 static void child_exit_handler(server_rec * s, ap_pool * p)
 {
+    wc_shutdown(main_log);
     /* srevilak - refactor cleanup body to jk_generic_cleanup() */
     jk_generic_cleanup(s);
     jk_shm_close(main_log);

Modified: tomcat/jk/trunk/native/apache-2.0/mod_jk.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/apache-2.0/mod_jk.c?rev=1649503&r1=1649502&r2=1649503&view=diff
==============================================================================
--- tomcat/jk/trunk/native/apache-2.0/mod_jk.c (original)
+++ tomcat/jk/trunk/native/apache-2.0/mod_jk.c Mon Jan  5 11:22:37 2015
@@ -2668,6 +2668,7 @@ static apr_status_t jk_cleanup_child(voi
         while (jk_watchdog_running)
             apr_sleep(apr_time_from_sec(1));
     }
+    wc_shutdown(main_log);
     return jk_cleanup_proc(data);
 }
 

Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.c?rev=1649503&r1=1649502&r2=1649503&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.c (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.c Mon Jan  5 11:22:37 2015
@@ -3124,6 +3124,7 @@ int JK_METHOD ajp_worker_factory(jk_work
     aw->worker.worker_private = aw;
 
     aw->worker.maintain = ajp_maintain;
+    aw->worker.shutdown = ajp_shutdown;
 
     aw->logon = NULL;
 
@@ -3461,6 +3462,49 @@ int JK_METHOD ajp_maintain(jk_worker_t *
         JK_TRACE_EXIT(l);
         return JK_TRUE;
     }
+    else {
+        JK_LOG_NULL_PARAMS(l);
+    }
+
+    JK_TRACE_EXIT(l);
+    return JK_FALSE;
+}
+
+int JK_METHOD ajp_shutdown(jk_worker_t *pThis, jk_logger_t *l)
+{
+    JK_TRACE_ENTER(l);
+
+    if (pThis && pThis->worker_private) {
+        ajp_worker_t *aw = pThis->worker_private;
+        int i;
+        unsigned int n = 0;
+
+        JK_ENTER_CS(&aw->cs);
+        for (i = (int)aw->ep_cache_sz - 1;
+                i >= 0; i--) {
+            /* Skip the closed sockets
+             */
+            if (IS_SLOT_AVAIL(aw->ep_cache[i]) &&
+                IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+                n++;
+                aw->ep_cache[i]->reuse = JK_FALSE;
+                aw->ep_cache[i]->hard_close = JK_TRUE;
+                ajp_reset_endpoint(aw->ep_cache[i], l);
+                aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
+                if (JK_IS_DEBUG_LEVEL(l))
+                    jk_log(l, JK_LOG_DEBUG,
+                           "(%s) shut down pool slot=%d",
+                           aw->name, i);
+            }
+        }
+        JK_LEAVE_CS(&aw->cs);
+        if (n && JK_IS_DEBUG_LEVEL(l))
+            jk_log(l, JK_LOG_DEBUG,
+                   "(%s) shut down %u sockets from %u pool slots",
+                   aw->name, n, aw->ep_cache_sz);
+        JK_TRACE_EXIT(l);
+        return JK_TRUE;
+    }
     else {
         JK_LOG_NULL_PARAMS(l);
     }

Modified: tomcat/jk/trunk/native/common/jk_ajp_common.h
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.h?rev=1649503&r1=1649502&r2=1649503&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.h (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.h Mon Jan  5 11:22:37 2015
@@ -468,6 +468,8 @@ int ajp_connection_tcp_get_message(ajp_e
 
 int JK_METHOD ajp_maintain(jk_worker_t *pThis, time_t now, jk_logger_t *l);
 
+int JK_METHOD ajp_shutdown(jk_worker_t *pThis, jk_logger_t *l);
+
 void jk_ajp_get_cping_text(int mode, char *buf);
 int jk_ajp_get_cping_mode(const char *m, int def);
 

Modified: tomcat/jk/trunk/native/common/jk_lb_worker.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_lb_worker.c?rev=1649503&r1=1649502&r2=1649503&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_lb_worker.c (original)
+++ tomcat/jk/trunk/native/common/jk_lb_worker.c Mon Jan  5 11:22:37 2015
@@ -777,6 +777,29 @@ static int JK_METHOD maintain_workers(jk
     return JK_TRUE;
 }
 
+static int JK_METHOD shutdown_workers(jk_worker_t *p, jk_logger_t *l)
+{
+    unsigned int i = 0;
+
+    JK_TRACE_ENTER(l);
+    if (p && p->worker_private) {
+        lb_worker_t *lb = (lb_worker_t *)p->worker_private;
+
+        for (i = 0; i < lb->num_of_workers; i++) {
+            if (lb->lb_workers[i].worker->shutdown) {
+                lb->lb_workers[i].worker->shutdown(lb->lb_workers[i].worker, l);
+            }
+        }
+
+    }
+    else {
+        JK_LOG_NULL_PARAMS(l);
+    }
+
+    JK_TRACE_EXIT(l);
+    return JK_TRUE;
+}
+
 static int find_by_session(jk_ws_service_t *s,
                            lb_worker_t *p,
                            const char *session_route,
@@ -2005,6 +2028,7 @@ int JK_METHOD lb_worker_factory(jk_worke
         private_data->worker.get_endpoint = get_endpoint;
         private_data->worker.destroy = destroy;
         private_data->worker.maintain = maintain_workers;
+        private_data->worker.shutdown = shutdown_workers;
         private_data->recover_wait_time = WAIT_BEFORE_RECOVER;
         private_data->error_escalation_time = private_data->recover_wait_time / 2;
         private_data->max_reply_timeouts = 0;

Modified: tomcat/jk/trunk/native/common/jk_service.h
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_service.h?rev=1649503&r1=1649502&r2=1649503&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_service.h (original)
+++ tomcat/jk/trunk/native/common/jk_service.h Mon Jan  5 11:22:37 2015
@@ -546,6 +546,11 @@ struct jk_worker
      */
     int (JK_METHOD * maintain) (jk_worker_t *w, time_t now, jk_logger_t *l);
 
+    /*
+     * Shut this worker down.
+     */
+    int (JK_METHOD * shutdown) (jk_worker_t *w, jk_logger_t *l);
+
 };
 
 /*

Modified: tomcat/jk/trunk/native/common/jk_worker.c
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_worker.c?rev=1649503&r1=1649502&r2=1649503&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_worker.c (original)
+++ tomcat/jk/trunk/native/common/jk_worker.c Mon Jan  5 11:22:37 2015
@@ -28,6 +28,9 @@
 #include "jk_util.h"
 #include "jk_mt.h"
 
+#define JK_WORKER_SHUTDOWN_WAIT 100
+#define JK_WORKER_SHUTDOWN_COUNT 10
+
 static void close_workers(jk_logger_t *l);
 
 static worker_factory get_factory_for(const char *type);
@@ -39,6 +42,7 @@ static int build_worker_map(jk_map_t *in
 
 /* Global worker list */
 static jk_map_t *worker_map;
+static int running_maintain = 0;
 #if _MT_CODE
 static JK_CRIT_SEC worker_lock;
 #endif
@@ -311,7 +315,6 @@ const char *wc_get_name_for_type(int typ
 void wc_maintain(jk_logger_t *l)
 {
     static time_t last_maintain = 0;
-    static int    running_maintain = 0;
     int sz = jk_map_size(worker_map);
 
     JK_TRACE_ENTER(l);
@@ -355,3 +358,37 @@ void wc_maintain(jk_logger_t *l)
     }
     JK_TRACE_EXIT(l);
 }
+
+void wc_shutdown(jk_logger_t *l)
+{
+    int sz = jk_map_size(worker_map);
+
+    JK_TRACE_ENTER(l);
+
+    if (sz > 0) {
+        int i;
+
+        i = JK_WORKER_SHUTDOWN_COUNT;
+        while (running_maintain && i > 0) {
+            jk_sleep(JK_WORKER_SHUTDOWN_WAIT);
+            i--;
+        }
+        if (running_maintain)
+            jk_log(l, JK_LOG_WARNING,
+                   "Worker maintain still running while shutting down worker %s",
+                   jk_map_name_at(worker_map, i));
+        running_maintain = 1;
+
+        for (i = 0; i < sz; i++) {
+            jk_worker_t *w = jk_map_value_at(worker_map, i);
+            if (w && w->shutdown) {
+                if (JK_IS_DEBUG_LEVEL(l))
+                    jk_log(l, JK_LOG_DEBUG,
+                           "Shutting down worker %s",
+                           jk_map_name_at(worker_map, i));
+                w->shutdown(w, l);
+            }
+        }
+    }
+    JK_TRACE_EXIT(l);
+}

Modified: tomcat/jk/trunk/native/common/jk_worker.h
URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_worker.h?rev=1649503&r1=1649502&r2=1649503&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_worker.h (original)
+++ tomcat/jk/trunk/native/common/jk_worker.h Mon Jan  5 11:22:37 2015
@@ -49,6 +49,8 @@ int wc_create_worker(const char *name, i
 
 void wc_maintain(jk_logger_t *l);
 
+void wc_shutdown(jk_logger_t *l);
+
 #ifdef __cplusplus
 }
 #endif                          /* __cplusplus */



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