static enum req_fsm_nxt cnt_fetch(struct worker *wrk, struct req *req) { CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC); AZ(req->obj); wrk->stats.s_fetch++; (void)HTTP1_DiscardReqBody(req); if (req->objcore->flags & OC_F_FAILED) { req->err_code = 503; req->req_step = R_STP_SYNTH; (void)HSH_DerefObjCore(&wrk->stats, &req->objcore); req->objcore = NULL; return (REQ_FSM_MORE); } req->obj = ObjGetObj(req->objcore, &wrk->stats); req->objcore = NULL; req->err_code = http_GetStatus(req->obj->http); req->req_step = R_STP_DELIVER; return (REQ_FSM_MORE); }
static enum req_fsm_nxt cnt_fetch(struct worker *wrk, struct req *req) { CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC); CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC); AZ(req->obj); req->acct_req.fetch++; (void)HTTP1_DiscardReqBody(req); if (req->objcore->flags & OC_F_FAILED) { req->err_code = 503; req->req_step = R_STP_ERROR; (void)HSH_DerefObjCore(&wrk->stats, &req->objcore); req->objcore = NULL; return (REQ_FSM_MORE); } req->obj = oc_getobj(&wrk->stats, req->objcore); req->objcore = NULL; req->err_code = req->obj->response; req->req_step = R_STP_DELIVER; return (REQ_FSM_MORE); }
static enum req_fsm_nxt cnt_lookup(struct worker *wrk, struct req *req) { struct objcore *oc, *boc; struct object *o; struct objhead *oh; enum lookup_e lr; int had_objhead = 0; CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC); CHECK_OBJ_NOTNULL(req, REQ_MAGIC); AZ(req->objcore); CHECK_OBJ_NOTNULL(req->vcl, VCL_CONF_MAGIC); VRY_Prep(req); AZ(req->objcore); if (req->hash_objhead) had_objhead = 1; lr = HSH_Lookup(req, &oc, &boc, req->esi_level == 0 ? 1 : 0, req->hash_always_miss ? 1 : 0 ); if (lr == HSH_BUSY) { /* * We lost the session to a busy object, disembark the * worker thread. We return to STP_LOOKUP when the busy * object has been unbusied, and still have the objhead * around to restart the lookup with. */ return (REQ_FSM_DISEMBARK); } if (had_objhead) VSLb_ts_req(req, "Waitinglist", W_TIM_real(wrk)); if (boc == NULL) { VRY_Finish(req, DISCARD); } else { AN(boc->flags & OC_F_BUSY); VRY_Finish(req, KEEP); } AZ(req->objcore); if (lr == HSH_MISS) { /* Found nothing */ VSLb(req->vsl, SLT_Debug, "XXXX MISS"); AZ(oc); AN(boc); AN(boc->flags & OC_F_BUSY); req->objcore = boc; req->req_step = R_STP_MISS; return (REQ_FSM_MORE); } CHECK_OBJ_NOTNULL(oc, OBJCORE_MAGIC); AZ(oc->flags & OC_F_BUSY); AZ(req->objcore); o = ObjGetObj(oc, &wrk->stats); CHECK_OBJ_NOTNULL(o, OBJECT_MAGIC); req->obj = o; if (oc->flags & OC_F_PASS) { /* Found a hit-for-pass */ VSLb(req->vsl, SLT_Debug, "XXXX HIT-FOR-PASS"); VSLb(req->vsl, SLT_HitPass, "%u", req->obj->vxid); AZ(boc); (void)HSH_DerefObj(&wrk->stats, &req->obj); req->objcore = NULL; wrk->stats.cache_hitpass++; req->req_step = R_STP_PASS; return (REQ_FSM_MORE); } oh = oc->objhead; CHECK_OBJ_NOTNULL(oh, OBJHEAD_MAGIC); VSLb(req->vsl, SLT_Hit, "%u", req->obj->vxid); VCL_hit_method(req->vcl, wrk, req, NULL, req->http->ws); switch (wrk->handling) { case VCL_RET_DELIVER: if (boc != NULL) { AZ(oc->flags & (OC_F_FAILED|OC_F_PASS)); AZ(oc->exp_flags & OC_EF_DYING); AZ(boc->busyobj); VBF_Fetch(wrk, req, boc, o, VBF_BACKGROUND); } else { (void)HTTP1_DiscardReqBody(req);// XXX: handle err } wrk->stats.cache_hit++; req->req_step = R_STP_DELIVER; return (REQ_FSM_MORE); case VCL_RET_FETCH: req->objcore = boc; if (req->objcore != NULL) req->req_step = R_STP_MISS; else { (void)HSH_DerefObj(&wrk->stats, &req->obj); /* * We don't have a busy object, so treat this * like a pass */ VSLb(req->vsl, SLT_VCL_Error, "vcl_hit{} returns fetch without busy object." " Doing pass."); req->req_step = R_STP_PASS; } return (REQ_FSM_MORE); case VCL_RET_RESTART: req->req_step = R_STP_RESTART; break; case VCL_RET_SYNTH: req->req_step = R_STP_SYNTH; break; case VCL_RET_PASS: wrk->stats.cache_hit++; req->req_step = R_STP_PASS; break; default: INCOMPL(); } /* Drop our object, we won't need it */ (void)HSH_DerefObj(&wrk->stats, &req->obj); req->objcore = NULL; if (boc != NULL) { (void)HSH_DerefObjCore(&wrk->stats, &boc); free(req->vary_b); req->vary_b = NULL; } return (REQ_FSM_MORE); }