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