From: Stefan Eissing Date: Thu, 21 Jan 2016 16:36:33 +0000 (+0000) Subject: scoreboard addition of protocol, new ap_udpte_child_status methods X-Git-Tag: 2.5.0-alpha~2332 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=909aa9a87b7c5e7cf952bae5749d66eb21789325;p=apache scoreboard addition of protocol, new ap_udpte_child_status methods git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1726009 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/include/scoreboard.h b/include/scoreboard.h index 5200c30a5d..1c15a86df4 100644 --- a/include/scoreboard.h +++ b/include/scoreboard.h @@ -115,6 +115,7 @@ struct worker_score { char client[40]; /* Keep 'em small... but large enough to hold an IPv6 address */ char request[64]; /* We just want an idea... */ char vhost[32]; /* What virtual host is being accessed? */ + char protocol[16]; /* What protocol is used on the connection? */ }; typedef struct { @@ -181,6 +182,10 @@ AP_DECLARE(int) ap_update_child_status(ap_sb_handle_t *sbh, int status, request_ AP_DECLARE(int) ap_update_child_status_from_indexes(int child_num, int thread_num, int status, request_rec *r); AP_DECLARE(int) ap_update_child_status_from_conn(ap_sb_handle_t *sbh, int status, conn_rec *c); +AP_DECLARE(int) ap_update_child_status_from_server(ap_sb_handle_t *sbh, int status, + conn_rec *c, server_rec *s); +AP_DECLARE(int) ap_update_child_status_descr(ap_sb_handle_t *sbh, int status, const char *descr); + AP_DECLARE(void) ap_time_process_request(ap_sb_handle_t *sbh, int status); AP_DECLARE(worker_score *) ap_get_scoreboard_worker(ap_sb_handle_t *sbh); diff --git a/modules/generators/mod_status.c b/modules/generators/mod_status.c index 9bd4e8aa04..4ff9df1988 100644 --- a/modules/generators/mod_status.c +++ b/modules/generators/mod_status.c @@ -662,7 +662,7 @@ static int status_handler(request_rec *r) #endif "SSReq" "ConnChildSlot" - "ClientVHost" + "ClientProtocolVHost" "Request\n\n", r); for (i = 0; i < server_limit; ++i) { @@ -776,12 +776,14 @@ static int status_handler(request_rec *r) format_byte_out(r, bytes); ap_rputs(")\n", r); ap_rprintf(r, - " %s {%s} [%s]
\n\n", + " %s {%s} (%s) [%s]
\n\n", ap_escape_html(r->pool, ws_record->client), ap_escape_html(r->pool, ap_escape_logitem(r->pool, ws_record->request)), + ap_escape_html(r->pool, + ws_record->protocol), ap_escape_html(r->pool, ws_record->vhost)); } @@ -860,10 +862,12 @@ static int status_handler(request_rec *r) (float)conn_bytes / KBYTE, (float) my_bytes / MBYTE, (float)bytes / MBYTE); - ap_rprintf(r, "%s%s" + ap_rprintf(r, "%s%s%s" "%s\n\n", ap_escape_html(r->pool, ws_record->client), + ap_escape_html(r->pool, + ws_record->protocol), ap_escape_html(r->pool, ws_record->vhost), ap_escape_html(r->pool, diff --git a/modules/ssl/ssl_engine_kernel.c b/modules/ssl/ssl_engine_kernel.c index 254c65e47e..fab3ab90d1 100644 --- a/modules/ssl/ssl_engine_kernel.c +++ b/modules/ssl/ssl_engine_kernel.c @@ -31,6 +31,7 @@ #include "ssl_private.h" #include "mod_ssl.h" #include "util_md5.h" +#include "scoreboard.h" static void ssl_configure_env(request_rec *r, SSLConnRec *sslconn); #ifdef HAVE_TLSEXT @@ -2218,6 +2219,7 @@ static int ssl_find_vhost(void *servername, conn_rec *c, server_rec *s) sslcon->server = s; sslcon->cipher_suite = sc->server->auth.cipher_suite; + ap_update_child_status_from_server(c->sbh, SERVER_BUSY_READ, c, s); /* * There is one special filter callback, which is set * very early depending on the base_server's log level. diff --git a/server/scoreboard.c b/server/scoreboard.c index d4266c7855..b7f3500502 100644 --- a/server/scoreboard.c +++ b/server/scoreboard.c @@ -32,6 +32,7 @@ #include "http_main.h" #include "http_core.h" #include "http_config.h" +#include "http_protocol.h" #include "ap_mpm.h" #include "scoreboard.h" @@ -457,7 +458,9 @@ static int update_child_status_internal(int child_num, int thread_num, int status, conn_rec *c, - request_rec *r) + server_rec *s, + request_rec *r, + const char *descr) { int old_status; worker_score *ws; @@ -466,18 +469,22 @@ static int update_child_status_internal(int child_num, ws = &ap_scoreboard_image->servers[child_num][thread_num]; old_status = ws->status; - ws->status = status; - - ps = &ap_scoreboard_image->parent[child_num]; - - if (status == SERVER_READY - && old_status == SERVER_STARTING) { - ws->thread_num = child_num * thread_limit + thread_num; - ap_mpm_query(AP_MPMQ_GENERATION, &mpm_generation); - ps->generation = mpm_generation; + if (status >= 0) { + ws->status = status; + + ps = &ap_scoreboard_image->parent[child_num]; + + if (status == SERVER_READY + && old_status == SERVER_STARTING) { + ws->thread_num = child_num * thread_limit + thread_num; + ap_mpm_query(AP_MPMQ_GENERATION, &mpm_generation); + ps->generation = mpm_generation; + } } if (ap_extended_status) { + const char *val; + if (status == SERVER_READY || status == SERVER_DEAD) { /* * Reset individual counters @@ -490,27 +497,42 @@ static int update_child_status_internal(int child_num, ws->conn_bytes = 0; ws->last_used = apr_time_now(); } - if (r) { - const char *client = ap_get_remote_host(c, r->per_dir_config, - REMOTE_NOLOOKUP, NULL); - if (!client || !strcmp(client, c->client_ip)) { - apr_cpystrn(ws->client, r->useragent_ip, sizeof(ws->client)); + if (status == SERVER_READY) { + ws->client[0]='\0'; + ws->vhost[0]='\0'; + ws->request[0]='\0'; + ws->protocol[0]='\0'; + } + else { + if (descr) { + apr_cpystrn(ws->request, descr, sizeof(ws->request)); } - else { - apr_cpystrn(ws->client, client, sizeof(ws->client)); + else if (r) { + copy_request(ws->request, sizeof(ws->request), r); } - copy_request(ws->request, sizeof(ws->request), r); - if (r->server) { - apr_snprintf(ws->vhost, sizeof(ws->vhost), "%s:%d", - r->server->server_hostname, - r->connection->local_addr->port); + if (r || c) { + val = ap_get_remote_host(c, r? r->per_dir_config : NULL, + REMOTE_NOLOOKUP, NULL); + if (r && (!val || !strcmp(val, c->client_ip))) { + apr_cpystrn(ws->client, r->useragent_ip, sizeof(ws->client)); + } + else { + apr_cpystrn(ws->client, val, sizeof(ws->client)); + } + } + if (s) { + if (c) { + apr_snprintf(ws->vhost, sizeof(ws->vhost), "%s:%d", + s->server_hostname, c->local_addr->port); + } + else { + apr_cpystrn(ws->vhost, s->server_hostname, sizeof(ws->vhost)); + } + } + if (c) { + val = ap_get_protocol(c); + apr_cpystrn(ws->protocol, val, sizeof(ws->protocol)); } - } - else if (c) { - apr_cpystrn(ws->client, ap_get_remote_host(c, NULL, - REMOTE_NOLOOKUP, NULL), sizeof(ws->client)); - ws->request[0]='\0'; - ws->vhost[0]='\0'; } } @@ -528,7 +550,8 @@ AP_DECLARE(int) ap_update_child_status_from_indexes(int child_num, return update_child_status_internal(child_num, thread_num, status, r ? r->connection : NULL, - r); + r ? r->server : NULL, + r, NULL); } AP_DECLARE(int) ap_update_child_status(ap_sb_handle_t *sbh, int status, @@ -540,17 +563,37 @@ AP_DECLARE(int) ap_update_child_status(ap_sb_handle_t *sbh, int status, return update_child_status_internal(sbh->child_num, sbh->thread_num, status, r ? r->connection : NULL, - r); + r ? r->server : NULL, + r, NULL); } AP_DECLARE(int) ap_update_child_status_from_conn(ap_sb_handle_t *sbh, int status, - conn_rec *c) + conn_rec *c) +{ + if (!sbh || (sbh->child_num < 0)) + return -1; + + return update_child_status_internal(sbh->child_num, sbh->thread_num, + status, c, NULL, NULL, NULL); +} + +AP_DECLARE(int) ap_update_child_status_from_server(ap_sb_handle_t *sbh, int status, + conn_rec *c, server_rec *s) +{ + if (!sbh || (sbh->child_num < 0)) + return -1; + + return update_child_status_internal(sbh->child_num, sbh->thread_num, + status, c, s, NULL, NULL); +} + +AP_DECLARE(int) ap_update_child_status_descr(ap_sb_handle_t *sbh, int status, const char *descr) { if (!sbh || (sbh->child_num < 0)) return -1; return update_child_status_internal(sbh->child_num, sbh->thread_num, - status, c, NULL); + status, NULL, NULL, NULL, descr); } AP_DECLARE(void) ap_time_process_request(ap_sb_handle_t *sbh, int status) @@ -605,6 +648,7 @@ AP_DECLARE(void) ap_copy_scoreboard_worker(worker_score *dest, dest->client[sizeof(dest->client) - 1] = '\0'; dest->request[sizeof(dest->request) - 1] = '\0'; dest->vhost[sizeof(dest->vhost) - 1] = '\0'; + dest->protocol[sizeof(dest->protocol) - 1] = '\0'; } AP_DECLARE(process_score *) ap_get_scoreboard_process(int x)