Commit 5b339acd authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Leave bo->fetch_objcore intact, even as the refcount moves to the object.

parent 1417f9d0
...@@ -159,7 +159,7 @@ void ...@@ -159,7 +159,7 @@ void
VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo) VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
{ {
struct busyobj *bo; struct busyobj *bo;
struct objcore *oc; struct objcore *oc = NULL;
unsigned r; unsigned r;
CHECK_OBJ_ORNULL(wrk, WORKER_MAGIC); CHECK_OBJ_ORNULL(wrk, WORKER_MAGIC);
...@@ -167,9 +167,10 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo) ...@@ -167,9 +167,10 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
bo = *pbo; bo = *pbo;
*pbo = NULL; *pbo = NULL;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC); CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
CHECK_OBJ_ORNULL(bo->fetch_objcore, OBJCORE_MAGIC);
CHECK_OBJ_ORNULL(bo->fetch_obj, OBJECT_MAGIC); CHECK_OBJ_ORNULL(bo->fetch_obj, OBJECT_MAGIC);
if (bo->fetch_obj != NULL) { if (bo->fetch_objcore != NULL) {
oc = bo->fetch_obj->objcore; oc = bo->fetch_objcore;
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC); CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
CHECK_OBJ_NOTNULL(oc->objhead, OBJHEAD_MAGIC); CHECK_OBJ_NOTNULL(oc->objhead, OBJHEAD_MAGIC);
Lck_Lock(&oc->objhead->mtx); Lck_Lock(&oc->objhead->mtx);
...@@ -177,7 +178,6 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo) ...@@ -177,7 +178,6 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
r = --bo->refcount; r = --bo->refcount;
Lck_Unlock(&oc->objhead->mtx); Lck_Unlock(&oc->objhead->mtx);
} else { } else {
oc = NULL;
Lck_Lock(&bo->mtx); Lck_Lock(&bo->mtx);
assert(bo->refcount > 0); assert(bo->refcount > 0);
r = --bo->refcount; r = --bo->refcount;
...@@ -190,9 +190,9 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo) ...@@ -190,9 +190,9 @@ VBO_DerefBusyObj(struct worker *wrk, struct busyobj **pbo)
VSLb(bo->vsl, SLT_End, "%s", ""); VSLb(bo->vsl, SLT_End, "%s", "");
VSL_Flush(bo->vsl, 0); VSL_Flush(bo->vsl, 0);
if (oc != NULL) { if (bo->fetch_objcore != NULL) {
AN(wrk); AN(wrk);
(void)HSH_Deref(&wrk->stats, NULL, &bo->fetch_obj); (void)HSH_Deref(&wrk->stats, bo->fetch_objcore, NULL);
} }
VCL_Rel(&bo->vcl); VCL_Rel(&bo->vcl);
......
...@@ -345,6 +345,7 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo) ...@@ -345,6 +345,7 @@ vbf_stp_fetch(struct worker *wrk, struct busyobj *bo)
AZ(bo->stats); AZ(bo->stats);
bo->stats = &wrk->stats; bo->stats = &wrk->stats;
AN(bo->fetch_objcore);
obj = STV_NewObject(bo, bo->storage_hint, l, nhttp); obj = STV_NewObject(bo, bo->storage_hint, l, nhttp);
if (obj == NULL) { if (obj == NULL) {
/* /*
......
...@@ -162,6 +162,7 @@ cnt_deliver(struct worker *wrk, struct req *req) ...@@ -162,6 +162,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
CHECK_OBJ_NOTNULL(req->obj->objcore, OBJCORE_MAGIC); CHECK_OBJ_NOTNULL(req->obj->objcore, OBJCORE_MAGIC);
CHECK_OBJ_NOTNULL(req->obj->objcore->objhead, OBJHEAD_MAGIC);
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC); CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
assert(req->obj->objcore->refcnt > 0); assert(req->obj->objcore->refcnt > 0);
...@@ -288,9 +289,10 @@ cnt_error(struct worker *wrk, struct req *req) ...@@ -288,9 +289,10 @@ cnt_error(struct worker *wrk, struct req *req)
AZ(bo->stats); AZ(bo->stats);
bo->stats = &wrk->stats; bo->stats = &wrk->stats;
bo->fetch_objcore = HSH_Private(wrk); bo->fetch_objcore = HSH_Private(wrk);
req->obj = STV_NewObject(bo, bo->fetch_obj = STV_NewObject(bo,
TRANSIENT_STORAGE, cache_param->http_resp_size, TRANSIENT_STORAGE, cache_param->http_resp_size,
(uint16_t)cache_param->http_max_hdr); (uint16_t)cache_param->http_max_hdr);
req->obj = bo->fetch_obj;
bo->stats = NULL; bo->stats = NULL;
if (req->obj == NULL) { if (req->obj == NULL) {
req->doclose = SC_OVERLOAD; req->doclose = SC_OVERLOAD;
...@@ -305,7 +307,6 @@ cnt_error(struct worker *wrk, struct req *req) ...@@ -305,7 +307,6 @@ cnt_error(struct worker *wrk, struct req *req)
} }
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC); CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
AZ(req->objcore); AZ(req->objcore);
AZ(bo->fetch_objcore);
req->obj->vxid = bo->vsl->wid; req->obj->vxid = bo->vsl->wid;
req->obj->exp.entered = req->t_req; req->obj->exp.entered = req->t_req;
...@@ -320,6 +321,9 @@ cnt_error(struct worker *wrk, struct req *req) ...@@ -320,6 +321,9 @@ cnt_error(struct worker *wrk, struct req *req)
http_PrintfHeader(h, "Date: %s", date); http_PrintfHeader(h, "Date: %s", date);
http_SetHeader(h, "Server: Varnish"); http_SetHeader(h, "Server: Varnish");
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
HSH_Ref(req->obj->objcore);
if (req->err_reason != NULL) if (req->err_reason != NULL)
http_PutResponse(h, req->err_reason); http_PutResponse(h, req->err_reason);
else else
...@@ -331,11 +335,12 @@ cnt_error(struct worker *wrk, struct req *req) ...@@ -331,11 +335,12 @@ cnt_error(struct worker *wrk, struct req *req)
wrk->handling = VCL_RET_DELIVER; wrk->handling = VCL_RET_DELIVER;
if (wrk->handling == VCL_RET_RESTART) { if (wrk->handling == VCL_RET_RESTART) {
HSH_Drop(wrk, &req->obj);
VBO_DerefBusyObj(wrk, &req->busyobj); VBO_DerefBusyObj(wrk, &req->busyobj);
HSH_Drop(wrk, &req->obj);
req->req_step = R_STP_RESTART; req->req_step = R_STP_RESTART;
return (REQ_FSM_MORE); return (REQ_FSM_MORE);
} }
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
/* We always close when we take this path */ /* We always close when we take this path */
req->doclose = SC_TX_ERROR; req->doclose = SC_TX_ERROR;
...@@ -345,8 +350,10 @@ cnt_error(struct worker *wrk, struct req *req) ...@@ -345,8 +350,10 @@ cnt_error(struct worker *wrk, struct req *req)
req->err_code = 0; req->err_code = 0;
req->err_reason = NULL; req->err_reason = NULL;
http_Teardown(bo->bereq); http_Teardown(bo->bereq);
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
VBO_DerefBusyObj(wrk, &req->busyobj); VBO_DerefBusyObj(wrk, &req->busyobj);
req->req_step = R_STP_DELIVER; req->req_step = R_STP_DELIVER;
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
return (REQ_FSM_MORE); return (REQ_FSM_MORE);
} }
......
...@@ -288,7 +288,6 @@ STV_MkObject(struct stevedore *stv, struct busyobj *bo, ...@@ -288,7 +288,6 @@ STV_MkObject(struct stevedore *stv, struct busyobj *bo,
bo->stats->n_object++; bo->stats->n_object++;
o->objcore = bo->fetch_objcore; o->objcore = bo->fetch_objcore;
bo->fetch_objcore = NULL; /* refcnt follows pointer. */
if (!(o->objcore->flags & OC_F_PRIVATE)) if (!(o->objcore->flags & OC_F_PRIVATE))
BAN_NewObjCore(o->objcore); BAN_NewObjCore(o->objcore);
......
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