[experimental-ims] 6810e7c First cleanup sweep over new per-pool acceptor code:
Geoff Simmons
geoff at varnish-cache.org
Mon Jan 9 21:51:56 CET 2012
commit 6810e7c339f46aadd5b1e6676f99663cc4b2ccd5
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Sun Sep 18 10:46:08 2011 +0000
First cleanup sweep over new per-pool acceptor code:
Store the data from accept(2) on the worker->ws, we only need it for
a brief moment until the worker configures a session with it.
If we fail to allocate a session after accepting the connection,
we silently close the connection again: Presumably it is a DoS
situation. (false positive: Extremely popular busy objects)
Make three clearly defined counters for sessions: Accepted, Dropped
and failed (accept(2) failure).
Lots of spit&polish.
diff --git a/bin/varnishd/cache.h b/bin/varnishd/cache.h
index 2a7578d..d5e4311 100644
--- a/bin/varnishd/cache.h
+++ b/bin/varnishd/cache.h
@@ -289,6 +289,20 @@ struct stream_ctx {
};
/*--------------------------------------------------------------------*/
+
+struct wrk_accept {
+ unsigned magic;
+#define WRK_ACCEPT_MAGIC 0x8c4b4d59
+
+ /* Accept stuff */
+ struct sockaddr_storage acceptaddr;
+ socklen_t acceptaddrlen;
+ int acceptsock;
+ struct listen_sock *acceptlsock;
+};
+
+/*--------------------------------------------------------------------*/
+
struct worker {
unsigned magic;
#define WORKER_MAGIC 0x6391adcf
@@ -303,12 +317,6 @@ struct worker {
/* Pool stuff */
double lastused;
- /* Accept stuff */
- struct sockaddr_storage acceptaddr;
- socklen_t acceptaddrlen;
- int acceptsock;
- struct listen_sock *acceptlsock;
-
struct wrw wrw;
pthread_cond_t cond;
@@ -642,8 +650,9 @@ struct vbc {
void VCA_Prep(struct sess *sp);
void VCA_Init(void);
void VCA_Shutdown(void);
-int VCA_Accept(int sock, socklen_t *slp, struct sockaddr_storage *sap);
+int VCA_Accept(struct listen_sock *ls, struct wrk_accept *wa);
void VCA_SetupSess(struct worker *w);
+void VCA_FailSess(struct worker *w);
/* cache_backend.c */
void VBE_UseHealth(const struct director *vdi);
diff --git a/bin/varnishd/cache_acceptor.c b/bin/varnishd/cache_acceptor.c
index 50cc824..ba4e84a 100644
--- a/bin/varnishd/cache_acceptor.c
+++ b/bin/varnishd/cache_acceptor.c
@@ -167,7 +167,7 @@ vca_pace_check(void)
{
double p;
- if (vca_pace == 0.0)
+ if (vca_pace == 0.0)
return;
Lck_Lock(&pace_mtx);
p = vca_pace;
@@ -191,7 +191,7 @@ static void
vca_pace_good(void)
{
- if (vca_pace == 0.0)
+ if (vca_pace == 0.0)
return;
Lck_Lock(&pace_mtx);
vca_pace *= params->acceptor_sleep_decay;
@@ -207,69 +207,89 @@ vca_pace_good(void)
static int hack_ready;
int
-VCA_Accept(int sock, socklen_t *slp, struct sockaddr_storage *sap)
+VCA_Accept(struct listen_sock *ls, struct wrk_accept *wa)
{
int i;
- assert(sock >= 0);
+ CHECK_OBJ_NOTNULL(ls, LISTEN_SOCK_MAGIC);
+ assert(ls->sock >= 0);
vca_pace_check();
while(!hack_ready)
(void)usleep(100*1000);
- *slp = sizeof *sap;
- i = accept(sock, (void*)sap, slp);
+ wa->acceptaddrlen = sizeof wa->acceptaddr;
+ i = accept(ls->sock, (void*)&wa->acceptaddr, &wa->acceptaddrlen);
if (i < 0) {
- VSC_C_main->accept_fail++;
switch (errno) {
- case EAGAIN:
case ECONNABORTED:
break;
case EMFILE:
- VSL(SLT_Debug, sock, "Too many open files");
+ VSL(SLT_Debug, ls->sock, "Too many open files");
vca_pace_bad();
break;
default:
- VSL(SLT_Debug, sock, "Accept failed: %s",
+ VSL(SLT_Debug, ls->sock, "Accept failed: %s",
strerror(errno));
vca_pace_bad();
break;
}
}
+ wa->acceptlsock = ls;
+ wa->acceptsock = i;
return (i);
}
+/*--------------------------------------------------------------------
+ * Fail a session
+ *
+ * This happens if we accept the socket, but cannot get a session
+ * structure.
+ *
+ * We consider this a DoS situation (false positive: Extremely popular
+ * busy objects) and silently close the connection with minimum effort
+ * and fuzz, rather than try to send an intelligent message back.
+ */
+
+void
+VCA_FailSess(struct worker *w)
+{
+ struct wrk_accept *wa;
+
+ CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
+ CAST_OBJ_NOTNULL(wa, (void*)w->ws->f, WRK_ACCEPT_MAGIC);
+ AZ(w->sp);
+ AZ(close(wa->acceptsock));
+ w->stats.sess_drop++;
+ vca_pace_bad();
+}
+
/*--------------------------------------------------------------------*/
void
VCA_SetupSess(struct worker *w)
{
struct sess *sp;
+ struct wrk_accept *wa;
+ CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
+ CAST_OBJ_NOTNULL(wa, (void*)w->ws->f, WRK_ACCEPT_MAGIC);
sp = w->sp;
- if (sp == NULL) {
- AZ(close(w->acceptsock));
- w->acceptsock = -1;
- VSC_C_main->client_drop++;
- /* XXX: 50x Reply ? */
- vca_pace_bad();
- INCOMPL();
- }
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
- sp->fd = w->acceptsock;
- sp->id = w->acceptsock;
- w->acceptsock = -1;
+ sp->fd = wa->acceptsock;
+ sp->id = wa->acceptsock;
+ wa->acceptsock = -1;
sp->t_open = TIM_real();
sp->t_end = sp->t_end;
- sp->mylsock = w->acceptlsock;
- assert(w->acceptaddrlen <= sp->sockaddrlen);
- memcpy(&sp->sockaddr, &w->acceptaddr, w->acceptaddrlen);
- sp->sockaddrlen = w->acceptaddrlen;
+ sp->mylsock = wa->acceptlsock;
+ CHECK_OBJ_NOTNULL(sp->mylsock, LISTEN_SOCK_MAGIC);
+ assert(wa->acceptaddrlen <= sp->sockaddrlen);
+ memcpy(&sp->sockaddr, &wa->acceptaddr, wa->acceptaddrlen);
+ sp->sockaddrlen = wa->acceptaddrlen;
sp->step = STP_FIRST;
vca_pace_good();
- w->sp = sp;
- w->stats.client_conn++;
+ w->stats.sess_conn++;
}
/*--------------------------------------------------------------------*/
diff --git a/bin/varnishd/cache_center.c b/bin/varnishd/cache_center.c
index db51927..122bccf 100644
--- a/bin/varnishd/cache_center.c
+++ b/bin/varnishd/cache_center.c
@@ -1115,7 +1115,7 @@ cnt_lookup(struct sess *sp)
WS_ReleaseP(sp->ws, (void*)sp->vary_l);
} else {
AZ(oc->busyobj->vary);
- WS_Release(sp->ws, 0);
+ WS_Release(sp->ws, 0);
}
sp->vary_b = NULL;
sp->vary_l = NULL;
diff --git a/bin/varnishd/cache_pool.c b/bin/varnishd/cache_pool.c
index 1bfc6b4..64aad05 100644
--- a/bin/varnishd/cache_pool.c
+++ b/bin/varnishd/cache_pool.c
@@ -67,7 +67,6 @@ struct poolsock {
#define POOLSOCK_MAGIC 0x1b0a2d38
VTAILQ_ENTRY(poolsock) list;
struct listen_sock *lsock;
- int sock;
};
/* Number of work requests queued in excess of worker threads available */
@@ -95,121 +94,163 @@ static unsigned nthr_max;
static pthread_cond_t herder_cond;
static struct lock herder_mtx;
-/*--------------------------------------------------------------------*/
+/*--------------------------------------------------------------------
+ * Nobody is accepting on this socket, so we do.
+ *
+ * As long as we can stick the accepted connection to another thread
+ * we do so, otherwise we return and handle it ourselves.
+ *
+ * Notice calling convention: Called locked and returns locked, but
+ * works lock in the meantime.
+ *
+ * We store data about the accept in reserved workspace, it is only used
+ * for a brief moment and it takes up around 144 bytes.
+ */
static void
pool_accept(struct pool *pp, struct worker *w, const struct poolsock *ps)
{
struct worker *w2;
+ struct wrk_accept *wa, *wa2;
CHECK_OBJ_NOTNULL(pp, POOL_MAGIC);
CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(ps, POOLSOCK_MAGIC);
- assert(ps->sock >= 0);
+ CHECK_OBJ_NOTNULL(ps->lsock, LISTEN_SOCK_MAGIC);
Lck_AssertHeld(&pp->mtx);
Lck_Unlock(&pp->mtx);
+ assert(sizeof *wa == WS_Reserve(w->ws, sizeof *wa));
+ wa = (void*)w->ws->f;
while (1) {
- w->acceptsock =
- VCA_Accept(ps->sock, &w->acceptaddrlen, &w->acceptaddr);
- if (w->acceptsock == -1)
+ memset(wa, 0, sizeof *wa);
+ wa->magic = WRK_ACCEPT_MAGIC;
+
+ if (VCA_Accept(ps->lsock, wa) < 0) {
+ w->stats.sess_fail++;
+ /* We're going to pace in vca anyway... */
+ (void)WRK_TrySumStat(w);
continue;
- w->acceptlsock = ps->lsock;
+ }
+
Lck_Lock(&pp->mtx);
if (VTAILQ_EMPTY(&pp->idle))
return;
w2 = VTAILQ_FIRST(&pp->idle);
VTAILQ_REMOVE(&pp->idle, w2, list);
Lck_Unlock(&pp->mtx);
- w2->acceptaddr = w->acceptaddr;
- w2->acceptaddrlen = w->acceptaddrlen;
- w2->acceptsock = w->acceptsock;
- w2->acceptlsock = w->acceptlsock;
+ assert(sizeof *wa2 == WS_Reserve(w2->ws, sizeof *wa2));
+ wa2 = (void*)w2->ws->f;
+ memcpy(wa2, wa, sizeof *wa);
AZ(pthread_cond_signal(&w2->cond));
}
}
-/*--------------------------------------------------------------------*/
+/*--------------------------------------------------------------------
+ * This is the work function for worker threads in the pool.
+ */
void
Pool_Work_Thread(void *priv, struct worker *w)
{
- struct pool *qp;
+ struct pool *pp;
int stats_clean;
struct poolsock *ps;
- CAST_OBJ_NOTNULL(qp, priv, POOL_MAGIC);
- w->pool = qp;
- Lck_Lock(&qp->mtx);
- qp->nthr++;
+ CAST_OBJ_NOTNULL(pp, priv, POOL_MAGIC);
+ w->pool = pp;
+ Lck_Lock(&pp->mtx);
+ pp->nthr++;
stats_clean = 1;
while (1) {
- Lck_AssertHeld(&qp->mtx);
+ Lck_AssertHeld(&pp->mtx);
+ CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(w->bereq, HTTP_MAGIC);
CHECK_OBJ_NOTNULL(w->beresp, HTTP_MAGIC);
CHECK_OBJ_NOTNULL(w->resp, HTTP_MAGIC);
- CHECK_OBJ_NOTNULL(w, WORKER_MAGIC);
- /* Process queued requests, if any */
- w->sp = VTAILQ_FIRST(&qp->queue);
+ WS_Reset(w->ws, NULL);
+
+ w->sp = VTAILQ_FIRST(&pp->queue);
if (w->sp != NULL) {
- VTAILQ_REMOVE(&qp->queue, w->sp, poollist);
- qp->lqueue--;
- } else if (VTAILQ_EMPTY(&qp->socks)) {
+ /* Process queued requests, if any */
+ assert(pp->lqueue > 0);
+ VTAILQ_REMOVE(&pp->queue, w->sp, poollist);
+ pp->lqueue--;
+ } else if (!VTAILQ_EMPTY(&pp->socks)) {
+ /* Accept on a socket */
+ ps = VTAILQ_FIRST(&pp->socks);
+ VTAILQ_REMOVE(&pp->socks, ps, list);
+ pool_accept(pp, w, ps);
+ Lck_AssertHeld(&pp->mtx);
+ VTAILQ_INSERT_TAIL(&pp->socks, ps, list);
+ } else if (VTAILQ_EMPTY(&pp->socks)) {
+ /* Nothing to do: To sleep, perchance to dream ... */
if (isnan(w->lastused))
w->lastused = TIM_real();
- VTAILQ_INSERT_HEAD(&qp->idle, w, list);
+ VTAILQ_INSERT_HEAD(&pp->idle, w, list);
if (!stats_clean)
WRK_SumStat(w);
- Lck_CondWait(&w->cond, &qp->mtx);
- } else {
- ps = VTAILQ_FIRST(&qp->socks);
- VTAILQ_REMOVE(&qp->socks, ps, list);
- pool_accept(qp, w, ps);
- Lck_AssertHeld(&qp->mtx);
- VTAILQ_INSERT_TAIL(&qp->socks, ps, list);
+ Lck_CondWait(&w->cond, &pp->mtx);
}
- if (w->sp == NULL && w->acceptsock == -1)
+
+ /*
+ * If we got neither session or accepted a socket, we were
+ * woken up to die to cull the herd.
+ */
+ if (w->sp == NULL && w->ws->r == NULL)
break;
- Lck_Unlock(&qp->mtx);
+
+ Lck_Unlock(&pp->mtx);
+
if (w->sp == NULL) {
- w->sp = SES_New(w, qp->sesspool);
- VCA_SetupSess(w);
+ /* Turn accepted socket into a session */
+ assert(w->ws->r != NULL);
+ w->sp = SES_New(w, pp->sesspool);
+ if (w->sp == NULL)
+ VCA_FailSess(w);
+ else
+ VCA_SetupSess(w);
+ WS_Release(w->ws, 0);
}
- AN(w->sp);
- assert(w->acceptsock == -1);
- stats_clean = 0;
- w->lastused = NAN;
- WS_Reset(w->ws, NULL);
- w->storage_hint = NULL;
-
- AZ(w->sp->wrk);
- THR_SetSession(w->sp);
- w->sp->wrk = w;
- CHECK_OBJ_ORNULL(w->nobjhead, OBJHEAD_MAGIC);
- CNT_Session(w->sp);
- CHECK_OBJ_ORNULL(w->nobjhead, OBJHEAD_MAGIC);
- THR_SetSession(NULL);
-
- WS_Assert(w->ws);
- AZ(w->bereq->ws);
- AZ(w->beresp->ws);
- AZ(w->resp->ws);
- AZ(w->wrw.wfd);
- AZ(w->storage_hint);
- assert(w->wlp == w->wlb);
- w->sp = NULL;
- if (params->diag_bitmap & 0x00040000) {
- if (w->vcl != NULL)
- VCL_Rel(&w->vcl);
+ assert(w->ws->r == NULL);
+
+ if (w->sp != NULL) {
+ CHECK_OBJ_NOTNULL(w->sp, SESS_MAGIC);
+
+ stats_clean = 0;
+ w->lastused = NAN;
+ w->storage_hint = NULL;
+
+ AZ(w->sp->wrk);
+ THR_SetSession(w->sp);
+ w->sp->wrk = w;
+ CHECK_OBJ_ORNULL(w->nobjhead, OBJHEAD_MAGIC);
+ CNT_Session(w->sp);
+ CHECK_OBJ_ORNULL(w->nobjhead, OBJHEAD_MAGIC);
+ THR_SetSession(NULL);
+ w->sp = NULL;
+
+ WS_Assert(w->ws);
+ AZ(w->bereq->ws);
+ AZ(w->beresp->ws);
+ AZ(w->resp->ws);
+ AZ(w->wrw.wfd);
+ AZ(w->storage_hint);
+ assert(w->wlp == w->wlb);
+ if (params->diag_bitmap & 0x00040000) {
+ if (w->vcl != NULL)
+ VCL_Rel(&w->vcl);
+ }
}
stats_clean = WRK_TrySumStat(w);
- Lck_Lock(&qp->mtx);
+ Lck_Lock(&pp->mtx);
}
- qp->nthr--;
- Lck_Unlock(&qp->mtx);
+ assert(pp->nthr > 0);
+ pp->nthr--;
+ Lck_Unlock(&pp->mtx);
w->pool = NULL;
}
@@ -320,7 +361,6 @@ pool_mkpool(void)
continue;
ALLOC_OBJ(ps, POOLSOCK_MAGIC);
XXXAN(ps);
- ps->sock = ls->sock;
ps->lsock = ls;
VTAILQ_INSERT_TAIL(&pp->socks, ps, list);
}
diff --git a/bin/varnishd/cache_vrt_vmod.c b/bin/varnishd/cache_vrt_vmod.c
index bd2e172..557b01b 100644
--- a/bin/varnishd/cache_vrt_vmod.c
+++ b/bin/varnishd/cache_vrt_vmod.c
@@ -81,7 +81,7 @@ VRT_Vmod_Init(void **hdl, void *ptr, int len, const char *nm,
if (v->hdl == NULL) {
VCLI_Out(cli, "Loading VMOD %s from %s:\n", nm, path);
VCLI_Out(cli, "dlopen() failed: %s\n", dlerror());
- VCLI_Out(cli, "Check child process permissions.\n");
+ VCLI_Out(cli, "Check child process permissions.\n");
FREE_OBJ(v);
return (1);
}
diff --git a/bin/varnishd/cache_waiter_kqueue.c b/bin/varnishd/cache_waiter_kqueue.c
index 7decfea..6e2cb05 100644
--- a/bin/varnishd/cache_waiter_kqueue.c
+++ b/bin/varnishd/cache_waiter_kqueue.c
@@ -52,9 +52,9 @@
struct vwk {
unsigned magic;
#define VWK_MAGIC 0x1cc2acc2
- pthread_t thread;
+ pthread_t thread;
int pipes[2];
- int kq;
+ int kq;
struct kevent ki[NKEV];
unsigned nki;
VTAILQ_HEAD(,sess) sesshead;
diff --git a/bin/varnishd/cache_wrk.c b/bin/varnishd/cache_wrk.c
index 3cfaba0..8e88e1d 100644
--- a/bin/varnishd/cache_wrk.c
+++ b/bin/varnishd/cache_wrk.c
@@ -79,7 +79,7 @@ WRK_SumStat(struct worker *w)
int
WRK_TrySumStat(struct worker *w)
{
- if (Lck_Trylock(&wstat_mtx))
+ if (Lck_Trylock(&wstat_mtx))
return (0);
wrk_sumstat(w);
Lck_Unlock(&wstat_mtx);
@@ -165,7 +165,6 @@ wrk_thread_real(void *priv, unsigned shm_workspace, unsigned sess_workspace,
w->bereq = HTTP_create(http0, nhttp);
w->beresp = HTTP_create(http1, nhttp);
w->resp = HTTP_create(http2, nhttp);
- w->acceptsock = -1;
w->wrw.iov = iov;
w->wrw.siov = siov;
w->wrw.ciov = siov;
diff --git a/bin/varnishtest/tests/b00000.vtc b/bin/varnishtest/tests/b00000.vtc
index 1f4f766..2018235 100644
--- a/bin/varnishtest/tests/b00000.vtc
+++ b/bin/varnishtest/tests/b00000.vtc
@@ -10,7 +10,7 @@ varnish v1 -storage "-smalloc,1m" -vcl+backend {} -start
varnish v1 -cliok "param.set diag_bitmap 0x2"
varnish v1 -expect n_object == 0
-varnish v1 -expect client_conn == 0
+varnish v1 -expect sess_conn == 0
varnish v1 -expect client_req == 0
varnish v1 -expect cache_miss == 0
@@ -21,7 +21,7 @@ client c1 {
} -run
varnish v1 -expect n_object == 1
-varnish v1 -expect client_conn == 1
+varnish v1 -expect sess_conn == 1
varnish v1 -expect client_req == 1
varnish v1 -expect cache_miss == 1
varnish v1 -expect s_sess == 1
diff --git a/bin/varnishtest/tests/b00001.vtc b/bin/varnishtest/tests/b00001.vtc
index 41dbe63..edec601 100644
--- a/bin/varnishtest/tests/b00001.vtc
+++ b/bin/varnishtest/tests/b00001.vtc
@@ -18,7 +18,7 @@ client c1 {
} -run
varnish v1 -expect n_object == 0
-varnish v1 -expect client_conn == 1
+varnish v1 -expect sess_conn == 1
varnish v1 -expect client_req == 1
varnish v1 -expect s_sess == 1
varnish v1 -expect s_req == 1
diff --git a/bin/varnishtest/tests/b00002.vtc b/bin/varnishtest/tests/b00002.vtc
index 54a7ab7..8bb7ad3 100644
--- a/bin/varnishtest/tests/b00002.vtc
+++ b/bin/varnishtest/tests/b00002.vtc
@@ -22,7 +22,7 @@ delay .1
varnish v1 -expect n_object == 0
varnish v1 -expect SMA.Transient.g_alloc == 0
-varnish v1 -expect client_conn == 1
+varnish v1 -expect sess_conn == 1
varnish v1 -expect client_req == 1
varnish v1 -expect s_sess == 1
varnish v1 -expect s_req == 1
diff --git a/bin/varnishtest/tests/b00003.vtc b/bin/varnishtest/tests/b00003.vtc
index 8b9375d..8c2bf00 100644
--- a/bin/varnishtest/tests/b00003.vtc
+++ b/bin/varnishtest/tests/b00003.vtc
@@ -24,7 +24,7 @@ client c2 {
# Give varnish a chance to update stats
delay .1
-varnish v1 -expect client_conn == 2
+varnish v1 -expect sess_conn == 2
varnish v1 -expect cache_hit == 1
varnish v1 -expect cache_miss == 1
varnish v1 -expect client_req == 2
diff --git a/bin/varnishtest/tests/c00020.vtc b/bin/varnishtest/tests/c00020.vtc
index 31875b2..7fc707c 100644
--- a/bin/varnishtest/tests/c00020.vtc
+++ b/bin/varnishtest/tests/c00020.vtc
@@ -50,7 +50,7 @@ client c2 {
expect resp.http.X-Varnish == "1006 1003"
} -run
-varnish v1 -expect client_conn == 3
+varnish v1 -expect sess_conn == 3
varnish v1 -expect cache_hit == 3
varnish v1 -expect cache_miss == 3
varnish v1 -expect client_req == 6
diff --git a/bin/varnishtest/tests/c00023.vtc b/bin/varnishtest/tests/c00023.vtc
index 6bed8e3..8c65eaa 100644
--- a/bin/varnishtest/tests/c00023.vtc
+++ b/bin/varnishtest/tests/c00023.vtc
@@ -148,7 +148,7 @@ client c1 {
varnish v1 -cliok "hcb.dump"
-varnish v1 -expect client_conn == 2
+varnish v1 -expect sess_conn == 2
varnish v1 -expect cache_hit == 9
varnish v1 -expect cache_miss == 9
varnish v1 -expect client_req == 18
diff --git a/include/vsc_fields.h b/include/vsc_fields.h
index 6f910de..fc81919 100644
--- a/include/vsc_fields.h
+++ b/include/vsc_fields.h
@@ -32,7 +32,7 @@
* n - Name: Field name, in C-source and stats programs
* t - Type: C-type, uint64_t, unless marked in 'f'
* l - Local: Local counter in worker thread.
- * f - Format: Semantics of the value in this field
+ * f - Format: Semantics of the value in this field
* 'a' - Accumulator (deprecated, use 'c')
* 'b' - Bitmap
* 'c' - Counter, never decreases.
@@ -40,7 +40,7 @@
* 'i' - Integer (deprecated, use 'g')
* e - Explantion: Short explanation of field (for screen use)
* d - Description: Long explanation of field (for doc use)
- *
+ *
* -----------------------
* NB: Cleanup in progress
* -----------------------
@@ -57,9 +57,30 @@
#ifdef VSC_DO_MAIN
-VSC_F(client_conn, uint64_t, 1, 'a', "Client connections accepted", "")
-VSC_F(client_drop, uint64_t, 0, 'a',
- "Connection dropped, no sess/wrk", "")
+/*---------------------------------------------------------------------
+ * Sessions
+ * see: cache_acceptor.c and cache_pool.c
+ */
+
+VSC_F(sess_conn, uint64_t, 1, 'c',
+ "Sessions accepted",
+ "Count of sessions succesfully accepted"
+)
+VSC_F(sess_drop, uint64_t, 1, 'c',
+ "Sessions dropped",
+ "Count of sessions silently dropped due to lack of session memory."
+ " See parameter 'max_sess'."
+)
+
+VSC_F(sess_fail, uint64_t, 1, 'c',
+ "Session accept failures",
+ "Count of failures to accept TCP connection."
+ " Either the client changed its mind, or the kernel ran out of"
+ " some resource like filedescriptors."
+)
+
+/*---------------------------------------------------------------------*/
+
VSC_F(client_req, uint64_t, 1, 'a', "Client requests received", "")
VSC_F(cache_hit, uint64_t, 1, 'a', "Cache hits", "")
@@ -195,7 +216,6 @@ VSC_F(hcb_insert, uint64_t, 0, 'a', "HCB Inserts", "")
VSC_F(esi_errors, uint64_t, 0, 'a', "ESI parse errors (unlock)", "")
VSC_F(esi_warnings, uint64_t, 0, 'a', "ESI parse warnings (unlock)", "")
-VSC_F(accept_fail, uint64_t, 0, 'a', "Accept failures", "")
VSC_F(client_drop_late, uint64_t, 0, 'a', "Connection dropped late", "")
VSC_F(uptime, uint64_t, 0, 'a', "Client uptime", "")
More information about the varnish-commit
mailing list