[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(&notify);
-	req->vdc->vai_hdl = ObjVAIinit(wrk, req->objcore, req->ws, dbg_vai_notify, &notify);
-	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, &notify, scaret)) {
+		dbg_vai_notify_fini(&notify);
+		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(&notify);
 		}
 		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(&notify);
-
-	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