[master] 209f797 Tie the busyobj to the objcore.
Poul-Henning Kamp
phk at varnish-cache.org
Tue Sep 3 23:44:50 CEST 2013
commit 209f7974d31a4d568a133c0f326825e144c8b72f
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Tue Sep 3 21:44:25 2013 +0000
Tie the busyobj to the objcore.
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 71bff9c..c104506 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -635,7 +635,6 @@ struct req {
/* The busy objhead we sleep on */
struct objhead *hash_objhead;
- struct busyobj *busyobj;
/* Built Vary string */
uint8_t *vary_b;
@@ -851,7 +850,7 @@ enum vbf_fetch_mode_e {
VBF_PASS = 1,
VBF_BACKGROUND = 2,
};
-struct busyobj *VBF_Fetch(struct worker *wrk, struct req *req,
+void VBF_Fetch(struct worker *wrk, struct req *req,
struct objcore *oc, enum vbf_fetch_mode_e);
/* cache_fetch_proc.c */
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 6982be8..8b806be 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -527,7 +527,7 @@ vbf_fetch_thread(struct worker *wrk, void *priv)
/*--------------------------------------------------------------------
*/
-struct busyobj *
+void
VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc,
enum vbf_fetch_mode_e mode)
{
@@ -565,12 +565,11 @@ VBF_Fetch(struct worker *wrk, struct req *req, struct objcore *oc,
vbf_fetch_thread(wrk, bo);
if (mode == VBF_BACKGROUND) {
VBO_waitstate(bo, BOS_REQ_DONE);
- VBO_DerefBusyObj(wrk, &bo);
- return (NULL);
+ } else {
+ VBO_waitstate(bo, BOS_FETCHING);
+ if (!bo->do_stream)
+ VBO_waitstate(bo, BOS_FINISHED);
+ assert(bo->state != BOS_FAILED || (oc->flags & OC_F_FAILED));
}
- VBO_waitstate(bo, BOS_FETCHING);
- if (!bo->do_stream)
- VBO_waitstate(bo, BOS_FINISHED);
- assert(bo->state != BOS_FAILED || (oc->flags & OC_F_FAILED));
- return (bo);
+ VBO_DerefBusyObj(wrk, &bo);
}
diff --git a/bin/varnishd/cache/cache_http1_fsm.c b/bin/varnishd/cache/cache_http1_fsm.c
index d45abf9..d77c36e 100644
--- a/bin/varnishd/cache/cache_http1_fsm.c
+++ b/bin/varnishd/cache/cache_http1_fsm.c
@@ -183,7 +183,6 @@ http1_cleanup(struct sess *sp, struct worker *wrk, struct req *req)
CHECK_OBJ_ORNULL(req->vcl, VCL_CONF_MAGIC);
AZ(req->obj);
- AZ(req->busyobj);
req->director = NULL;
req->restarts = 0;
diff --git a/bin/varnishd/cache/cache_panic.c b/bin/varnishd/cache/cache_panic.c
index 2d23723..fdd7bb3 100644
--- a/bin/varnishd/cache/cache_panic.c
+++ b/bin/varnishd/cache/cache_panic.c
@@ -329,11 +329,11 @@ pan_req(const struct req *req)
if (VALID_OBJ(req->vcl, VCL_CONF_MAGIC))
pan_vcl(req->vcl);
- if (req->busyobj != NULL)
- pan_busyobj(req->busyobj);
-
- if (VALID_OBJ(req->obj, OBJECT_MAGIC))
+ if (VALID_OBJ(req->obj, OBJECT_MAGIC)) {
+ if (req->obj->objcore->busyobj != NULL)
+ pan_busyobj(req->obj->objcore->busyobj);
pan_object(req->obj);
+ }
VSB_printf(pan_vsp, "},\n");
}
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index f8317b5..c918ec1 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -95,7 +95,7 @@ cnt_stream(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
- bo = req->busyobj;
+ bo = req->obj->objcore->busyobj;
CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
AN(bo->do_stream);
@@ -107,7 +107,7 @@ cnt_stream(struct worker *wrk, struct req *req)
if (wrk->handling == VCL_RET_RESTART) {
assert(req->obj == bo->fetch_obj);
req->obj = NULL;
- VBO_DerefBusyObj(wrk, &req->busyobj);
+ VBO_DerefBusyObj(wrk, &bo);
AZ(req->obj);
http_Teardown(req->resp);
req->req_step = R_STP_RESTART;
@@ -120,14 +120,14 @@ cnt_stream(struct worker *wrk, struct req *req)
if (bo->state == BOS_FAILED) {
(void)HSH_Deref(&wrk->stats, NULL, &req->obj);
- VBO_DerefBusyObj(wrk, &req->busyobj);
+ VBO_DerefBusyObj(wrk, &bo);
req->err_code = 503;
req->req_step = R_STP_ERROR;
return (REQ_FSM_MORE);
}
- VBO_DerefBusyObj(wrk, &req->busyobj);
+ VBO_DerefBusyObj(wrk, &bo);
- AZ(req->busyobj);
+ AZ(bo);
RES_WriteObj(req);
@@ -170,11 +170,10 @@ cnt_deliver(struct worker *wrk, struct req *req)
req->res_mode = 0;
if (!req->disable_esi && req->obj->esidata != NULL) {
- AZ(req->busyobj);
/* In ESI mode, we can't know the aggregate length */
req->res_mode &= ~RES_LEN;
req->res_mode |= RES_ESI;
- } else if (req->busyobj == NULL) {
+ } else if (req->obj->objcore->busyobj == NULL) {
req->res_mode |= RES_LEN;
}
@@ -205,6 +204,7 @@ cnt_deliver(struct worker *wrk, struct req *req)
req->doclose = SC_TX_EOF;
}
}
+ VSLb(req->vsl, SLT_Debug, "RES_MODE %x", req->res_mode);
req->t_resp = W_TIM_real(wrk);
if (!(req->obj->objcore->flags & OC_F_PRIVATE)) {
@@ -220,21 +220,16 @@ cnt_deliver(struct worker *wrk, struct req *req)
VCL_deliver_method(req->vcl, wrk, req, NULL, req->http->ws);
+ while (req->obj->objcore->busyobj) {
+ VSLb(req->vsl, SLT_Debug, "HERE %s %d", __func__, __LINE__);
+ (void)usleep(10000);
+ }
+
+
/* Stop the insanity before it turns "Hotel California" on us */
if (req->restarts >= cache_param->max_restarts)
wrk->handling = VCL_RET_DELIVER;
- if (req->busyobj != NULL) {
- /* Don't stream if already finished */
- if (req->busyobj->state != BOS_FINISHED) {
- AN(req->busyobj->do_stream);
- req->req_step = R_STP_STREAM;
- return (REQ_FSM_MORE);
- }
- VBO_DerefBusyObj(wrk, &req->busyobj);
- }
- AZ(req->busyobj);
-
if (wrk->handling == VCL_RET_RESTART) {
(void)HSH_Deref(&wrk->stats, NULL, &req->obj);
AZ(req->obj);
@@ -281,11 +276,9 @@ cnt_error(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
AZ(req->objcore);
AZ(req->obj);
- AZ(req->busyobj);
req->acct_req.error++;
bo = VBO_GetBusyObj(wrk, req);
- req->busyobj = bo;
AZ(bo->stats);
bo->stats = &wrk->stats;
bo->fetch_objcore = HSH_Private(wrk);
@@ -301,8 +294,7 @@ cnt_error(struct worker *wrk, struct req *req)
bo->fetch_objcore = NULL;
http_Teardown(bo->beresp);
http_Teardown(bo->bereq);
- VBO_DerefBusyObj(wrk, &req->busyobj);
- AZ(req->busyobj);
+ VBO_DerefBusyObj(wrk, &bo);
return (REQ_FSM_DONE);
}
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
@@ -335,7 +327,7 @@ cnt_error(struct worker *wrk, struct req *req)
wrk->handling = VCL_RET_DELIVER;
if (wrk->handling == VCL_RET_RESTART) {
- VBO_DerefBusyObj(wrk, &req->busyobj);
+ VBO_DerefBusyObj(wrk, &bo);
HSH_Drop(wrk, &req->obj);
req->req_step = R_STP_RESTART;
return (REQ_FSM_MORE);
@@ -351,7 +343,7 @@ cnt_error(struct worker *wrk, struct req *req)
req->err_reason = NULL;
http_Teardown(bo->bereq);
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
- VBO_DerefBusyObj(wrk, &req->busyobj);
+ VBO_DerefBusyObj(wrk, &bo);
req->req_step = R_STP_DELIVER;
CHECK_OBJ_NOTNULL(req->obj, OBJECT_MAGIC);
return (REQ_FSM_MORE);
@@ -374,31 +366,26 @@ DOT fetch:err:s -> vcl_error
static enum req_fsm_nxt
cnt_fetch(struct worker *wrk, struct req *req)
{
- struct busyobj *bo;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
- bo = req->busyobj;
- CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
req->acct_req.fetch++;
- assert(bo->refcount > 0);
+ //assert(bo->refcount > 0);
(void)HTTP1_DiscardReqBody(req);
if (req->objcore->flags & OC_F_FAILED) {
- VBO_DerefBusyObj(wrk, &req->busyobj);
req->err_code = 503;
req->req_step = R_STP_ERROR;
req->objcore = NULL;
return (REQ_FSM_MORE);
}
- assert (bo->state >= BOS_FETCHING);
- req->err_code = bo->err_code;
- req->obj = bo->fetch_obj; // XXX: recnt ?
+ //assert (bo->state >= BOS_FETCHING);
+ req->obj = oc_getobj(&wrk->stats, req->objcore);
+ //assert(req->obj == bo->fetch_obj);
req->objcore = NULL;
- if (bo->state == BOS_FINISHED)
- VBO_DerefBusyObj(wrk, &req->busyobj);
+ req->err_code = req->obj->response;
assert(WRW_IsReleased(wrk));
req->req_step = R_STP_DELIVER;
return (REQ_FSM_MORE);
@@ -445,7 +432,6 @@ cnt_lookup(struct worker *wrk, struct req *req)
AZ(req->objcore);
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
- AZ(req->busyobj);
VRY_Prep(req);
@@ -486,7 +472,6 @@ cnt_lookup(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC);
AZ (oc->flags & OC_F_BUSY);
AZ(req->objcore);
- AZ(req->busyobj);
if (oc->flags & OC_F_PASS) {
/* Found a hit-for-pass */
@@ -513,7 +498,7 @@ cnt_lookup(struct worker *wrk, struct req *req)
switch (wrk->handling) {
case VCL_RET_DELIVER:
if (boc != NULL) {
- AZ(VBF_Fetch(wrk, req, boc, VBF_BACKGROUND));
+ VBF_Fetch(wrk, req, boc, VBF_BACKGROUND);
} else {
(void)HTTP1_DiscardReqBody(req);// XXX: handle err
}
@@ -575,7 +560,6 @@ cnt_miss(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
AZ(req->obj);
- AZ(req->busyobj);
VCL_miss_method(req->vcl, wrk, req, NULL, req->http->ws);
switch (wrk->handling) {
@@ -606,7 +590,7 @@ cnt_miss(struct worker *wrk, struct req *req)
wrk->stats.cache_miss++;
AN (req->objcore);
- req->busyobj = VBF_Fetch(wrk, req, req->objcore, VBF_NORMAL);
+ VBF_Fetch(wrk, req, req->objcore, VBF_NORMAL);
req->req_step = R_STP_FETCH;
return (REQ_FSM_MORE);
}
@@ -637,7 +621,6 @@ cnt_pass(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
AZ(req->objcore);
AZ(req->obj);
- AZ(req->busyobj);
VCL_pass_method(req->vcl, wrk, req, NULL, req->http->ws);
if (wrk->handling == VCL_RET_ERROR) {
@@ -652,7 +635,7 @@ cnt_pass(struct worker *wrk, struct req *req)
req->objcore = HSH_Private(wrk);
AN(req->objcore);
- req->busyobj = VBF_Fetch(wrk, req, req->objcore, VBF_PASS);
+ VBF_Fetch(wrk, req, req->objcore, VBF_PASS);
req->req_step = R_STP_FETCH;
return (REQ_FSM_MORE);
}
@@ -683,7 +666,6 @@ cnt_pipe(struct worker *wrk, struct req *req)
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
- AZ(req->busyobj);
req->acct_req.pipe++;
bo = VBO_GetBusyObj(wrk, req);
@@ -769,7 +751,6 @@ cnt_recv(struct worker *wrk, struct req *req)
AZ(req->objcore);
AZ(req->obj);
AZ(req->objcore);
- AZ(req->busyobj);
VSLb(req->vsl, SLT_ReqStart, "%s %s", req->sp->addr, req->sp->port);
@@ -862,7 +843,6 @@ cnt_purge(struct worker *wrk, struct req *req)
AZ(req->objcore);
CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC);
- AZ(req->busyobj);
VRY_Prep(req);
More information about the varnish-commit
mailing list