summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2020-07-31 03:43:19 -0400
committerGlenn Strauss <gstrauss@gluelogic.com>2020-10-03 09:05:38 -0400
commitafc2025d8edba323453033dadf10469011ddcf8a (patch)
tree30c667c8b97a851386464c47712eda81e0313f4e
parent8eea3bd014efefd0258f43e7b18e12574ed1bb08 (diff)
downloadlighttpd-git-afc2025d8edba323453033dadf10469011ddcf8a.tar.gz
[core] reset connection counters per connection
reset connection counters per connection, not per request adjust mod_accesslog and mod_rrdtool usage continue to count mod_rrdtool per request rather than per connection so that data is updated after each request, rather than aggregated to the end of a potentially long-lived connection with many keep-alives.
-rw-r--r--src/connections.c14
-rw-r--r--src/mod_accesslog.c21
-rw-r--r--src/mod_rrdtool.c4
-rw-r--r--src/request.h2
4 files changed, 30 insertions, 11 deletions
diff --git a/src/connections.c b/src/connections.c
index 5f8e2b2d..634808c3 100644
--- a/src/connections.c
+++ b/src/connections.c
@@ -228,6 +228,8 @@ static void connection_fdwaitqueue_append(connection *con) {
connection_list_append(&con->srv->fdwaitqueue, con);
}
+static void request_reset (request_st * const r);
+
static void connection_handle_response_end_state(request_st * const r, connection * const con) {
/* call request_done hook if http_status set (e.g. to log request) */
/* (even if error, connection dropped, as long as http_status is set) */
@@ -242,7 +244,11 @@ static void connection_handle_response_end_state(request_st * const r, connectio
}
if (r->keep_alive) {
- connection_reset(con);
+ request_reset(r);
+ con->is_readable = 1; /* potentially trigger optimistic read */
+ /*(accounting used by mod_accesslog for HTTP/1.0 and HTTP/1.1)*/
+ r->bytes_read_ckpt = con->bytes_read;
+ r->bytes_written_ckpt = con->bytes_written;
#if 0
r->start_ts = con->read_idle_ts = log_epoch_secs;
#endif
@@ -764,6 +770,8 @@ request_reset (request_st * const r) {
static void connection_reset(connection *con) {
request_st * const r = &con->request;
request_reset(r);
+ r->bytes_read_ckpt = 0;
+ r->bytes_written_ckpt = 0;
con->is_readable = 1;
con->bytes_written = 0;
@@ -875,7 +883,7 @@ static int connection_handle_read_state(connection * const con) {
int pipelined_request_start = 0;
unsigned short hoff[8192]; /* max num header lines + 3; 16k on stack */
- if (con->request_count > 1 && 0 == con->bytes_read) {
+ if (con->request_count > 1 && con->bytes_read == r->bytes_read_ckpt) {
keepalive_request_start = 1;
if (NULL != c) { /* !chunkqueue_is_empty(cq)) */
pipelined_request_start = 1;
@@ -931,7 +939,7 @@ static int connection_handle_read_state(connection * const con) {
} while ((c = connection_read_header_more(con, cq, c, clen)));
if (keepalive_request_start) {
- if (0 != con->bytes_read) {
+ if (con->bytes_read > r->bytes_read_ckpt) {
/* update r->start_ts timestamp when first byte of
* next request is received on a keep-alive connection */
r->start_ts = log_epoch_secs;
diff --git a/src/mod_accesslog.c b/src/mod_accesslog.c
index 5986451a..05fd3bc0 100644
--- a/src/mod_accesslog.c
+++ b/src/mod_accesslog.c
@@ -981,13 +981,16 @@ static int log_access_record (const request_st * const r, buffer * const b, form
break;
case FORMAT_BYTES_OUT_NO_HEADER:
- if (con->bytes_written > 0) {
- off_t bytes = con->bytes_written - (off_t)r->resp_header_len;
+ {
+ off_t bytes = con->bytes_written - r->bytes_written_ckpt;
+ if (bytes > 0) {
+ bytes -= (off_t)r->resp_header_len;
buffer_append_int(b, bytes > 0 ? bytes : 0);
} else {
buffer_append_string_len(b, CONST_STR_LEN("-"));
}
break;
+ }
case FORMAT_HEADER:
if (NULL != (vb = http_header_request_get(r, HTTP_HEADER_UNSPECIFIED, CONST_BUF_LEN(&f->string)))) {
accesslog_append_escaped(b, vb);
@@ -1018,19 +1021,25 @@ static int log_access_record (const request_st * const r, buffer * const b, form
}
break;
case FORMAT_BYTES_OUT:
- if (con->bytes_written > 0) {
- buffer_append_int(b, con->bytes_written);
+ {
+ off_t bytes = con->bytes_written - r->bytes_written_ckpt;
+ if (bytes > 0) {
+ buffer_append_int(b, bytes);
} else {
buffer_append_string_len(b, CONST_STR_LEN("-"));
}
break;
+ }
case FORMAT_BYTES_IN:
- if (con->bytes_read > 0) {
- buffer_append_int(b, con->bytes_read);
+ {
+ off_t bytes = con->bytes_read - r->bytes_read_ckpt;
+ if (bytes > 0) {
+ buffer_append_int(b, bytes);
} else {
buffer_append_string_len(b, CONST_STR_LEN("-"));
}
break;
+ }
case FORMAT_SERVER_NAME:
if (!buffer_string_is_empty(r->server_name)) {
buffer_append_string_buffer(b, r->server_name);
diff --git a/src/mod_rrdtool.c b/src/mod_rrdtool.c
index b62edd5c..dfdb0e97 100644
--- a/src/mod_rrdtool.c
+++ b/src/mod_rrdtool.c
@@ -424,8 +424,8 @@ REQUESTDONE_FUNC(mod_rrd_account) {
rrd_config * const rrd = p->conf.rrd;
if (NULL == rrd) return HANDLER_GO_ON;
++rrd->requests;
- rrd->bytes_written += r->con->bytes_written;
- rrd->bytes_read += r->con->bytes_read;
+ rrd->bytes_written += (r->con->bytes_written - r->bytes_written_ckpt);
+ rrd->bytes_read += (r->con->bytes_read - r->bytes_read_ckpt);
return HANDLER_GO_ON;
}
diff --git a/src/request.h b/src/request.h
index ca8a3053..adaf7570 100644
--- a/src/request.h
+++ b/src/request.h
@@ -178,6 +178,8 @@ struct request_st {
buffer *tmp_buf; /* shared; same as srv->tmp_buf */
response_dechunk *gw_dechunk;
+ off_t bytes_written_ckpt; /* used by mod_accesslog */
+ off_t bytes_read_ckpt; /* used by mod_accesslog */
struct timespec start_hp;
time_t start_ts;