[master] e6aaefc Allocate the boc with the objcore. Dispose when refcount goes to zero. Private objcores for pipe neither want nor need a boc, so make it optional.
Poul-Henning Kamp
phk at FreeBSD.org
Thu Jan 28 12:49:19 CET 2016
commit e6aaefc5928d2c2ab96fda5a074e9b5b2bd6326d
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Thu Jan 21 00:21:19 2016 +0000
Allocate the boc with the objcore.
Dispose when refcount goes to zero.
Private objcores for pipe neither want nor need a boc, so make it optional.
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 2de7093..b080036 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -463,7 +463,7 @@ struct busyobj {
unsigned magic;
#define BUSYOBJ_MAGIC 0x23b95567
- struct boc boc[1];
+ struct boc *boc;
char *end;
diff --git a/bin/varnishd/cache/cache_busyobj.c b/bin/varnishd/cache/cache_busyobj.c
index 809138e..110c44f 100644
--- a/bin/varnishd/cache/cache_busyobj.c
+++ b/bin/varnishd/cache/cache_busyobj.c
@@ -68,11 +68,6 @@ vbo_New(void)
XXXAN(bo);
bo->magic = BUSYOBJ_MAGIC;
bo->end = (char *)bo + sz;
- INIT_OBJ(bo->boc, BOC_MAGIC);
- Lck_New(&bo->boc->mtx, lck_busyobj);
- AZ(pthread_cond_init(&bo->boc->cond, NULL));
- bo->boc->busyobj = bo;
- bo->boc->refcount = 1;
return (bo);
}
@@ -86,9 +81,6 @@ vbo_Free(struct busyobj **bop)
*bop = NULL;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
AZ(bo->htc);
- AZ(bo->boc->refcount);
- AZ(pthread_cond_destroy(&bo->boc->cond));
- Lck_Delete(&bo->boc->mtx);
MPL_Free(vbopool, bo);
}
@@ -192,14 +184,6 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
VCL_Rel(&bo->vcl);
- AZ(bo->boc->stevedore_priv);
- AZ(bo->boc->refcount);
- bo->boc->state = BOS_INVALID;
- if (bo->boc->vary != NULL) {
- free(bo->boc->vary);
- bo->boc->vary = NULL;
- }
-
memset(&bo->retries, 0,
sizeof *bo - offsetof(struct busyobj, retries));
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index e7dc558..6c353b6 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -985,7 +985,8 @@ VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc,
}
bo = VBO_GetBusyObj(wrk, req);
- oc->boc = bo->boc;
+ bo->boc = oc->boc;
+ bo->boc->busyobj = bo;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
VSLb(bo->vsl, SLT_Begin, "bereq %u %s", VXID(req->vsl->wid), how);
diff --git a/bin/varnishd/cache/cache_hash.c b/bin/varnishd/cache/cache_hash.c
index ddd8279..96f1f7a 100644
--- a/bin/varnishd/cache/cache_hash.c
+++ b/bin/varnishd/cache/cache_hash.c
@@ -68,14 +68,21 @@ static struct objhead *private_oh;
/*---------------------------------------------------------------------*/
static struct objcore *
-hsh_NewObjCore(struct worker *wrk)
+hsh_NewObjCore(struct worker *wrk, int boc)
{
struct objcore *oc;
ALLOC_OBJ(oc, OBJCORE_MAGIC);
- XXXAN(oc);
+ AN(oc);
wrk->stats->n_objectcore++;
oc->flags |= OC_F_BUSY | OC_F_INCOMPLETE;
+ if (boc) {
+ ALLOC_OBJ(oc->boc, BOC_MAGIC);
+ AN(oc->boc);
+ Lck_New(&oc->boc->mtx, lck_busyobj);
+ AZ(pthread_cond_init(&oc->boc->cond, NULL));
+ oc->boc->refcount = 1;
+ }
return (oc);
}
@@ -104,7 +111,7 @@ hsh_prealloc(struct worker *wrk)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
if (wrk->nobjcore == NULL)
- wrk->nobjcore = hsh_NewObjCore(wrk);
+ wrk->nobjcore = hsh_NewObjCore(wrk, 1);
CHECK_OBJ_NOTNULL(wrk->nobjcore, OBJCORE_MAGIC);
if (wrk->nobjhead == NULL) {
@@ -120,13 +127,13 @@ hsh_prealloc(struct worker *wrk)
/*---------------------------------------------------------------------*/
struct objcore *
-HSH_Private(struct worker *wrk)
+HSH_Private(struct worker *wrk, int wantboc)
{
struct objcore *oc;
CHECK_OBJ_NOTNULL(private_oh, OBJHEAD_MAGIC);
- oc = hsh_NewObjCore(wrk);
+ oc = hsh_NewObjCore(wrk, wantboc);
AN(oc);
oc->refcnt = 1;
oc->objhead = private_oh;
@@ -717,7 +724,7 @@ HSH_RefBusy(const struct objcore *oc)
boc = oc->boc;
CHECK_OBJ_ORNULL(boc, BOC_MAGIC);
if (boc != NULL) {
- CHECK_OBJ_NOTNULL(boc->busyobj, BUSYOBJ_MAGIC);
+ //CHECK_OBJ_NOTNULL(boc->busyobj, BUSYOBJ_MAGIC);
boc->refcount++;
}
Lck_Unlock(&oh->mtx);
@@ -741,8 +748,13 @@ HSH_DerefBusy(struct worker *wrk, struct objcore *oc)
if (r == 0)
oc->boc = NULL;
Lck_Unlock(&oc->objhead->mtx);
- if (r == 0)
+ if (r == 0) {
VBO_DerefBusyObj(wrk, &boc->busyobj);
+ AZ(pthread_cond_destroy(&boc->cond));
+ Lck_Delete(&boc->mtx);
+ free(boc->vary);
+ FREE_OBJ(boc);
+ }
}
/*--------------------------------------------------------------------
diff --git a/bin/varnishd/cache/cache_req_body.c b/bin/varnishd/cache/cache_req_body.c
index bc7d270..dbdf15d 100644
--- a/bin/varnishd/cache/cache_req_body.c
+++ b/bin/varnishd/cache/cache_req_body.c
@@ -216,7 +216,7 @@ VRB_Cache(struct req *req, ssize_t maxsize)
return (-1);
}
- req->body_oc = HSH_Private(req->wrk);
+ req->body_oc = HSH_Private(req->wrk, 0);
AN(req->body_oc);
XXXAN(STV_NewObject(req->wrk, req->body_oc, TRANSIENT_STORAGE, 8));
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 4bb06d8..365c482 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -293,7 +293,8 @@ cnt_synth(struct worker *wrk, struct req *req)
if (http_HdrIs(req->resp, H_Connection, "close"))
req->doclose = SC_RESP_CLOSE;
- req->objcore = HSH_Private(wrk);
+ req->objcore = HSH_Private(wrk, 0);
+ AZ(req->objcore->boc);
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
if (STV_NewObject(wrk, req->objcore, TRANSIENT_STORAGE, 1024)) {
szl = VSB_len(synth_body);
@@ -311,8 +312,9 @@ cnt_synth(struct worker *wrk, struct req *req)
if (szl < 0) {
VSLb(req->vsl, SLT_Error, "Could not get storage");
req->doclose = SC_OVERLOAD;
- } else
+ } else {
cnt_vdp(req, NULL);
+ }
(void)HSH_DerefObjCore(wrk, &req->objcore);
VSB_delete(synth_body);
@@ -437,7 +439,7 @@ cnt_lookup(struct worker *wrk, struct req *req)
case VCL_RET_DELIVER:
if (busy != NULL) {
AZ(oc->flags & OC_F_PASS);
- AZ(busy->boc);
+ CHECK_OBJ_NOTNULL(busy->boc, BOC_MAGIC);
VBF_Fetch(wrk, req, busy, oc, VBF_BACKGROUND);
} else {
(void)VRB_Ignore(req);// XXX: handle err
@@ -557,7 +559,7 @@ cnt_pass(struct worker *wrk, struct req *req)
break;
case VCL_RET_FETCH:
wrk->stats->s_pass++;
- req->objcore = HSH_Private(wrk);
+ req->objcore = HSH_Private(wrk, 1);
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
VBF_Fetch(wrk, req, req->objcore, NULL, VBF_PASS);
req->req_step = R_STP_FETCH;
@@ -602,7 +604,6 @@ cnt_pipe(struct worker *wrk, struct req *req)
if (VDI_Http1Pipe(req, bo) < 0)
VSLb(bo->vsl, SLT_VCL_Error, "Backend does not support pipe");
http_Teardown(bo->bereq);
-bo->boc->refcount = 0;
VBO_DerefBusyObj(wrk, &bo);
THR_SetBusyobj(NULL);
return (REQ_FSM_DONE);
diff --git a/bin/varnishd/hash/hash_slinger.h b/bin/varnishd/hash/hash_slinger.h
index 384b5af..7001204 100644
--- a/bin/varnishd/hash/hash_slinger.h
+++ b/bin/varnishd/hash/hash_slinger.h
@@ -74,7 +74,7 @@ void HSH_Purge(struct worker *, struct objhead *, double ttl, double grace,
void HSH_config(const char *h_arg);
struct boc *HSH_RefBusy(const struct objcore *);
void HSH_DerefBusy(struct worker *wrk, struct objcore *);
-struct objcore *HSH_Private(struct worker *wrk);
+struct objcore *HSH_Private(struct worker *wrk, int wantboc);
#ifdef VARNISH_CACHE_CHILD
More information about the varnish-commit
mailing list