[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