r1918 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Tue Aug 21 20:57:14 CEST 2007


Author: phk
Date: 2007-08-21 20:57:14 +0200 (Tue, 21 Aug 2007)
New Revision: 1918

Modified:
   trunk/varnish-cache/bin/varnishd/cache.h
   trunk/varnish-cache/bin/varnishd/cache_backend.c
Log:
Move the connection (data structure pool) into the generic backend
handling.

Add more asserts.


Modified: trunk/varnish-cache/bin/varnishd/cache.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache.h	2007-08-21 16:48:00 UTC (rev 1917)
+++ trunk/varnish-cache/bin/varnishd/cache.h	2007-08-21 18:57:14 UTC (rev 1918)
@@ -355,6 +355,7 @@
 
 	TAILQ_ENTRY(backend)	list;
 	int			refcount;
+	pthread_mutex_t		mtx;
 
 	struct backend_method	*method;
 	void			*priv;
@@ -390,7 +391,10 @@
 void VBE_free_bereq(struct bereq *bereq);
 extern struct backendlist backendlist;
 void VBE_DropRef(struct backend *);
+void VBE_DropRefLocked(struct backend *);
 struct backend *VBE_NewBackend(struct backend_method *method);
+struct vbe_conn *VBE_NewConn(void);
+void VBE_ReleaseConn(struct vbe_conn *);
 
 /* cache_backend_simple.c */
 extern struct backend_method	backend_method_simple;

Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_backend.c	2007-08-21 16:48:00 UTC (rev 1917)
+++ trunk/varnish-cache/bin/varnishd/cache_backend.c	2007-08-21 18:57:14 UTC (rev 1918)
@@ -40,6 +40,7 @@
 #include "cache.h"
 
 static TAILQ_HEAD(,bereq) bereq_head = TAILQ_HEAD_INITIALIZER(bereq_head);
+static TAILQ_HEAD(,vbe_conn) vbe_head = TAILQ_HEAD_INITIALIZER(vbe_head);
 
 static MTX VBE_mtx;
 
@@ -90,6 +91,50 @@
 
 /*--------------------------------------------------------------------*/
 
+struct vbe_conn *
+VBE_NewConn(void)
+{
+	struct vbe_conn *vc;
+
+	vc = TAILQ_FIRST(&vbe_head);
+	if (vc != NULL) {
+		LOCK(&VBE_mtx);
+		vc = TAILQ_FIRST(&vbe_head);
+		if (vc != NULL) {
+			VSL_stats->backend_unused--;
+			TAILQ_REMOVE(&vbe_head, vc, list);
+		} else {
+			VSL_stats->n_vbe_conn++;
+		}
+		UNLOCK(&VBE_mtx);
+	}
+	if (vc != NULL)
+		return (vc);
+
+	vc = calloc(sizeof *vc, 1);
+	XXXAN(vc);
+	vc->magic = VBE_CONN_MAGIC;
+	vc->fd = -1;
+	return (vc);
+}
+
+/*--------------------------------------------------------------------*/
+
+void
+VBE_ReleaseConn(struct vbe_conn *vc)
+{
+
+	CHECK_OBJ_NOTNULL(vc, VBE_CONN_MAGIC);
+	assert(vc->backend == NULL);
+	assert(vc->fd < 0);
+	LOCK(&VBE_mtx);
+	TAILQ_INSERT_HEAD(&vbe_head, vc, list);
+	VSL_stats->backend_unused++;
+	UNLOCK(&VBE_mtx);
+}
+
+/*--------------------------------------------------------------------*/
+
 struct backend *
 VBE_NewBackend(struct backend_method *method)
 {
@@ -99,9 +144,13 @@
 	XXXAN(b);
 	b->magic = BACKEND_MAGIC;
 	b->method = method;
+
+	MTX_INIT(&b->mtx);
 	b->refcount = 1;
+
 	b->last_check = TIM_mono();
 	b->minute_limit = 1;
+
 	TAILQ_INSERT_TAIL(&backendlist, b, list);
 	return (b);
 }
@@ -109,26 +158,44 @@
 /*--------------------------------------------------------------------*/
 
 void
-VBE_DropRef(struct backend *b)
+VBE_DropRefLocked(struct backend *b)
 {
+	int i;
 
 	CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC);
 
-	b->refcount--;
-	if (b->refcount > 0)
+	i = --b->refcount;
+	if (i == 0)
+		TAILQ_REMOVE(&backendlist, b, list);
+	UNLOCK(&b->mtx);
+	if (i)
 		return;
-	TAILQ_REMOVE(&backendlist, b, list);
+	b->magic = 0;
 	b->method->cleanup(b);
 	free(b->vcl_name);
 	free(b);
 }
 
+void
+VBE_DropRef(struct backend *b)
+{
+
+	CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC);
+
+	LOCK(&b->mtx);
+	VBE_DropRefLocked(b);
+}
+
 /*--------------------------------------------------------------------*/
 
 struct vbe_conn *
 VBE_GetFd(struct sess *sp)
 {
 
+	CHECK_OBJ_NOTNULL(sp, SESS_MAGIC);
+	CHECK_OBJ_NOTNULL(sp->backend, BACKEND_MAGIC);
+	AN(sp->backend->method);
+	AN(sp->backend->method->getfd);
 	return(sp->backend->method->getfd(sp));
 }
 
@@ -137,8 +204,15 @@
 void
 VBE_ClosedFd(struct worker *w, struct vbe_conn *vc)
 {
+	struct backend *b;
 
-	vc->backend->method->close(w, vc);
+	CHECK_OBJ_NOTNULL(vc, VBE_CONN_MAGIC);
+	CHECK_OBJ_NOTNULL(vc->backend, BACKEND_MAGIC);
+	b = vc->backend;
+	AN(b->method);
+	AN(b->method->close);
+	b->method->close(w, vc);
+	CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC);
 }
 
 /* Recycle a connection ----------------------------------------------*/
@@ -146,8 +220,15 @@
 void
 VBE_RecycleFd(struct worker *w, struct vbe_conn *vc)
 {
+	struct backend *b;
 
-	vc->backend->method->recycle(w, vc);
+	CHECK_OBJ_NOTNULL(vc, VBE_CONN_MAGIC);
+	CHECK_OBJ_NOTNULL(vc->backend, BACKEND_MAGIC);
+	b = vc->backend;
+	AN(b->method);
+	AN(b->method->recycle);
+	b->method->recycle(w, vc);
+	CHECK_OBJ_NOTNULL(b, BACKEND_MAGIC);
 }
 
 /*--------------------------------------------------------------------*/




More information about the varnish-commit mailing list