costin 01/12/04 11:06:48
Modified: jk/native2/common jk_handler_discovery.c
Log:
The discovery handler.
There are few issues with the autoconf - like the fact that tomcat must be
started, the handling of load balancing, etc.
The whole configuration must be re-opened, we need a solution that scales for
complex sites. This is just a start.
The good news is that this is optional, so we'll worry about discovery after
we get everything else fixed.
Revision Changes Path
1.3 +321 -18
jakarta-tomcat-connectors/jk/native2/common/jk_handler_discovery.c
Index: jk_handler_discovery.c
===================================================================
RCS file:
/home/cvs/jakarta-tomcat-connectors/jk/native2/common/jk_handler_discovery.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- jk_handler_discovery.c 2001/12/02 01:05:25 1.2
+++ jk_handler_discovery.c 2001/12/04 19:06:48 1.3
@@ -58,23 +58,176 @@
/**
* Description: AJP14 Discovery handler
* Author: Henri Gomez <[EMAIL PROTECTED]>
- * Version: $Revision: 1.2 $
+ * Version: $Revision: 1.3 $
*/
#include "jk_global.h"
-#include "jk_context.h"
#include "jk_pool.h"
-#include "jk_util.h"
#include "jk_msg_buff.h"
-#include "jk_ajp_common.h"
-#include "jk_ajp14.h"
#include "jk_logger.h"
#include "jk_service.h"
+#define CBASE_INC_SIZE (8) /* Allocate memory by step of 8 URIs : ie 8 URI by
context */
+#define URI_INC_SIZE (8) /* Allocate memory by step of 8 CONTEXTs : ie 8
contexts by worker */
+/** XXX XXX MERGE into jk_uriMap / jk_uriEnv */
+typedef struct {
+ char * cbase;
+ int status;
+ int size;
+ int capacity;
+ char ** uris;
+} jk_context_item_t;
+
+typedef struct {
+
+ /*
+ * Memory Pool
+ */
+
+ jk_pool_t p;
+ jk_pool_atom_t buf[SMALL_POOL_SIZE];
+
+ /*
+ * Virtual Server (if use)
+ */
+
+ char * virtual;
+
+ /*
+ * Num of context handled (ie: examples, admin...)
+ */
+
+ int size;
+
+ /*
+ * Capacity
+ */
+
+ int capacity;
+
+ /*
+ * Context list, context / URIs
+ */
+
+ jk_context_item_t ** contexts;
+}
+jk_context_t;
+
+
+/*
+ * functions defined here
+ */
+
+int context_set_virtual(jk_context_t *c, char *virtual);
+
+int context_open(jk_context_t *c, char *virtual);
+
+int context_free(jk_context_t **c);
+
+jk_context_item_t *context_find_base(jk_context_t *c, char *cbase);
+
+char *context_item_find_uri(jk_context_item_t *ci, char *uri);
+
+void context_dump_uris(jk_context_t *c, char *cbase, FILE *f);
+
+jk_context_item_t *context_add_base(jk_context_t *c, char *cbase);
+
+int context_add_uri(jk_context_t *c, char *cbase, char *uri);
+
+/*
+ * Context Query (web server -> servlet engine), which URI are handled by servlet
engine ?
+ */
+#define AJP14_CONTEXT_QRY_CMD (unsigned char)0x15
+
+/*
+ * Context Info (servlet engine -> web server), URI handled response
+ */
+#define AJP14_CONTEXT_INFO_CMD (unsigned char)0x16
+
+/*
+ * Context Update (servlet engine -> web server), status of context changed
+ */
+#define AJP14_CONTEXT_UPDATE_CMD (unsigned char)0x17
+
+/*
+ * Context Status (web server -> servlet engine), what's
+ * the status of the context ?
+ */
+#define AJP14_CONTEXT_STATE_CMD (unsigned char)0x1C
+
/*
+ * Context Status Reply (servlet engine -> web server), status of context
+ */
+#define AJP14_CONTEXT_STATE_REP_CMD (unsigned char)0x1D
+
+static int context_realloc(jk_context_t *c)
+{
+ if (c->size == c->capacity) {
+ jk_context_item_t **contexts;
+ int capacity = c->capacity + CBASE_INC_SIZE;
+
+ contexts = (jk_context_item_t **)jk_pool_alloc(&c->p,
sizeof(jk_context_item_t *) * capacity);
+
+ if (! contexts)
+ return JK_FALSE;
+
+ if (c->capacity && c->contexts)
+ memcpy(contexts, c->contexts, sizeof(jk_context_item_t *) *
c->capacity);
+
+ c->contexts = contexts;
+ c->capacity = capacity;
+ }
+
+ return JK_TRUE;
+}
+
+
+static int context_item_realloc(jk_context_t *c, jk_context_item_t *ci)
+{
+ if (ci->size == ci->capacity) {
+ char **uris;
+ int capacity = ci->capacity + URI_INC_SIZE;
+
+ uris = (char **)jk_pool_alloc(&c->p, sizeof(char *) * capacity);
+
+ if (! uris)
+ return JK_FALSE;
+
+ memcpy(uris, ci->uris, sizeof(char *) * ci->capacity);
+
+ ci->uris = uris;
+ ci->capacity = capacity;
+ }
+
+ return JK_TRUE;
+}
+
+/*
+ * Init the context info struct
+ */
+
+int context_open(jk_context_t *c, char *virtual)
+{
+ if (c) {
+ jk_open_pool(&c->p, c->buf, sizeof(jk_pool_atom_t) * SMALL_POOL_SIZE);
+ c->size = 0;
+ c->capacity = 0;
+ c->contexts = NULL;
+
+ if( virtual ) {
+ c->virtual=jk_pool_strdup(&c->p, virtual);
+ }
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+
+/*
* AJP14 Autoconf Phase
*
* CONTEXT QUERY / REPLY
@@ -82,7 +235,7 @@
#define MAX_URI_SIZE 512
-static int handle_discovery(ajp_endpoint_t *ae,
+static int handle_discovery(jk_endpoint_t *ae,
jk_workerEnv_t *we,
jk_msg_buf_t *msg,
jk_logger_t *l)
@@ -116,8 +269,9 @@
AJP14_CONTEXT_INFO_CMD, cmd);
return JK_FALSE;
}
-
- if (context_alloc(&c, we->virtual) != JK_TRUE) {
+
+ c=(jk_context_t *)malloc( sizeof(jk_context_t));
+ if (context_open(c, we->virtual) != JK_TRUE) {
l->jkLog(l, JK_LOG_ERROR,
"Error ajp14:discovery - can't allocate context room\n");
return JK_FALSE;
@@ -158,8 +312,9 @@
}
free(buf);
- context_free(&c);
-
+ jk_close_pool(&c->p);
+ free(c);
+ c = NULL;
#else
uri_worker_map_add(we->uri_to_worker,
@@ -176,7 +331,7 @@
return JK_TRUE;
}
-int discovery(ajp_endpoint_t *ae,
+int discovery(jk_endpoint_t *ae,
jk_workerEnv_t *we,
jk_logger_t *l)
{
@@ -261,7 +416,7 @@
l->jkLog(l, JK_LOG_DEBUG,
"ajp14_unmarshal_context_info - get virtual %s for virtual %s\n",
- vname, c->virtual);
+ vname, c->virtual);
if (! vname) {
l->jkLog(l, JK_LOG_ERROR,
@@ -275,12 +430,9 @@
vname != NULL &&
strcmp(c->virtual, vname)) {
/* set the virtual name, better to add to a virtual list ? */
-
- if (context_set_virtual(c, vname) == JK_FALSE) {
- l->jkLog(l, JK_LOG_ERROR,
- "Error ajp14_unmarshal_context_info "
- "- can't malloc virtual hostname\n");
- return JK_FALSE;
+
+ if( vname != NULL ) {
+ c->virtual= jk_pool_strdup(&c->p, vname);
}
}
@@ -519,5 +671,156 @@
jk_logger_t *l)
{
return (ajp14_unmarshal_context_state_reply(msg, c, l));
+}
+
+ /*
+ * Set the virtual name of the context
+ */
+
+int context_set_virtual(jk_context_t *c, char *virtual)
+{
+ if (c) {
+
+ if (virtual) {
+ c->virtual = jk_pool_strdup(&c->p, virtual);
+
+ if (! c->virtual)
+ return JK_FALSE;
+ }
+
+ return JK_TRUE;
+ }
+
+ return JK_FALSE;
+}
+
+/*
+ * Locate a context base in context list
+ */
+
+jk_context_item_t * context_find_base(jk_context_t *c, char *cbase)
+{
+ int i;
+ jk_context_item_t * ci;
+
+ if (! c || ! cbase)
+ return NULL;
+
+ for (i = 0 ; i < c->size ; i++) {
+
+ ci = c->contexts[i];
+
+ if (! ci)
+ continue;
+
+ if (! strcmp(ci->cbase, cbase))
+ return ci;
+ }
+
+ return NULL;
+}
+
+/*
+ * Locate an URI in a context item
+ */
+
+char * context_item_find_uri(jk_context_item_t *ci, char *uri)
+{
+ int i;
+
+ if (! ci || ! uri)
+ return NULL;
+
+ for (i = 0 ; i < ci->size ; i++) {
+ if (! strcmp(ci->uris[i], uri))
+ return ci->uris[i];
+ }
+
+ return NULL;
+}
+
+void context_dump_uris(jk_context_t *c, char *cbase, FILE * f)
+{
+ jk_context_item_t * ci;
+ int i;
+
+ ci = context_find_base(c, cbase);
+
+ if (! ci)
+ return;
+
+ for (i = 0; i < ci->size; i++)
+ fprintf(f, "/%s/%s\n", ci->cbase, ci->uris[i]);
+
+ fflush(f);
+}
+
+
+/*
+ * Add a new context item to context
+ */
+
+jk_context_item_t * context_add_base(jk_context_t *c, char *cbase)
+{
+ jk_context_item_t * ci;
+
+ if (! c || !cbase)
+ return NULL;
+
+ /* Check if the context base was not allready created */
+ ci = context_find_base(c, cbase);
+
+ if (ci)
+ return ci;
+
+ if (context_realloc(c) != JK_TRUE)
+ return NULL;
+
+ ci = (jk_context_item_t *)jk_pool_alloc(&c->p, sizeof(jk_context_item_t));
+
+ if (! ci)
+ return NULL;
+
+ c->contexts[c->size] = ci;
+ c->size++;
+ ci->cbase = jk_pool_strdup(&c->p, cbase);
+ ci->status = 0;
+ ci->size = 0;
+ ci->capacity = 0;
+ ci->uris = NULL;
+
+ return ci;
+}
+
+/*
+ * Add a new URI to a context item
+ */
+
+int context_add_uri(jk_context_t *c, char *cbase, char * uri)
+{
+ jk_context_item_t * ci;
+
+ if (! uri)
+ return JK_FALSE;
+
+ /* Get/Create the context base */
+ ci = context_add_base(c, cbase);
+
+ if (! ci)
+ return JK_FALSE;
+
+ if (context_item_find_uri(ci, uri) != NULL)
+ return JK_TRUE;
+
+ if (context_item_realloc(c, ci) == JK_FALSE)
+ return JK_FALSE;
+
+ ci->uris[ci->size] = jk_pool_strdup(&c->p, uri);
+
+ if (ci->uris[ci->size] == NULL)
+ return JK_FALSE;
+
+ ci->size++;
+ return JK_TRUE;
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>