[master] 23b1f97 Add an empty struct req, and start managing it with a mempool per worker pool.
Poul-Henning Kamp
phk at varnish-cache.org
Thu Dec 22 21:51:03 CET 2011
commit 23b1f97765ba6dc44c688187747c77b772f966c7
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu Dec 22 20:46:12 2011 +0000
Add an empty struct req, and start managing it with a mempool per
worker pool.
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index d3b34b7..bcf4f54 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -576,13 +576,24 @@ struct object {
};
-/* -------------------------------------------------------------------*/
+/*--------------------------------------------------------------------*/
+
+struct req {
+ unsigned magic;
+#define REQ_MAGIC 0x2751aaa1
+};
+
+/*--------------------------------------------------------------------*/
struct sess {
unsigned magic;
#define SESS_MAGIC 0x2c2f9c5a
+ /* Cross references ------------------------------------------*/
+
struct worker *wrk;
+ struct req *req;
+ struct sessmem *mem;
/* Session related fields ------------------------------------*/
@@ -600,9 +611,6 @@ struct sess {
char port[PORT_BUFSIZE];
char *client_identity;
- /* Various internal stuff */
- struct sessmem *mem;
-
VTAILQ_ENTRY(sess) poollist;
struct acct acct_ses;
@@ -871,6 +879,7 @@ int Lck_CondWait(pthread_cond_t *cond, struct lock *lck, struct timespec *ts);
#undef LOCK
/* cache_mempool.c */
+void MPL_AssertSane(void *item);
struct mempool * MPL_New(const char *name, volatile struct poolparam *pp,
volatile unsigned *cur_size);
void MPL_Destroy(struct mempool **mpp);
@@ -908,7 +917,7 @@ struct sess *SES_Alloc(void);
void SES_Close(struct sess *sp, const char *reason);
void SES_Delete(struct sess *sp, const char *reason);
void SES_Charge(struct sess *sp);
-struct sesspool *SES_NewPool(struct pool *pp);
+struct sesspool *SES_NewPool(struct pool *pp, unsigned pool_no);
void SES_DeletePool(struct sesspool *sp, struct worker *wrk);
int SES_Schedule(struct sess *sp);
void SES_Handle(struct sess *sp, int status);
diff --git a/bin/varnishd/cache/cache_acceptor.c b/bin/varnishd/cache/cache_acceptor.c
index a9b8c0b..87e51a9 100644
--- a/bin/varnishd/cache/cache_acceptor.c
+++ b/bin/varnishd/cache/cache_acceptor.c
@@ -282,7 +282,6 @@ VCA_SetupSess(struct worker *w)
assert(wa->acceptaddrlen <= sp->sockaddrlen);
memcpy(&sp->sockaddr, &wa->acceptaddr, wa->acceptaddrlen);
sp->sockaddrlen = wa->acceptaddrlen;
- sp->step = STP_FIRST;
vca_pace_good();
w->stats.sess_conn++;
vca_prep(sp);
diff --git a/bin/varnishd/cache/cache_center.c b/bin/varnishd/cache/cache_center.c
index e7c7fe2..333db31 100644
--- a/bin/varnishd/cache/cache_center.c
+++ b/bin/varnishd/cache/cache_center.c
@@ -1665,6 +1665,8 @@ CNT_Session(struct sess *sp)
struct worker *wrk;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+ CHECK_OBJ_NOTNULL(sp->req, REQ_MAGIC);
+ MPL_AssertSane(sp->req);
wrk = sp->wrk;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
@@ -1702,6 +1704,8 @@ CNT_Session(struct sess *sp)
*/
for (done = 0; !done; ) {
assert(sp->wrk == wrk);
+ CHECK_OBJ_NOTNULL(sp->req, REQ_MAGIC);
+ MPL_AssertSane(sp->req);
/*
* This is a good place to be paranoid about the various
* pointers still pointing to the things we expect.
diff --git a/bin/varnishd/cache/cache_mempool.c b/bin/varnishd/cache/cache_mempool.c
index a89f1e7..6f556f2 100644
--- a/bin/varnishd/cache/cache_mempool.c
+++ b/bin/varnishd/cache/cache_mempool.c
@@ -153,7 +153,7 @@ mpl_guard(void *priv)
VTAILQ_REMOVE(&mpl->surplus,
mi, list);
}
- if (mi == NULL)
+ if (mi == NULL)
break;
FREE_OBJ(mi);
mi = NULL;
@@ -305,6 +305,7 @@ MPL_Get(struct mempool *mpl, unsigned *size)
if (size != NULL)
*size = mi->size;
+ CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC);
/* Throw away sizeof info for FlexeLint: */
return ((void*)(uintptr_t)&mi->payload);
}
@@ -315,6 +316,7 @@ MPL_Free(struct mempool *mpl, void *item)
struct memitem *mi;
CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC);
+ AN(item);
mi = (void*)((uintptr_t)item - offsetof(struct memitem, payload));
CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC);
@@ -339,3 +341,11 @@ MPL_Free(struct mempool *mpl, void *item)
Lck_Unlock(&mpl->mtx);
}
+
+void
+MPL_AssertSane(void *item)
+{
+ struct memitem *mi;
+ mi = (void*)((uintptr_t)item - offsetof(struct memitem, payload));
+ CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC);
+}
diff --git a/bin/varnishd/cache/cache_pool.c b/bin/varnishd/cache/cache_pool.c
index c557edd..ee71572 100644
--- a/bin/varnishd/cache/cache_pool.c
+++ b/bin/varnishd/cache/cache_pool.c
@@ -244,6 +244,7 @@ Pool_Work_Thread(void *priv, struct worker *w)
w->do_what = pool_do_nothing;
} else {
VCA_SetupSess(w);
+ w->sp->step = STP_FIRST;
w->do_what = pool_do_sess;
}
WS_Release(w->ws, 0);
@@ -490,7 +491,7 @@ pool_herder(void *priv)
*/
static struct pool *
-pool_mkpool(void)
+pool_mkpool(unsigned pool_no)
{
struct pool *pp;
struct listen_sock *ls;
@@ -504,7 +505,7 @@ pool_mkpool(void)
VTAILQ_INIT(&pp->queue);
VTAILQ_INIT(&pp->idle);
VTAILQ_INIT(&pp->socks);
- pp->sesspool = SES_NewPool(pp);
+ pp->sesspool = SES_NewPool(pp, pool_no);
AN(pp->sesspool);
VTAILQ_FOREACH(ls, &heritage.socks, list) {
@@ -545,7 +546,7 @@ pool_poolherder(void *priv)
nwq = 0;
while (1) {
if (nwq < cache_param->wthread_pools) {
- pp = pool_mkpool();
+ pp = pool_mkpool(nwq);
if (pp != NULL) {
VTAILQ_INSERT_TAIL(&pools, pp, list);
VSC_C_main->pools++;
diff --git a/bin/varnishd/cache/cache_session.c b/bin/varnishd/cache/cache_session.c
index 65dd5c7..790ea2c 100644
--- a/bin/varnishd/cache/cache_session.c
+++ b/bin/varnishd/cache/cache_session.c
@@ -36,6 +36,7 @@
#include "config.h"
#include <math.h>
+#include <stdio.h>
#include <stdlib.h>
#include "cache.h"
@@ -67,6 +68,8 @@ struct sesspool {
struct lock mtx;
unsigned nsess;
unsigned dly_free_cnt;
+ unsigned req_size;
+ struct mempool *mpl_req;
};
/*--------------------------------------------------------------------
@@ -214,6 +217,9 @@ SES_New(struct worker *wrk, struct sesspool *pp)
if (sm == NULL)
return (NULL);
sp = &sm->sess;
+ sp->req = MPL_Get(pp->mpl_req, NULL);
+ AN(sp->req);
+ sp->req->magic = REQ_MAGIC;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
return (sp);
}
@@ -233,6 +239,7 @@ SES_Alloc(void)
ses_setup(sm);
sp = &sm->sess;
sp->sockaddrlen = 0;
+ /* XXX: sp->req ? */
return (sp);
}
@@ -326,6 +333,8 @@ SES_Delete(struct sess *sp, const char *reason)
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+ CHECK_OBJ_NOTNULL(sp->req, REQ_MAGIC);
+ MPL_AssertSane(sp->req);
sm = sp->mem;
CHECK_OBJ_NOTNULL(sm, SESSMEM_MAGIC);
pp = sm->pool;
@@ -353,6 +362,11 @@ SES_Delete(struct sess *sp, const char *reason)
b->sess, b->req, b->pipe, b->pass,
b->fetch, b->hdrbytes, b->bodybytes);
+ CHECK_OBJ_NOTNULL(sp->req, REQ_MAGIC);
+ MPL_AssertSane(sp->req);
+ MPL_Free(pp->mpl_req, sp->req);
+ sp->req = NULL;
+
if (sm->workspace != cache_param->sess_workspace ||
sm->nhttp != (uint16_t)cache_param->http_max_hdr ||
pp->nsess > cache_param->max_sess) {
@@ -382,15 +396,19 @@ SES_Delete(struct sess *sp, const char *reason)
*/
struct sesspool *
-SES_NewPool(struct pool *pp)
+SES_NewPool(struct pool *pp, unsigned pool_no)
{
struct sesspool *sp;
+ char nb[8];
ALLOC_OBJ(sp, SESSPOOL_MAGIC);
AN(sp);
sp->pool = pp;
VTAILQ_INIT(&sp->freelist);
Lck_New(&sp->mtx, lck_sessmem);
+ bprintf(nb, "req%u", pool_no);
+ sp->req_size = sizeof (struct req);
+ sp->mpl_req = MPL_New(nb, &cache_param->req_pool, &sp->req_size);
return (sp);
}
@@ -413,5 +431,6 @@ SES_DeletePool(struct sesspool *sp, struct worker *wrk)
AZ(sp->nsess);
Lck_Unlock(&sp->mtx);
Lck_Delete(&sp->mtx);
+ MPL_Destroy(&sp->mpl_req);
FREE_OBJ(sp);
}
diff --git a/bin/varnishd/common/params.h b/bin/varnishd/common/params.h
index 8198a78..a024452 100644
--- a/bin/varnishd/common/params.h
+++ b/bin/varnishd/common/params.h
@@ -202,4 +202,5 @@ struct params {
ssize_t vsl_space;
struct poolparam vbc_pool;
+ struct poolparam req_pool;
};
diff --git a/bin/varnishd/mgt/mgt_param.c b/bin/varnishd/mgt/mgt_param.c
index f7f1dd0..c236323 100644
--- a/bin/varnishd/mgt/mgt_param.c
+++ b/bin/varnishd/mgt/mgt_param.c
@@ -1197,7 +1197,7 @@ static const struct parspec input_parspec[] = {
0,
"true", ""},
- { "vbc_pool", tweak_poolparam, &mgt_param.vbc_pool, 0, 10000,
+ { "pool_vbc", tweak_poolparam, &mgt_param.vbc_pool, 0, 10000,
"Parameters for backend connection memory pool.\n"
"The three numbers are:\n"
" min_pool -- minimum size of free pool.\n"
@@ -1206,6 +1206,15 @@ static const struct parspec input_parspec[] = {
0,
"10,100,10", ""},
+ { "pool_req", tweak_poolparam, &mgt_param.req_pool, 0, 10000,
+ "Parameters for per worker pool request memory pool.\n"
+ "The three numbers are:\n"
+ " min_pool -- minimum size of free pool.\n"
+ " max_pool -- maximum size of free pool.\n"
+ " max_age -- max age of free element.\n",
+ 0,
+ "10,100,10", ""},
+
{ NULL, NULL, NULL }
};
diff --git a/bin/varnishtest/tests/b00034.vtc b/bin/varnishtest/tests/b00034.vtc
index 3579fcb..8e23d60 100644
--- a/bin/varnishtest/tests/b00034.vtc
+++ b/bin/varnishtest/tests/b00034.vtc
@@ -5,9 +5,9 @@ server s1 {
varnish v1 -vcl+backend {}
-varnish v1 -cliok "param.set vbc_pool 1,10,1"
-varnish v1 -clierr 106 "param.set vbc_pool 10"
-varnish v1 -clierr 106 "param.set vbc_pool 10,1,1"
-varnish v1 -clierr 106 "param.set vbc_pool a,10,10"
-varnish v1 -clierr 106 "param.set vbc_pool 10,a,10"
-varnish v1 -clierr 106 "param.set vbc_pool 10,10,a"
+varnish v1 -cliok "param.set pool_vbc 1,10,1"
+varnish v1 -clierr 106 "param.set pool_vbc 10"
+varnish v1 -clierr 106 "param.set pool_vbc 10,1,1"
+varnish v1 -clierr 106 "param.set pool_vbc a,10,10"
+varnish v1 -clierr 106 "param.set pool_vbc 10,a,10"
+varnish v1 -clierr 106 "param.set pool_vbc 10,10,a"
diff --git a/bin/varnishtest/tests/c00050.vtc b/bin/varnishtest/tests/c00050.vtc
index 340563b..04d8f2c 100644
--- a/bin/varnishtest/tests/c00050.vtc
+++ b/bin/varnishtest/tests/c00050.vtc
@@ -8,20 +8,20 @@ delay 1
varnish v1 -expect MEMPOOL.vbc.pool == 10
-varnish v1 -cliok "param.set vbc_pool 90,100,100"
+varnish v1 -cliok "param.set pool_vbc 90,100,100"
delay 1
varnish v1 -expect MEMPOOL.vbc.pool == 90
-varnish v1 -cliok "param.set vbc_pool 50,80,100"
+varnish v1 -cliok "param.set pool_vbc 50,80,100"
delay 1
varnish v1 -expect MEMPOOL.vbc.pool == 80
varnish v1 -expect MEMPOOL.vbc.surplus == 10
-varnish v1 -cliok "param.set vbc_pool 10,80,1"
+varnish v1 -cliok "param.set pool_vbc 10,80,1"
delay 1
More information about the varnish-commit
mailing list