[master] 95dc46857 cache_deliver_proc: Wrap VAI management for VDPIO
Nils Goroll
nils.goroll at uplex.de
Fri Jul 4 17:04:05 UTC 2025
commit 95dc46857a2120976918c4fcc0d5d4612735860a
Author: Nils Goroll <nils.goroll at uplex.de>
Date: Tue Mar 4 12:03:34 2025 +0100
cache_deliver_proc: Wrap VAI management for VDPIO
Transports should not need to talk to the VAI Object interface directly,
because its state is kept in the vdp_ctx and the lease interface is already
wrapped through vdpio_pull().
So we add wrappers which manage vdc->vai_hdl and vdc->scaret: VDPIO_Init(),
VDPIO_Return() and VDPIO_Fini()
diff --git a/bin/varnishd/cache/cache_deliver_proc.c b/bin/varnishd/cache/cache_deliver_proc.c
index 037aeda49..36fb20cbf 100644
--- a/bin/varnishd/cache/cache_deliver_proc.c
+++ b/bin/varnishd/cache/cache_deliver_proc.c
@@ -384,6 +384,52 @@ VDPIO_Close(struct vdp_ctx *vdc, struct objcore *oc, struct boc *boc)
return (rv);
}
+/*
+ * ============================================================
+ * VDPIO helpers: VAI management
+ *
+ * Transports should not need to talk to the VAI Object interface directly,
+ * because its state is kept in the vdp_ctx
+ *
+ * So we wrap init, return and fini
+ */
+
+// return true if error
+int
+VDPIO_Init(struct vdp_ctx *vdc, struct objcore *oc, struct ws *ws,
+ vai_notify_cb *notify_cb, void *notify_priv, struct vscaret *scaret)
+{
+ CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
+ VSCARET_CHECK_NOTNULL(scaret);
+ AN(scaret->capacity);
+ AZ(scaret->used);
+
+ AZ(vdc->vai_hdl);
+ vdc->vai_hdl = ObjVAIinit(vdc->wrk, oc, ws, notify_cb, notify_priv);
+ if (vdc->vai_hdl == NULL)
+ return (1);
+ vdc->scaret = scaret;
+ return (0);
+}
+
+// return leases stashed in scaret
+void
+VDPIO_Return(const struct vdp_ctx *vdc)
+{
+ CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
+
+ ObjVAIreturn(vdc->wrk, vdc->vai_hdl, vdc->scaret);
+}
+
+void
+VDPIO_Fini(struct vdp_ctx *vdc)
+{
+ CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
+
+ VDPIO_Return(vdc);
+ ObjVAIfini(vdc->wrk, &vdc->vai_hdl);
+}
+
/*--------------------------------------------------------------------*/
int v_matchproto_(objiterate_f)
VDP_ObjIterate(void *priv, unsigned flush, const void *ptr, ssize_t len)
diff --git a/bin/varnishd/cache/cache_filter.h b/bin/varnishd/cache/cache_filter.h
index 4e1abe93e..a24d669fc 100644
--- a/bin/varnishd/cache/cache_filter.h
+++ b/bin/varnishd/cache/cache_filter.h
@@ -318,6 +318,11 @@ vdpio_consolidate_vscarab(const struct vdp_ctx *vdc, struct vscarab *scarab)
scarab->used = f - scarab->s;
}
+// Lifecycle management in cache_deliver_proc.c
+int VDPIO_Init(struct vdp_ctx *vdc, struct objcore *oc, struct ws *ws,
+ vai_notify_cb *notify_cb, void *notify_priv, struct vscaret *scaret);
+void VDPIO_Return(const struct vdp_ctx *vdc);
+void VDPIO_Fini(struct vdp_ctx *vdc);
void v_deprecated_ VRT_AddVDP(VRT_CTX, const struct vdp *);
void v_deprecated_ VRT_RemoveVDP(VRT_CTX, const struct vdp *);
diff --git a/vmod/vmod_debug_transport_vai.c b/vmod/vmod_debug_transport_vai.c
index 3ca5496b3..0dfd32a06 100644
--- a/vmod/vmod_debug_transport_vai.c
+++ b/vmod/vmod_debug_transport_vai.c
@@ -314,6 +314,14 @@ dbg_vai_notify_wait(struct dbg_vai_notify *sn)
AZ(pthread_mutex_unlock(&sn->mtx));
}
+static void
+dbg_vai_lease_done(struct worker *wrk, struct req *req)
+{
+ VSLb(req->vsl, SLT_Debug, "w=%p resuming http1_req", wrk);
+ wrk->task->func = hack_http1_req;
+ wrk->task->priv = req;
+}
+
static void v_matchproto_(task_func_t)
dbg_vai_lease(struct worker *wrk, void *arg)
{
@@ -339,18 +347,22 @@ dbg_vai_lease(struct worker *wrk, void *arg)
req->vdc->retval = 0;
assert(cap > 0);
+ VSCARAB_LOCAL(scarab, cap);
+ VSCARET_LOCAL(scaret, cap);
+
chunked = http_GetHdr(req->resp, H_Transfer_Encoding, &p) && strcmp(p, "chunked") == 0;
if (chunked)
V1L_Chunked(v1l);
struct dbg_vai_notify notify;
dbg_vai_notify_init(¬ify);
- req->vdc->vai_hdl = ObjVAIinit(wrk, req->objcore, req->ws, dbg_vai_notify, ¬ify);
- AN(req->vdc->vai_hdl);
- VSCARAB_LOCAL(scarab, cap);
- VSCARET_LOCAL(scaret, cap);
- req->vdc->scaret = scaret;
+ if (VDPIO_Init(req->vdc, req->objcore, req->ws, dbg_vai_notify, ¬ify, scaret)) {
+ dbg_vai_notify_fini(¬ify);
+ dbg_vai_deliver_finish(req, &v1l, 1);
+ dbg_vai_lease_done(wrk, req);
+ return;
+ }
err = 0;
do {
@@ -361,7 +373,7 @@ dbg_vai_lease(struct worker *wrk, void *arg)
vdpio_return_vscarab(req->vdc, scarab);
if (r == -ENOBUFS || r == -EAGAIN) {
- ObjVAIreturn(wrk, req->vdc->vai_hdl, scaret);
+ VDPIO_Return(req->vdc);
dbg_vai_notify_wait(¬ify);
}
else if (r < 0) {
@@ -370,19 +382,12 @@ dbg_vai_lease(struct worker *wrk, void *arg)
}
} while ((flags & VSCARAB_F_END) == 0);
- vdpio_return_vscarab(req->vdc, scarab);
- ObjVAIreturn(wrk, req->vdc->vai_hdl, scaret);
-
- req->vdc->scaret = NULL;
if (!err && chunked)
V1L_EndChunk(v1l);
dbg_vai_deliver_finish(req, &v1l, err);
- ObjVAIfini(wrk, &req->vdc->vai_hdl);
+ VDPIO_Fini(req->vdc);
dbg_vai_notify_fini(¬ify);
-
- VSLb(req->vsl, SLT_Debug, "w=%p resuming http1_req", wrk);
- wrk->task->func = hack_http1_req;
- wrk->task->priv = req;
+ dbg_vai_lease_done(wrk, req);
}
static void
More information about the varnish-commit
mailing list