r2659 - trunk/varnish-cache/bin/varnishd

phk at projects.linpro.no phk at projects.linpro.no
Mon Jun 9 15:35:37 CEST 2008


Author: phk
Date: 2008-06-09 15:35:35 +0200 (Mon, 09 Jun 2008)
New Revision: 2659

Modified:
   trunk/varnish-cache/bin/varnishd/cache.h
   trunk/varnish-cache/bin/varnishd/cache_acceptor.c
   trunk/varnish-cache/bin/varnishd/heritage.h
   trunk/varnish-cache/bin/varnishd/mgt_child.c
   trunk/varnish-cache/bin/varnishd/mgt_param.c
Log:
Slight backtracking:  Store the specified socket name in the listen socket
structure, instead of whatever we actually bound to.  It is more informative
and intuitive.

Report the listen socket spec in the SessionOpen shm record.

Close listen sockets as soon as we have forked the child, this eliminated
a fd-leak when a socket was eliminated from listen_address while the child
ran.

Fix various potential problems related to not being able to bind to one
or more listen addresses.



Modified: trunk/varnish-cache/bin/varnishd/cache.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache.h	2008-06-09 13:11:45 UTC (rev 2658)
+++ trunk/varnish-cache/bin/varnishd/cache.h	2008-06-09 13:35:35 UTC (rev 2659)
@@ -319,6 +319,7 @@
 	socklen_t		mysockaddrlen;
 	struct sockaddr		*sockaddr;
 	struct sockaddr		*mysockaddr;
+	struct listen_sock	*mylsock;
 
 	/* formatted ascii client address */
 	char			*addr;

Modified: trunk/varnish-cache/bin/varnishd/cache_acceptor.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_acceptor.c	2008-06-09 13:11:45 UTC (rev 2658)
+++ trunk/varnish-cache/bin/varnishd/cache_acceptor.c	2008-06-09 13:35:35 UTC (rev 2659)
@@ -119,7 +119,8 @@
 	    addr, sizeof addr, port, sizeof port);
 	sp->addr = WS_Dup(sp->ws, addr);
 	sp->port = WS_Dup(sp->ws, port);
-	VSL(SLT_SessionOpen, sp->fd, "%s %s", sp->addr, sp->port);
+	VSL(SLT_SessionOpen, sp->fd, "%s %s %s",
+	    sp->addr, sp->port, sp->mylsock->name);
 	sp->acct.first = sp->t_open;
 	if (need_test)
 		sock_test(sp->fd);
@@ -194,16 +195,19 @@
 #endif
 		i = poll(pfd, heritage.nsocks, 1000);
 		now = TIM_real();
-		for (u = 0; u < heritage.nsocks; u++) {
-			if (pfd[u].revents == 0)
+		u = 0;
+		VTAILQ_FOREACH(ls, &heritage.socks, list) {
+			if (ls->sock < 0)
 				continue;
+			if (pfd[u++].revents == 0)
+				continue;
 			VSL_stats->client_conn++;
 			l = sizeof addr_s;
 			addr = (void*)&addr_s;
-			i = accept(pfd[u].fd, addr, &l);
+			i = accept(ls->sock, addr, &l);
 			if (i < 0) {
 				if (errno != EAGAIN && errno != ECONNABORTED) {
-					VSL(SLT_Debug, pfd[u].fd,
+					VSL(SLT_Debug, ls->sock,
 					    "Accept failed errno=%d", errno);
 					/* XXX: stats ? */
 				}
@@ -215,6 +219,7 @@
 			sp->fd = i;
 			sp->id = i;
 			sp->t_open = now;
+			sp->mylsock = ls;
 
 			sp->step = STP_FIRST;
 			WRK_QueueSession(sp);

Modified: trunk/varnish-cache/bin/varnishd/heritage.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/heritage.h	2008-06-09 13:11:45 UTC (rev 2658)
+++ trunk/varnish-cache/bin/varnishd/heritage.h	2008-06-09 13:35:35 UTC (rev 2659)
@@ -38,8 +38,7 @@
 struct listen_sock {
 	VTAILQ_ENTRY(listen_sock)	list;
 	int				sock;
-	char				*hname;
-	char				*pname;
+	char				*name;
 	struct vss_addr			*addr;
 };
 

Modified: trunk/varnish-cache/bin/varnishd/mgt_child.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_child.c	2008-06-09 13:11:45 UTC (rev 2658)
+++ trunk/varnish-cache/bin/varnishd/mgt_child.c	2008-06-09 13:35:35 UTC (rev 2659)
@@ -138,8 +138,6 @@
 {
 	struct listen_sock *ls, *ls2;
 	int good = 0;
-	char hbuf[TCP_ADDRBUFSIZE];
-	char pbuf[TCP_PORTBUFSIZE];
 
 	VTAILQ_FOREACH_SAFE(ls, &heritage.socks, list, ls2) {
 		if (ls->sock >= 0) {
@@ -150,9 +148,6 @@
 		if (ls->sock < 0) 
 			continue;
 
-		TCP_myname(ls->sock, hbuf, sizeof hbuf, pbuf, sizeof pbuf);
-		REPLACE(ls->hname, hbuf);
-		REPLACE(ls->pname, pbuf);
 		/*
 		 * Set nonblocking mode to avoid a race where a client
 		 * closes before we call accept(2) and nobody else are in
@@ -179,8 +174,6 @@
 			continue;
 		AZ(close(ls->sock));
 		ls->sock = -1;
-		REPLACE(ls->hname, NULL);
-		REPLACE(ls->pname, NULL);
 	}
 }
 
@@ -213,6 +206,7 @@
 		exit(1);
 	}
 	if (pid == 0) {
+		/* XXX: We should close things like syslog & telnet sockets */
 		if (geteuid() == 0) {
 			XXXAZ(setgid(params->gid));
 			XXXAZ(setuid(params->uid));
@@ -240,6 +234,8 @@
 
 	fprintf(stderr, "start child pid %jd\n", (intmax_t)pid);
 
+	close_sockets();
+
 	AZ(close(child_fds[1]));
 	child_fds[1] = -1;
 
@@ -292,7 +288,6 @@
 	if (child_state != CH_RUNNING)
 		return;
 
-	close_sockets();
 	child_state = CH_STOPPING;
 
 	if (ev_poker != NULL) {
@@ -365,7 +360,6 @@
 	if (child_state == CH_DIED && params->auto_restart)
 		start_child();
 	else if (child_state == CH_DIED) {
-		close_sockets();
 		child_state = CH_STOPPED;
 	} else if (child_state == CH_STOPPING)
 		child_state = CH_STOPPED;

Modified: trunk/varnish-cache/bin/varnishd/mgt_param.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_param.c	2008-06-09 13:11:45 UTC (rev 2658)
+++ trunk/varnish-cache/bin/varnishd/mgt_param.c	2008-06-09 13:35:35 UTC (rev 2659)
@@ -299,6 +299,7 @@
 
 	VTAILQ_FOREACH_SAFE(ls, lsh, list, ls2) {
 		VTAILQ_REMOVE(lsh, ls, list);
+		free(ls->name);
 		free(ls->addr);
 		free(ls);
 	}
@@ -359,6 +360,8 @@
 			AN(ls);
 			ls->sock = -1;
 			ls->addr = ta[j];
+			ls->name = strdup(av[i]);
+			AN(ls->name);
 			VTAILQ_INSERT_TAIL(&lsh, ls, list);
 		}
 		free(ta);




More information about the varnish-commit mailing list