mturk 2005/02/16 02:52:59
Modified: jk/native/common jk_status.c
Log:
Whow! We can update the worker runtime status.
Revision Changes Path
1.13 +128 -54 jakarta-tomcat-connectors/jk/native/common/jk_status.c
Index: jk_status.c
===================================================================
RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_status.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- jk_status.c 16 Feb 2005 08:28:51 -0000 1.12
+++ jk_status.c 16 Feb 2005 10:52:59 -0000 1.13
@@ -186,7 +186,7 @@
static const char *status_worker_type(int t)
{
if (t < 0 || t > 6)
- t = 0;
+ t = 0;
return worker_type[t];
}
@@ -234,6 +234,63 @@
va_end(va);
}
+static const char *status_cmd(const char *param, const char *req, char *buf,
size_t len)
+{
+ char ps[32];
+ char *p;
+ size_t l = 0;
+
+ *buf = '\0';
+ if (!req)
+ return NULL;
+ sprintf(ps, "&%s=", param);
+ p = strstr(req, ps);
+ if (p) {
+ p += strlen(ps);
+ while (*p) {
+ if (*p != '&')
+ buf[l++] = *p;
+ else
+ break;
+ if (l + 2 > len)
+ break;
+ p++;
+ }
+ buf[l] = '\0';
+ if (l)
+ return buf;
+ else
+ return NULL;
+ }
+ else
+ return NULL;
+}
+
+static int status_int(const char *param, const char *req, int def)
+{
+ const char *v;
+ char buf[32];
+ int rv = def;
+
+ if ((v = status_cmd(param, req, buf, sizeof(buf) -1))) {
+ rv = atoi(v);
+ }
+ return rv;
+}
+
+static int status_bool(const char *param, const char *req)
+{
+ const char *v;
+ char buf[32];
+ int rv = 0;
+
+ if ((v = status_cmd(param, req, buf, sizeof(buf)))) {
+ if (strcasecmp(v, "on") == 0 ||
+ strcasecmp(v, "true") == 0)
+ rv = 1;
+ }
+ return rv;
+}
/**
* Command line reference:
@@ -242,10 +299,10 @@
* cmd=update update configuration
* cmd=add add new uri map.
* w=worker display detailed configuration for worker
- *
+ *
* Worker parameters:
* r=string redirect route name
- *
+ *
*/
@@ -275,11 +332,11 @@
jk_puts(s, "<hr />\n<h3>Worker Status for ");
if (dworker && strcmp(dworker, sw->we->worker_list[i]) == 0) {
/* Next click will colapse the editor */
- jk_putv(s, "<a href=\"", s->req_uri, "?cmd=show\">", NULL);
+ jk_putv(s, "<a href=\"", s->req_uri, "?cmd=show\">", NULL);
}
else
jk_putv(s, "<a href=\"", s->req_uri, "?cmd=show&w=",
- sw->we->worker_list[i], "\">", NULL);
+ sw->we->worker_list[i], "\">", NULL);
jk_putv(s, sw->we->worker_list[i], "</a></h3>\n", NULL);
if (lb != NULL) {
unsigned int j;
@@ -288,7 +345,7 @@
"<th>Type</th><th>Sticky session</th>"
"<th>Force Sticky session</th>"
"<th>Retries</th>"
- "</tr>\n<tr>");
+ "</tr>\n<tr>");
jk_putv(s, "<td>", status_worker_type(w->type), "</td>", NULL);
jk_putv(s, "<td>", status_val_bool(lb->s->sticky_session),
"</td>", NULL);
@@ -346,21 +403,23 @@
jk_putv(s, "value=\"", wr->s->name, "\">\n", NULL);
jk_puts(s, "<input type=hidden name=\"id\" ");
jk_printf(s, "value=\"%u\">\n</table>\n", selected);
+ jk_puts(s, "<input type=hidden name=\"lb\" ");
+ jk_printf(s, "value=\"%u\">\n</table>\n", i);
jk_puts(s, "<table>\n<tr><td>Load factor:</td><td><input
name=\"wf\" type=text ");
- jk_printf(s, "value=\"%d\"></td><tr>\n", wr->s->lb_factor);
+ jk_printf(s, "value=\"%d\"></td><tr>\n", wr->s->lb_factor);
jk_puts(s, "<tr><td>Route Redirect:</td><td><input
name=\"wr\" type=text ");
- jk_putv(s, "value=\"", wr->s->redirect, NULL);
+ jk_putv(s, "value=\"", wr->s->redirect, NULL);
jk_puts(s, "\"></td></tr>\n");
jk_puts(s, "<tr><td>Cluster Domain:</td><td><input
name=\"wc\" type=text ");
- jk_putv(s, "value=\"", wr->s->domain, NULL);
+ jk_putv(s, "value=\"", wr->s->domain, NULL);
jk_puts(s, "\"></td></tr>\n");
jk_puts(s, "<tr><td>Disabled:</td><td><input name=\"wd\"
type=checkbox");
if (wr->s->is_disabled)
jk_puts(s, " checked");
- jk_puts(s, "></td></tr>\n");
+ jk_puts(s, "></td></tr>\n");
- jk_puts(s, "<tr><td colspan=2> </td></tr>\n");
+ jk_puts(s, "<tr><td colspan=2> </td></tr>\n");
jk_puts(s, "<tr><td colspan=2><input type=submit
value=\"Update Worker\">");
jk_puts(s, "</td></tr>\n</table>\n</form>\n");
@@ -379,9 +438,9 @@
jk_printf(s, "value=\"%u\">\n</table>\n", i);
jk_puts(s, "<table>\n<tr><td>Retries :</td><td><input
name=\"lr\" type=text ");
- jk_printf(s, "value=\"%d\"></td><tr>\n", lb->s->retries);
+ jk_printf(s, "value=\"%d\"></td><tr>\n", lb->s->retries);
jk_puts(s, "<tr><td>Recover time :</td><td><input
name=\"lt\" type=text ");
- jk_printf(s, "value=\"%d\"></td><tr>\n",
lb->s->recover_wait_time);
+ jk_printf(s, "value=\"%d\"></td><tr>\n",
lb->s->recover_wait_time);
jk_puts(s, "<tr><td>Sticky session:</td><td><input
name=\"ls\" type=checkbox");
if (lb->s->sticky_session)
jk_puts(s, " checked");
@@ -390,10 +449,10 @@
if (lb->s->sticky_session_force)
jk_puts(s, " checked");
jk_puts(s, "></td></tr>\n");
-
+
/* TODO: display uri mappings with checkbox for disable */
- jk_puts(s, "<tr><td colspan=2> </td></tr>\n");
+ jk_puts(s, "<tr><td colspan=2> </td></tr>\n");
jk_puts(s, "<tr><td colspan=2><input type=submit
value=\"Update Balancer\">");
jk_puts(s, "</td></tr>\n</table>\n</form>\n");
}
@@ -401,14 +460,14 @@
else {
jk_puts(s, "\n\n<table border=\"0\"><tr>"
"<th>Type</th><th>Host</th><th>Addr</th>"
- "</tr>\n<tr>");
+ "</tr>\n<tr>");
jk_putv(s, "<td>", status_worker_type(w->type), "</td>", NULL);
jk_puts(s, "</tr>\n</table>\n");
jk_printf(s, "<td>%s:%d</td>", aw->host, aw->port);
jk_putv(s, "<td>", jk_dump_hinfo(&aw->worker_inet_addr, buf),
"</td>\n</tr>\n", NULL);
jk_puts(s, "</table>\n");
-
+
}
}
/* Display legend */
@@ -428,6 +487,51 @@
"</table>");
}
+static void update_worker(jk_ws_service_t *s, status_worker_t *sw,
+ const char *dworker, jk_logger_t *l)
+{
+ int i;
+ char buf[1024];
+ const char *b;
+ lb_worker_t *lb;
+ jk_worker_t *w = wc_get_worker_for_name(dworker, l);
+
+ if (w && w->type == JK_LB_WORKER_TYPE) {
+ lb = (lb_worker_t *)w->worker_private;
+ }
+ else {
+ int n = status_int("lb", s->query_string, -1);
+ worker_record_t *wr;
+ ajp_worker_t *a;
+ if (n < 0 || n >= (int)sw->we->num_of_workers)
+ return;
+ w = wc_get_worker_for_name(sw->we->worker_list[n], l);
+ if (!w || w->type != JK_LB_WORKER_TYPE)
+ return;
+ lb = (lb_worker_t *)w->worker_private;
+ i = status_int("id", s->query_string, -1);
+ if (i < 0 || i >= (int)lb->num_of_workers)
+ return;
+
+ wr = &(lb->lb_workers[i]);
+ a = (ajp_worker_t *)wr->w->worker_private;
+
+ if ((b = status_cmd("wr", s->query_string, buf, sizeof(buf))))
+ strncpy(wr->s->redirect, b, JK_SHM_STR_SIZ);
+ else
+ memset(wr->s->redirect, 0, JK_SHM_STR_SIZ);
+ if ((b = status_cmd("wc", s->query_string, buf, sizeof(buf))))
+ strncpy(wr->s->domain, b, JK_SHM_STR_SIZ);
+ else
+ memset(wr->s->domain, 0, JK_SHM_STR_SIZ);
+ wr->s->is_disabled = status_bool("wd", s->query_string);
+ i = status_int("wf", s->query_string, wr->s->lb_factor);
+ if (i > 0)
+ wr->s->lb_factor = i;
+ }
+
+}
+
static int status_cmd_type(const char *req)
{
if (!req)
@@ -442,38 +546,6 @@
return 0;
}
-static const char *status_cmd(const char *param, const char *req, char *buf,
size_t len)
-{
- char ps[32];
- char *p;
- size_t l = 0;
-
- if (!req)
- return NULL;
- sprintf(ps, "&%s=", param);
- p = strstr(req, ps);
- if (p) {
- p += 3;
- while (*p) {
- if (*p != '&')
- buf[l++] = *p;
- else
- break;
- if (l + 2 > len)
- break;
- p++;
- }
- buf[l] = '\0';
- if (l)
- return buf;
- else
- return NULL;
- }
- else
- return NULL;
-}
-
-
static int JK_METHOD service(jk_endpoint_t *e,
jk_ws_service_t *s,
jk_logger_t *l, int *is_recoverable_error)
@@ -490,7 +562,7 @@
s->start_response(s, 200, "OK", headers_names, headers_vals, 3);
s->write(s, JK_STATUS_HEAD, sizeof(JK_STATUS_HEAD) - 1);
-
+
jk_puts(s, "<h1>JK Status Manager for ");
jk_puts(s, s->server_name);
jk_puts(s, "</h1>\n\n");
@@ -503,11 +575,13 @@
cmd = status_cmd_type(s->query_string);
if (cmd > 0 && (status_cmd("w", s->query_string, buf, sizeof(buf))
!= NULL))
worker = strdup(buf);
+ if (cmd == 2 && worker)
+ update_worker(s, p->s_worker, worker, l);
/* Step 2: Display configuration */
- display_workers(s, p->s_worker, worker, l);
+ display_workers(s, p->s_worker, worker, l);
- s->write(s, JK_STATUS_HEND, sizeof(JK_STATUS_HEND) - 1);
+ s->write(s, JK_STATUS_HEND, sizeof(JK_STATUS_HEND) - 1);
if (worker)
free(worker);
JK_TRACE_EXIT(l);
@@ -542,7 +616,7 @@
if (pThis && pThis->worker_private) {
status_worker_t *p = pThis->worker_private;
-
+
JK_TRACE_EXIT(l);
return JK_TRUE;
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]