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 {
};
/* -------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
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);
......
......@@ -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);
......
......@@ -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.
......
......@@ -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);
}
......@@ -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++;
......
......@@ -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);
}
......@@ -202,4 +202,5 @@ struct params {
ssize_t vsl_space;
struct poolparam vbc_pool;
struct poolparam req_pool;
};
......@@ -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 }
};
......
......@@ -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"
......@@ -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
......
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