Commit 23b1f977 authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Add an empty struct req, and start managing it with a mempool per

worker pool.
parent 159c511d
...@@ -576,13 +576,24 @@ struct object { ...@@ -576,13 +576,24 @@ struct object {
}; };
/* -------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
struct req {
unsigned magic;
#define REQ_MAGIC 0x2751aaa1
};
/*--------------------------------------------------------------------*/
struct sess { struct sess {
unsigned magic; unsigned magic;
#define SESS_MAGIC 0x2c2f9c5a #define SESS_MAGIC 0x2c2f9c5a
/* Cross references ------------------------------------------*/
struct worker *wrk; struct worker *wrk;
struct req *req;
struct sessmem *mem;
/* Session related fields ------------------------------------*/ /* Session related fields ------------------------------------*/
...@@ -600,9 +611,6 @@ struct sess { ...@@ -600,9 +611,6 @@ struct sess {
char port[PORT_BUFSIZE]; char port[PORT_BUFSIZE];
char *client_identity; char *client_identity;
/* Various internal stuff */
struct sessmem *mem;
VTAILQ_ENTRY(sess) poollist; VTAILQ_ENTRY(sess) poollist;
struct acct acct_ses; struct acct acct_ses;
...@@ -871,6 +879,7 @@ int Lck_CondWait(pthread_cond_t *cond, struct lock *lck, struct timespec *ts); ...@@ -871,6 +879,7 @@ int Lck_CondWait(pthread_cond_t *cond, struct lock *lck, struct timespec *ts);
#undef LOCK #undef LOCK
/* cache_mempool.c */ /* cache_mempool.c */
void MPL_AssertSane(void *item);
struct mempool * MPL_New(const char *name, volatile struct poolparam *pp, struct mempool * MPL_New(const char *name, volatile struct poolparam *pp,
volatile unsigned *cur_size); volatile unsigned *cur_size);
void MPL_Destroy(struct mempool **mpp); void MPL_Destroy(struct mempool **mpp);
...@@ -908,7 +917,7 @@ struct sess *SES_Alloc(void); ...@@ -908,7 +917,7 @@ struct sess *SES_Alloc(void);
void SES_Close(struct sess *sp, const char *reason); void SES_Close(struct sess *sp, const char *reason);
void SES_Delete(struct sess *sp, const char *reason); void SES_Delete(struct sess *sp, const char *reason);
void SES_Charge(struct sess *sp); 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); void SES_DeletePool(struct sesspool *sp, struct worker *wrk);
int SES_Schedule(struct sess *sp); int SES_Schedule(struct sess *sp);
void SES_Handle(struct sess *sp, int status); void SES_Handle(struct sess *sp, int status);
......
...@@ -282,7 +282,6 @@ VCA_SetupSess(struct worker *w) ...@@ -282,7 +282,6 @@ VCA_SetupSess(struct worker *w)
assert(wa->acceptaddrlen <= sp->sockaddrlen); assert(wa->acceptaddrlen <= sp->sockaddrlen);
memcpy(&sp->sockaddr, &wa->acceptaddr, wa->acceptaddrlen); memcpy(&sp->sockaddr, &wa->acceptaddr, wa->acceptaddrlen);
sp->sockaddrlen = wa->acceptaddrlen; sp->sockaddrlen = wa->acceptaddrlen;
sp->step = STP_FIRST;
vca_pace_good(); vca_pace_good();
w->stats.sess_conn++; w->stats.sess_conn++;
vca_prep(sp); vca_prep(sp);
......
...@@ -1665,6 +1665,8 @@ CNT_Session(struct sess *sp) ...@@ -1665,6 +1665,8 @@ CNT_Session(struct sess *sp)
struct worker *wrk; struct worker *wrk;
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(sp->req, REQ_MAGIC);
MPL_AssertSane(sp->req);
wrk = sp->wrk; wrk = sp->wrk;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
...@@ -1702,6 +1704,8 @@ CNT_Session(struct sess *sp) ...@@ -1702,6 +1704,8 @@ CNT_Session(struct sess *sp)
*/ */
for (done = 0; !done; ) { for (done = 0; !done; ) {
assert(sp->wrk == wrk); 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 * This is a good place to be paranoid about the various
* pointers still pointing to the things we expect. * pointers still pointing to the things we expect.
......
...@@ -153,7 +153,7 @@ mpl_guard(void *priv) ...@@ -153,7 +153,7 @@ mpl_guard(void *priv)
VTAILQ_REMOVE(&mpl->surplus, VTAILQ_REMOVE(&mpl->surplus,
mi, list); mi, list);
} }
if (mi == NULL) if (mi == NULL)
break; break;
FREE_OBJ(mi); FREE_OBJ(mi);
mi = NULL; mi = NULL;
...@@ -305,6 +305,7 @@ MPL_Get(struct mempool *mpl, unsigned *size) ...@@ -305,6 +305,7 @@ MPL_Get(struct mempool *mpl, unsigned *size)
if (size != NULL) if (size != NULL)
*size = mi->size; *size = mi->size;
CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC);
/* Throw away sizeof info for FlexeLint: */ /* Throw away sizeof info for FlexeLint: */
return ((void*)(uintptr_t)&mi->payload); return ((void*)(uintptr_t)&mi->payload);
} }
...@@ -315,6 +316,7 @@ MPL_Free(struct mempool *mpl, void *item) ...@@ -315,6 +316,7 @@ MPL_Free(struct mempool *mpl, void *item)
struct memitem *mi; struct memitem *mi;
CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC); CHECK_OBJ_NOTNULL(mpl, MEMPOOL_MAGIC);
AN(item);
mi = (void*)((uintptr_t)item - offsetof(struct memitem, payload)); mi = (void*)((uintptr_t)item - offsetof(struct memitem, payload));
CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC); CHECK_OBJ_NOTNULL(mi, MEMITEM_MAGIC);
...@@ -339,3 +341,11 @@ MPL_Free(struct mempool *mpl, void *item) ...@@ -339,3 +341,11 @@ MPL_Free(struct mempool *mpl, void *item)
Lck_Unlock(&mpl->mtx); 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);
}
...@@ -244,6 +244,7 @@ Pool_Work_Thread(void *priv, struct worker *w) ...@@ -244,6 +244,7 @@ Pool_Work_Thread(void *priv, struct worker *w)
w->do_what = pool_do_nothing; w->do_what = pool_do_nothing;
} else { } else {
VCA_SetupSess(w); VCA_SetupSess(w);
w->sp->step = STP_FIRST;
w->do_what = pool_do_sess; w->do_what = pool_do_sess;
} }
WS_Release(w->ws, 0); WS_Release(w->ws, 0);
...@@ -490,7 +491,7 @@ pool_herder(void *priv) ...@@ -490,7 +491,7 @@ pool_herder(void *priv)
*/ */
static struct pool * static struct pool *
pool_mkpool(void) pool_mkpool(unsigned pool_no)
{ {
struct pool *pp; struct pool *pp;
struct listen_sock *ls; struct listen_sock *ls;
...@@ -504,7 +505,7 @@ pool_mkpool(void) ...@@ -504,7 +505,7 @@ pool_mkpool(void)
VTAILQ_INIT(&pp->queue); VTAILQ_INIT(&pp->queue);
VTAILQ_INIT(&pp->idle); VTAILQ_INIT(&pp->idle);
VTAILQ_INIT(&pp->socks); VTAILQ_INIT(&pp->socks);
pp->sesspool = SES_NewPool(pp); pp->sesspool = SES_NewPool(pp, pool_no);
AN(pp->sesspool); AN(pp->sesspool);
VTAILQ_FOREACH(ls, &heritage.socks, list) { VTAILQ_FOREACH(ls, &heritage.socks, list) {
...@@ -545,7 +546,7 @@ pool_poolherder(void *priv) ...@@ -545,7 +546,7 @@ pool_poolherder(void *priv)
nwq = 0; nwq = 0;
while (1) { while (1) {
if (nwq < cache_param->wthread_pools) { if (nwq < cache_param->wthread_pools) {
pp = pool_mkpool(); pp = pool_mkpool(nwq);
if (pp != NULL) { if (pp != NULL) {
VTAILQ_INSERT_TAIL(&pools, pp, list); VTAILQ_INSERT_TAIL(&pools, pp, list);
VSC_C_main->pools++; VSC_C_main->pools++;
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
#include "config.h" #include "config.h"
#include <math.h> #include <math.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include "cache.h" #include "cache.h"
...@@ -67,6 +68,8 @@ struct sesspool { ...@@ -67,6 +68,8 @@ struct sesspool {
struct lock mtx; struct lock mtx;
unsigned nsess; unsigned nsess;
unsigned dly_free_cnt; unsigned dly_free_cnt;
unsigned req_size;
struct mempool *mpl_req;
}; };
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
...@@ -214,6 +217,9 @@ SES_New(struct worker *wrk, struct sesspool *pp) ...@@ -214,6 +217,9 @@ SES_New(struct worker *wrk, struct sesspool *pp)
if (sm == NULL) if (sm == NULL)
return (NULL); return (NULL);
sp = &sm->sess; 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); CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
return (sp); return (sp);
} }
...@@ -233,6 +239,7 @@ SES_Alloc(void) ...@@ -233,6 +239,7 @@ SES_Alloc(void)
ses_setup(sm); ses_setup(sm);
sp = &sm->sess; sp = &sm->sess;
sp->sockaddrlen = 0; sp->sockaddrlen = 0;
/* XXX: sp->req ? */
return (sp); return (sp);
} }
...@@ -326,6 +333,8 @@ SES_Delete(struct sess *sp, const char *reason) ...@@ -326,6 +333,8 @@ SES_Delete(struct sess *sp, const char *reason)
CHECK_OBJ_NOTNULL(sp, SESS_MAGIC); CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
CHECK_OBJ_NOTNULL(sp->req, REQ_MAGIC);
MPL_AssertSane(sp->req);
sm = sp->mem; sm = sp->mem;
CHECK_OBJ_NOTNULL(sm, SESSMEM_MAGIC); CHECK_OBJ_NOTNULL(sm, SESSMEM_MAGIC);
pp = sm->pool; pp = sm->pool;
...@@ -353,6 +362,11 @@ SES_Delete(struct sess *sp, const char *reason) ...@@ -353,6 +362,11 @@ SES_Delete(struct sess *sp, const char *reason)
b->sess, b->req, b->pipe, b->pass, b->sess, b->req, b->pipe, b->pass,
b->fetch, b->hdrbytes, b->bodybytes); 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 || if (sm->workspace != cache_param->sess_workspace ||
sm->nhttp != (uint16_t)cache_param->http_max_hdr || sm->nhttp != (uint16_t)cache_param->http_max_hdr ||
pp->nsess > cache_param->max_sess) { pp->nsess > cache_param->max_sess) {
...@@ -382,15 +396,19 @@ SES_Delete(struct sess *sp, const char *reason) ...@@ -382,15 +396,19 @@ SES_Delete(struct sess *sp, const char *reason)
*/ */
struct sesspool * struct sesspool *
SES_NewPool(struct pool *pp) SES_NewPool(struct pool *pp, unsigned pool_no)
{ {
struct sesspool *sp; struct sesspool *sp;
char nb[8];
ALLOC_OBJ(sp, SESSPOOL_MAGIC); ALLOC_OBJ(sp, SESSPOOL_MAGIC);
AN(sp); AN(sp);
sp->pool = pp; sp->pool = pp;
VTAILQ_INIT(&sp->freelist); VTAILQ_INIT(&sp->freelist);
Lck_New(&sp->mtx, lck_sessmem); 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); return (sp);
} }
...@@ -413,5 +431,6 @@ SES_DeletePool(struct sesspool *sp, struct worker *wrk) ...@@ -413,5 +431,6 @@ SES_DeletePool(struct sesspool *sp, struct worker *wrk)
AZ(sp->nsess); AZ(sp->nsess);
Lck_Unlock(&sp->mtx); Lck_Unlock(&sp->mtx);
Lck_Delete(&sp->mtx); Lck_Delete(&sp->mtx);
MPL_Destroy(&sp->mpl_req);
FREE_OBJ(sp); FREE_OBJ(sp);
} }
...@@ -202,4 +202,5 @@ struct params { ...@@ -202,4 +202,5 @@ struct params {
ssize_t vsl_space; ssize_t vsl_space;
struct poolparam vbc_pool; struct poolparam vbc_pool;
struct poolparam req_pool;
}; };
...@@ -1197,7 +1197,7 @@ static const struct parspec input_parspec[] = { ...@@ -1197,7 +1197,7 @@ static const struct parspec input_parspec[] = {
0, 0,
"true", ""}, "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" "Parameters for backend connection memory pool.\n"
"The three numbers are:\n" "The three numbers are:\n"
" min_pool -- minimum size of free pool.\n" " min_pool -- minimum size of free pool.\n"
...@@ -1206,6 +1206,15 @@ static const struct parspec input_parspec[] = { ...@@ -1206,6 +1206,15 @@ static const struct parspec input_parspec[] = {
0, 0,
"10,100,10", ""}, "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 } { NULL, NULL, NULL }
}; };
......
...@@ -5,9 +5,9 @@ server s1 { ...@@ -5,9 +5,9 @@ server s1 {
varnish v1 -vcl+backend {} varnish v1 -vcl+backend {}
varnish v1 -cliok "param.set vbc_pool 1,10,1" varnish v1 -cliok "param.set pool_vbc 1,10,1"
varnish v1 -clierr 106 "param.set vbc_pool 10" varnish v1 -clierr 106 "param.set pool_vbc 10"
varnish v1 -clierr 106 "param.set vbc_pool 10,1,1" varnish v1 -clierr 106 "param.set pool_vbc 10,1,1"
varnish v1 -clierr 106 "param.set vbc_pool a,10,10" varnish v1 -clierr 106 "param.set pool_vbc a,10,10"
varnish v1 -clierr 106 "param.set vbc_pool 10,a,10" varnish v1 -clierr 106 "param.set pool_vbc 10,a,10"
varnish v1 -clierr 106 "param.set vbc_pool 10,10,a" varnish v1 -clierr 106 "param.set pool_vbc 10,10,a"
...@@ -8,20 +8,20 @@ delay 1 ...@@ -8,20 +8,20 @@ delay 1
varnish v1 -expect MEMPOOL.vbc.pool == 10 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 delay 1
varnish v1 -expect MEMPOOL.vbc.pool == 90 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 delay 1
varnish v1 -expect MEMPOOL.vbc.pool == 80 varnish v1 -expect MEMPOOL.vbc.pool == 80
varnish v1 -expect MEMPOOL.vbc.surplus == 10 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 delay 1
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment