r1809 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Tue Aug 7 12:27:35 CEST 2007


Author: phk
Date: 2007-08-07 12:27:34 +0200 (Tue, 07 Aug 2007)
New Revision: 1809

Modified:
   trunk/varnish-cache/bin/varnishd/cache_backend.c
Log:
Minimize a race when looking up addresses for backends.

The race is not closed however, proper locking needs to be thought out.

An XXX comment documents this for now.



Modified: trunk/varnish-cache/bin/varnishd/cache_backend.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_backend.c	2007-08-07 07:23:10 UTC (rev 1808)
+++ trunk/varnish-cache/bin/varnishd/cache_backend.c	2007-08-07 10:27:34 UTC (rev 1809)
@@ -116,20 +116,20 @@
 	return (vbc);
 }
 
-/*--------------------------------------------------------------------*/
+/*--------------------------------------------------------------------
+ * XXX: There is a race here, we need to lock the replacement of the
+ * XXX: resolved addresses, or some other thread might try to access
+ * XXX: them while/during/after we changed them.
+ * XXX: preferably, we should make a copy to the vbe while we hold a
+ * XXX: lock anyway.
+ */
 
 static void
 vbe_lookup(struct backend *bp)
 {
-	struct addrinfo *res, hint;
+	struct addrinfo *res, hint, *old;
 	int error;
 
-	if (bp->addr != NULL) {
-		freeaddrinfo(bp->addr);
-		bp->addr = NULL;
-		bp->last_addr = NULL;
-	}
-
 	memset(&hint, 0, sizeof hint);
 	hint.ai_family = PF_UNSPEC;
 	hint.ai_socktype = SOCK_STREAM;
@@ -144,8 +144,11 @@
 		printf("getaddrinfo: %s\n", gai_strerror(error)); /* XXX */
 		return;
 	}
+	old = bp->addr;
 	bp->last_addr = res;
 	bp->addr = res;
+	if (old != NULL)
+		freeaddrinfo(old);
 }
 
 /*--------------------------------------------------------------------*/




More information about the varnish-commit mailing list