From 649bdd29e55e51c9d3192c4cfe316bac6cb357e6 Mon Sep 17 00:00:00 2001 From: phk Date: Mon, 18 Sep 2006 18:49:46 +0000 Subject: [PATCH] Introduce three new params, to limit overflow queue length and to force HTTP/1.1 protocol version. git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1078 d4fa192b-c00b-0410-8231-f00ffab90ce4 --- varnish-cache/bin/varnishd/cache_http.c | 11 ++++-- varnish-cache/bin/varnishd/cache_pool.c | 8 +++++ varnish-cache/bin/varnishd/heritage.h | 6 ++++ varnish-cache/bin/varnishd/mgt_param.c | 45 +++++++++++++++++++++++++ varnish-cache/include/stat_field.h | 1 + 5 files changed, 69 insertions(+), 2 deletions(-) diff --git a/varnish-cache/bin/varnishd/cache_http.c b/varnish-cache/bin/varnishd/cache_http.c index 6cd83d1b..da869f7d 100644 --- a/varnish-cache/bin/varnishd/cache_http.c +++ b/varnish-cache/bin/varnishd/cache_http.c @@ -12,6 +12,7 @@ #include #include +#include "heritage.h" #include "shmlog.h" #include "cache.h" @@ -664,7 +665,10 @@ http_CopyReq(struct worker *w, int fd, struct http *to, struct http *fm) CHECK_OBJ_NOTNULL(to, HTTP_MAGIC); http_copyh(w, fd, to, fm, HTTP_HDR_REQ, HTTP_T_Request); http_copyh(w, fd, to, fm, HTTP_HDR_URL, HTTP_T_URL); - http_copyh(w, fd, to, fm, HTTP_HDR_PROTO, HTTP_T_Protocol); + if (params->backend_http11) + http_seth(w, fd, to, HTTP_HDR_PROTO, HTTP_T_Protocol, "HTTP/1.1"); + else + http_copyh(w, fd, to, fm, HTTP_HDR_PROTO, HTTP_T_Protocol); } @@ -674,7 +678,10 @@ http_CopyResp(struct worker *w, int fd, struct http *to, struct http *fm) CHECK_OBJ_NOTNULL(fm, HTTP_MAGIC); CHECK_OBJ_NOTNULL(to, HTTP_MAGIC); - http_copyh(w, fd, to, fm, HTTP_HDR_PROTO, HTTP_T_Protocol); + if (params->client_http11) + http_seth(w, fd, to, HTTP_HDR_PROTO, HTTP_T_Protocol, "HTTP/1.1"); + else + http_copyh(w, fd, to, fm, HTTP_HDR_PROTO, HTTP_T_Protocol); http_copyh(w, fd, to, fm, HTTP_HDR_STATUS, HTTP_T_Status); http_copyh(w, fd, to, fm, HTTP_HDR_RESPONSE, HTTP_T_Response); } diff --git a/varnish-cache/bin/varnishd/cache_pool.c b/varnish-cache/bin/varnishd/cache_pool.c index 058161df..6479b4be 100644 --- a/varnish-cache/bin/varnishd/cache_pool.c +++ b/varnish-cache/bin/varnishd/cache_pool.c @@ -268,6 +268,14 @@ WRK_QueueSession(struct sess *sp) UNLOCK(&qp->mtx); LOCK(&tmtx); + if ((VSL_stats->n_wrk_overflow > + (params->wthread_max * params->overflow_max) / 100)) { + VSL_stats->n_wrk_drop++; + UNLOCK(&tmtx); + vca_close_session(sp, "dropped"); + vca_return_session(sp); + return; + } /* * XXX: If there are too many requests in the overflow queue * XXX: we should kill the request right here. diff --git a/varnish-cache/bin/varnishd/heritage.h b/varnish-cache/bin/varnishd/heritage.h index c2dd274d..25515327 100644 --- a/varnish-cache/bin/varnishd/heritage.h +++ b/varnish-cache/bin/varnishd/heritage.h @@ -38,6 +38,8 @@ struct params { unsigned wthread_timeout; unsigned wthread_pools; + unsigned overflow_max; + /* Memory allocation hints */ unsigned mem_workspace; @@ -69,6 +71,10 @@ struct params { /* Srcaddr hash */ unsigned srcaddr_hash; unsigned srcaddr_ttl; + + /* HTTP proto behaviour */ + unsigned backend_http11; + unsigned client_http11; }; extern struct params *params; diff --git a/varnish-cache/bin/varnishd/mgt_param.c b/varnish-cache/bin/varnishd/mgt_param.c index c7f20b90..fec6816a 100644 --- a/varnish-cache/bin/varnishd/mgt_param.c +++ b/varnish-cache/bin/varnishd/mgt_param.c @@ -160,6 +160,16 @@ tweak_thread_pool_timeout(struct cli *cli, struct parspec *par, const char *arg) /*--------------------------------------------------------------------*/ +static void +tweak_overflow_max(struct cli *cli, struct parspec *par, const char *arg) +{ + + (void)par; + tweak_generic_uint(cli, ¶ms->overflow_max, arg, 0, UINT_MAX); +} + +/*--------------------------------------------------------------------*/ + static void tweak_http_workspace(struct cli *cli, struct parspec *par, const char *arg) { @@ -299,6 +309,24 @@ tweak_srcaddr_ttl(struct cli *cli, struct parspec *par, const char *arg) /*--------------------------------------------------------------------*/ +static void +tweak_backend_http11(struct cli *cli, struct parspec *par, const char *arg) +{ + (void)par; + tweak_generic_bool(cli, ¶ms->backend_http11, arg); +} + +/*--------------------------------------------------------------------*/ + +static void +tweak_client_http11(struct cli *cli, struct parspec *par, const char *arg) +{ + (void)par; + tweak_generic_bool(cli, ¶ms->client_http11, arg); +} + +/*--------------------------------------------------------------------*/ + /* * Make sure to end all lines with either a space or newline of the * formatting will go haywire. @@ -355,6 +383,11 @@ static struct parspec parspec[] = { EXPERIMENTAL DELAYED_EFFECT, "120", "seconds" }, + { "overflow_max", tweak_overflow_max, + "Limit on overflow queue length in percent of " + "thread_pool_max parameter.\n" + EXPERIMENTAL, + "100", "%" }, { "http_workspace", tweak_http_workspace, "Bytes of HTTP protocol workspace allocated. " "This space must be big enough for the entire HTTP protocol " @@ -439,6 +472,18 @@ static struct parspec parspec[] = { "Zero will disable srcaddr accounting entirely.\n" EXPERIMENTAL, "30", "seconds" }, + { "backend_http11", tweak_backend_http11, + "Force all backend requests to be HTTP/1.1.\n" + "By default we copy the protocol version from the " + "incoming client request." + EXPERIMENTAL, + "off", "bool" }, + { "client_http11", tweak_client_http11, + "Force all client responses to be HTTP/1.1.\n" + "By default we copy the protocol version from the " + "backend response." + EXPERIMENTAL, + "off", "bool" }, { NULL, NULL, NULL } }; diff --git a/varnish-cache/include/stat_field.h b/varnish-cache/include/stat_field.h index 3bcc8a02..c6add2c1 100644 --- a/varnish-cache/include/stat_field.h +++ b/varnish-cache/include/stat_field.h @@ -27,6 +27,7 @@ MAC_STAT(n_wrk_failed, uint64_t, "u", "N worker threads not created") MAC_STAT(n_wrk_max, uint64_t, "u", "N worker threads limited") MAC_STAT(n_wrk_queue, uint64_t, "u", "N queued work requests") MAC_STAT(n_wrk_overflow, uint64_t, "u", "N overflowed work requests") +MAC_STAT(n_wrk_drop, uint64_t, "u", "N dropped work requests") MAC_STAT(n_expired, uint64_t, "u", "N expired objects") MAC_STAT(n_deathrow, uint64_t, "u", "N objects on deathrow") -- 2.39.5