You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2011/11/09 18:39:02 UTC
svn commit: r1199891 - in /tomcat/jk/trunk/native/common: jk_ajp_common.c
jk_ajp_common.h
Author: mturk
Date: Wed Nov 9 17:39:01 2011
New Revision: 1199891
URL: http://svn.apache.org/viewvc?rev=1199891&view=rev
Log:
Use a special flag for endpoint cache slot instead setting the slot to zero. It allows to close all sockets on ajp_destory and to speed up ajp_done, since there is no need to find the empty slot.
Modified:
tomcat/jk/trunk/native/common/jk_ajp_common.c
tomcat/jk/trunk/native/common/jk_ajp_common.h
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=1199891&r1=1199890&r2=1199891&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.c (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.c Wed Nov 9 17:39:01 2011
@@ -36,6 +36,10 @@
#include "novsock2.h"
#endif
+/* Macro for checking the availability of the cache slot
+ */
+#define IS_SLOT_AVAIL(s) ((s) != NULL && (s)->avail)
+
const char *response_trans_headers[] = {
"Content-Type",
"Content-Language",
@@ -860,7 +864,8 @@ static int ajp_next_connection(ajp_endpo
unsigned int i;
for (i = 0; i < aw->ep_cache_sz; i++) {
/* Find cache slot with usable socket */
- if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+ if (IS_SLOT_AVAIL(aw->ep_cache[i]) &&
+ IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
ae->sd = aw->ep_cache[i]->sd;
aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
break;
@@ -1088,8 +1093,10 @@ void jk_ajp_pull(ajp_worker_t * aw, int
if (rc) {
unsigned int i;
for (i = 0; i < aw->ep_cache_sz; i++) {
- /* Close all connections in the cache */
- if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+ /* Close all avail connections in the cache
+ * Note that this won't change active connections.
+ */
+ if (IS_SLOT_AVAIL(aw->ep_cache[i]) && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
int sd = aw->ep_cache[i]->sd;
aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
aw->ep_cache[i]->addr_sequence = aw->addr_sequence;
@@ -1153,7 +1160,7 @@ void jk_ajp_push(ajp_worker_t * aw, int
unsigned int i;
for (i = 0; i < aw->ep_cache_sz; i++) {
/* Close all connections in the cache */
- if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+ if (IS_SLOT_AVAIL(aw->ep_cache[i]) && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
int sd = aw->ep_cache[i]->sd;
aw->ep_cache[i]->sd = JK_INVALID_SOCKET;
aw->ep_cache[i]->addr_sequence = aw->addr_sequence;
@@ -2740,6 +2747,7 @@ static int ajp_create_endpoint_cache(ajp
}
p->ep_cache[i]->sd = JK_INVALID_SOCKET;
p->ep_cache[i]->reuse = JK_FALSE;
+ p->ep_cache[i]->avail = JK_TRUE;
p->ep_cache[i]->hard_close = JK_FALSE;
p->ep_cache[i]->last_access = now;
jk_open_pool(&(p->ep_cache[i]->pool), p->ep_cache[i]->buf,
@@ -3063,34 +3071,16 @@ int JK_METHOD ajp_done(jk_endpoint_t **e
*e = NULL;
JK_ENTER_CS(&w->cs, rc);
if (rc) {
- int i;
-
- for (i = w->ep_cache_sz - 1; i >= 0; i--) {
- if (w->ep_cache[i] == NULL) {
- w->ep_cache[i] = p;
- break;
- }
- }
+ p->avail = JK_TRUE;
JK_LEAVE_CS(&w->cs, rc);
- if (i >= 0) {
- if (JK_IS_DEBUG_LEVEL(l))
- jk_log(l, JK_LOG_DEBUG,
- "recycling connection pool slot=%u for worker %s",
- i, p->worker->name);
- JK_TRACE_EXIT(l);
- return JK_TRUE;
- }
- /* This should never hapen because
- * there is always free empty cache slot
- */
- jk_log(l, JK_LOG_ERROR,
- "could not find empty connection pool slot from %u for worker %s",
- w->ep_cache_sz, w->name);
+ if (JK_IS_DEBUG_LEVEL(l))
+ jk_log(l, JK_LOG_DEBUG,
+ "recycling connection pool for worker %s and socket %d",
+ p->worker->name, (int)p->sd);
JK_TRACE_EXIT(l);
- return JK_FALSE;
+ return JK_TRUE;
}
-
jk_log(l, JK_LOG_ERROR,
"locking thread (errno=%d)", errno);
JK_TRACE_EXIT(l);
@@ -3122,11 +3112,11 @@ int ajp_get_endpoint(jk_worker_t *pThis,
unsigned int slot;
/* Try to find connected socket cache entry */
for (slot = 0; slot < aw->ep_cache_sz; slot++) {
- if (aw->ep_cache[slot] &&
+ if (IS_SLOT_AVAIL(aw->ep_cache[slot]) &&
IS_VALID_SOCKET(aw->ep_cache[slot]->sd)) {
ae = aw->ep_cache[slot];
if (ae->reuse) {
- aw->ep_cache[slot] = NULL;
+ aw->ep_cache[slot]->avail = JK_FALSE;
break;
}
else {
@@ -3134,6 +3124,7 @@ int ajp_get_endpoint(jk_worker_t *pThis,
* opened socket in the cache
*/
ajp_reset_endpoint(ae, l);
+ ae->avail = JK_TRUE;
ae = NULL;
jk_log(l, JK_LOG_WARNING,
"closing non reusable pool slot=%d", slot);
@@ -3145,9 +3136,9 @@ int ajp_get_endpoint(jk_worker_t *pThis,
* Use the first free one.
*/
for (slot = 0; slot < aw->ep_cache_sz; slot++) {
- if (aw->ep_cache[slot]) {
+ if (IS_SLOT_AVAIL(aw->ep_cache[slot])) {
ae = aw->ep_cache[slot];
- aw->ep_cache[slot] = NULL;
+ aw->ep_cache[slot]->avail = JK_FALSE;
break;
}
}
@@ -3248,7 +3239,8 @@ int JK_METHOD ajp_maintain(jk_worker_t *
for (i = (int)aw->ep_cache_sz - 1;
i >= 0; i--) {
/* Skip the closed sockets */
- if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+ if (IS_SLOT_AVAIL(aw->ep_cache[i]) &&
+ IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
int elapsed = (int)difftime(mstarted, aw->ep_cache[i]->last_access);
if (elapsed > aw->cache_timeout) {
time_t rt = 0;
@@ -3279,7 +3271,8 @@ int JK_METHOD ajp_maintain(jk_worker_t *
if (aw->conn_ping_interval > 0 && aw->ping_timeout > 0) {
for (i = (int)aw->ep_cache_sz - 1; i >= 0; i--) {
/* Skip the closed sockets */
- if (aw->ep_cache[i] && IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
+ if (IS_SLOT_AVAIL(aw->ep_cache[i]) &&
+ IS_VALID_SOCKET(aw->ep_cache[i]->sd)) {
int elapsed = (int)difftime(now, aw->ep_cache[i]->last_access);
if (elapsed > aw->conn_ping_interval) {
k++;
@@ -3360,7 +3353,7 @@ int ajp_has_endpoint(jk_worker_t *pThis,
unsigned int slot;
/* Try to find connected socket cache entry */
for (slot = 0; slot < aw->ep_cache_sz; slot++) {
- if (aw->ep_cache[slot]) {
+ if (IS_SLOT_AVAIL(aw->ep_cache[slot])) {
JK_LEAVE_CS(&aw->cs, rc);
return JK_TRUE;
}
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=1199891&r1=1199890&r2=1199891&view=diff
==============================================================================
--- tomcat/jk/trunk/native/common/jk_ajp_common.h (original)
+++ tomcat/jk/trunk/native/common/jk_ajp_common.h Wed Nov 9 17:39:01 2011
@@ -381,7 +381,7 @@ struct ajp_endpoint
jk_sock_t sd;
int reuse;
-
+ int avail; /* Set to non-zero if cache slot is available */
/* Used with RECOVER_ABORT_IF_CLIENTERROR to hard abort
write of AJP response on client write errors */
int hard_close;
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org