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-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org