[master] a6fafd2 One comment and N > 0 bugs from goal...
Poul-Henning Kamp
phk at varnish-cache.org
Fri May 24 16:24:23 CEST 2013
commit a6fafd240e6e25f67d52a453551e43a449d532a4
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date: Fri May 24 14:24:04 2013 +0000
One comment and N > 0 bugs from goal...
diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 82dc709..77ef0d5 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -814,7 +814,7 @@ int EXP_NukeOne(struct busyobj *, struct lru *lru);
void EXP_NukeLRU(struct worker *wrk, struct vsl_log *vsl, struct lru *lru);
/* cache_fetch.c */
-int VBF_Fetch(struct worker *wrk, struct req *req);
+void VBF_Fetch(struct worker *wrk, struct req *req);
struct storage *VBF_GetStorage(struct busyobj *, ssize_t sz);
int VBF_Error(struct busyobj *, const char *error);
int VBF_Error2(struct busyobj *, const char *error, const char *more);
diff --git a/bin/varnishd/cache/cache_fetch.c b/bin/varnishd/cache/cache_fetch.c
index 143a929..0aa85fe 100644
--- a/bin/varnishd/cache/cache_fetch.c
+++ b/bin/varnishd/cache/cache_fetch.c
@@ -772,38 +772,49 @@ vbf_proc_resp(struct worker *wrk, struct busyobj *bo)
}
-int
-VBF_Fetch(struct worker *wrk, struct req *req)
+struct vbf_secret_handshake {
+ unsigned magic;
+#define VBF_SECRET_HANDSHAKE_MAGIC 0x98c95172
+ struct busyobj *bo;
+ struct req **reqp;
+};
+
+static void
+vbf_fetch_thread(struct worker *wrk, void *priv)
{
+ struct vbf_secret_handshake *vsh;
+ struct busyobj *bo;
+ struct req *req;
+ int i;
struct http *hp, *hp2;
char *b;
uint16_t nhttp;
unsigned l;
struct vsb *vary = NULL;
int varyl = 0;
- struct busyobj *bo;
struct object *obj;
- int i;
+
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ CAST_OBJ_NOTNULL(vsh, priv, VBF_SECRET_HANDSHAKE_MAGIC);
+ AN(vsh->reqp);
+ req = *vsh->reqp;
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
- CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
- bo = req->busyobj;
- CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
- assert(bo->refcount == 2);
- CHECK_OBJ_NOTNULL(bo->vcl, VCL_CONF_MAGIC);
-
- bo->fetch_objcore = req->objcore;
- req->objcore = NULL;
+ bo = vsh->bo;
vbf_make_bereq(wrk, req, bo);
xxxassert (wrk->handling == VCL_RET_FETCH);
HTTP_Setup(bo->beresp, bo->ws, bo->vsl, HTTP_Beresp);
- if (!bo->do_pass)
+ if (!bo->do_pass) {
+ AN(req);
+ AN(vsh);
req = NULL;
+ *vsh->reqp = NULL;
+ vsh = NULL;
+ }
i = vbf_fetch_hdr(wrk, bo, req);
/*
@@ -816,9 +827,15 @@ VBF_Fetch(struct worker *wrk, struct req *req)
i = vbf_fetch_hdr(wrk, bo, req);
}
- if (bo->do_pass)
+ if (bo->do_pass) {
+ AN(req);
+ AN(vsh);
req = NULL;
+ *vsh->reqp = NULL;
+ vsh = NULL;
+ }
AZ(req);
+ AZ(vsh);
if (i) {
wrk->handling = VCL_RET_ERROR;
@@ -843,11 +860,12 @@ VBF_Fetch(struct worker *wrk, struct req *req)
assert(bo->refcount == 2);
bo->storage_hint = NULL;
bo->director = NULL;
- VBO_DerefBusyObj(wrk, &bo);
switch (wrk->handling) {
case VCL_RET_ERROR:
- return (-1);
+ bo->state = BOS_FAILED;
+ VBO_DerefBusyObj(wrk, &bo);
+ return;
case VCL_RET_RESTART:
INCOMPL();
default:
@@ -878,7 +896,8 @@ VBF_Fetch(struct worker *wrk, struct req *req)
AZ(HSH_Deref(&wrk->stats, bo->fetch_objcore, NULL));
bo->fetch_objcore = NULL;
VDI_CloseFd(&bo->vbc);
- return (-1);
+ bo->state = BOS_FAILED;
+ return;
} else
/* No vary */
AZ(vary);
@@ -912,7 +931,8 @@ VBF_Fetch(struct worker *wrk, struct req *req)
AZ(HSH_Deref(&wrk->stats, bo->fetch_objcore, NULL));
bo->fetch_objcore = NULL;
VDI_CloseFd(&bo->vbc);
- return (-1);
+ bo->state = BOS_FAILED;
+ return;
}
CHECK_OBJ_NOTNULL(obj, OBJECT_MAGIC);
@@ -974,11 +994,43 @@ VBF_Fetch(struct worker *wrk, struct req *req)
if (bo->state == BOS_FAILED) {
/* handle early failures */
(void)HSH_Deref(&wrk->stats, NULL, &obj);
- return (-1);
+ return;
}
assert(WRW_IsReleased(wrk));
- return (0);
+}
+
+void
+VBF_Fetch(struct worker *wrk, struct req *req)
+{
+ struct vbf_secret_handshake vsh;
+ struct busyobj *bo;
+
+ CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
+ CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
+ CHECK_OBJ_NOTNULL(req->objcore, OBJCORE_MAGIC);
+
+ bo = req->busyobj;
+ CHECK_OBJ_NOTNULL(bo, BUSYOBJ_MAGIC);
+ assert(bo->refcount == 2);
+ CHECK_OBJ_NOTNULL(bo->vcl, VCL_CONF_MAGIC);
+
+ bo->fetch_objcore = req->objcore;
+ req->objcore = NULL;
+
+ vsh.magic = VBF_SECRET_HANDSHAKE_MAGIC;
+ vsh.bo = bo;
+ vsh.reqp = &req;
+
+ bo->fetch_task.priv = &vsh;
+ bo->fetch_task.func = vbf_fetch_thread;
+
+ // if (Pool_Task(wrk->pool, &bo->fetch_task, POOL_QUEUE_FRONT))
+ vbf_fetch_thread(wrk, &vsh);
+ while (req != NULL) {
+ printf("XXX\n");
+ (void)usleep(100000);
+ }
}
/*--------------------------------------------------------------------
diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 1e55fcd..5ee6d14 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -351,7 +351,6 @@ DOT fetchbody:out -> prepresp [style=bold,color=blue]
static enum req_fsm_nxt
cnt_fetch(struct worker *wrk, struct req *req)
{
- int i;
CHECK_OBJ_NOTNULL(wrk, WORKER_MAGIC);
CHECK_OBJ_NOTNULL(req, REQ_MAGIC);
@@ -359,17 +358,21 @@ cnt_fetch(struct worker *wrk, struct req *req)
AN(req->busyobj);
AN(req->objcore);
req->acct_req.fetch++;
- i = VBF_Fetch(wrk, req);
+ VBF_Fetch(wrk, req);
AN(req->busyobj);
AZ(req->objcore);
assert(req->busyobj->refcount > 0);
(void)HTTP1_DiscardReqBody(req);
- if (i < 0) {
+ while (req->busyobj->state < BOS_FAILED) {
+ printf("YYY\n");
+ (void)usleep(100000);
+ }
+ if (req->busyobj->state == BOS_FAILED) {
VBO_DerefBusyObj(wrk, &req->busyobj);
req->err_code = 503;
req->req_step = R_STP_ERROR;
} else {
- AZ(i);
+ assert (req->busyobj->state == BOS_FINISHED);
req->err_code = req->busyobj->err_code;
req->obj = req->busyobj->fetch_obj;
VBO_DerefBusyObj(wrk, &req->busyobj);
More information about the varnish-commit
mailing list