]> err.no Git - varnish/commitdiff
Introduce three new params, to limit overflow queue length
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Mon, 18 Sep 2006 18:49:46 +0000 (18:49 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Mon, 18 Sep 2006 18:49:46 +0000 (18:49 +0000)
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
varnish-cache/bin/varnishd/cache_pool.c
varnish-cache/bin/varnishd/heritage.h
varnish-cache/bin/varnishd/mgt_param.c
varnish-cache/include/stat_field.h

index 6cd83d1b9d5f2514fcf29e9666e19a5e16d88aaf..da869f7db1cd74187a1b935b34134b97ce54fc58 100644 (file)
@@ -12,6 +12,7 @@
 #include <string.h>
 #include <ctype.h>
 
+#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);
 }
index 058161df7c20482fe15708f1e51f89ffec5651ef..6479b4bee5f6a107b846d9c9d22c7f6e45bce1e9 100644 (file)
@@ -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. 
index c2dd274d66a145d28cc4ebad527b3c4a535580b5..255153273274d38d94d2337e9ee1d4171cb57b37 100644 (file)
@@ -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;
index c7f20b900367f2334922172b8ea647ed6cb8f9be..fec6816a531c4f3050211ebcc7e6189716a0777e 100644 (file)
@@ -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, &params->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, &params->backend_http11, arg);
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
+tweak_client_http11(struct cli *cli, struct parspec *par, const char *arg)
+{
+       (void)par;
+       tweak_generic_bool(cli, &params->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 }
 };
 
index 3bcc8a023c9d0235e324c79de9939f70c2418c06..c6add2c17dd830691680d5ba7b225645b5fbbd99 100644 (file)
@@ -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")