r987 - in trunk/varnish-cache: bin/varnishd include

phk at projects.linpro.no phk at projects.linpro.no
Fri Sep 15 11:43:56 CEST 2006


Author: phk
Date: 2006-09-15 11:43:56 +0200 (Fri, 15 Sep 2006)
New Revision: 987

Modified:
   trunk/varnish-cache/bin/varnishd/cache_center.c
   trunk/varnish-cache/bin/varnishd/heritage.h
   trunk/varnish-cache/bin/varnishd/mgt_param.c
   trunk/varnish-cache/include/stat_field.h
Log:
Try to avoid sending EOF'ed or ready sessions to the herder.


Modified: trunk/varnish-cache/bin/varnishd/cache_center.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/cache_center.c	2006-09-15 08:48:13 UTC (rev 986)
+++ trunk/varnish-cache/bin/varnishd/cache_center.c	2006-09-15 09:43:56 UTC (rev 987)
@@ -33,8 +33,10 @@
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
+#include <poll.h>
 
 #include "shmlog.h"
+#include "heritage.h"
 #include "vcl.h"
 #include "cache.h"
 
@@ -122,6 +124,8 @@
 cnt_done(struct sess *sp)
 {
 	double dh, dp, da;
+	struct pollfd fds[1];
+	int i;
 
 	AZ(sp->obj);
 	AZ(sp->vbc);
@@ -150,25 +154,47 @@
 	sp->xid = 0;
 	sp->t_open = sp->t_end;
 	SES_Charge(sp);
-	if (sp->fd > 0) {
+	if (sp->fd < 0) {
+		VSL_stats->sess_closed++;
+		sp->wrk->idle = sp->t_open.tv_sec;
+		vca_return_session(sp);
+		return (1);
+	}
+
+	if (http_RecvPrepAgain(sp->http)) {
+		VSL_stats->sess_pipeline++;
 		VSL(SLT_SessionReuse, sp->fd, "%s %s", sp->addr, sp->port);
-
-		/* If we have anything in the input buffer, start over */
-		/*
-		 * XXX: we might even want to do a short timed read (poll)
-		 * XXX: here to see if something is pending in the kernel
-		 */
-		
-		if (http_RecvPrepAgain(sp->http)) {
-			sp->step = STP_RECV;
-			return (0);
-		}
-		if (sp->http->t < sp->http->v) {
-			sp->step = STP_AGAIN;
-			return (0);
-		}
+		sp->step = STP_RECV;
+		return (0);
 	}
-
+	if (sp->http->t < sp->http->v) {
+		VSL_stats->sess_readahead++;
+		VSL(SLT_SessionReuse, sp->fd, "%s %s", sp->addr, sp->port);
+		sp->step = STP_AGAIN;
+		return (0);
+	}
+	if (params->session_grace == 0) {
+		VSL_stats->sess_herd++;
+		sp->wrk->idle = sp->t_open.tv_sec;
+		vca_return_session(sp);
+		return (1);
+	}
+	fds[0].fd = sp->fd;
+	fds[0].events = POLLIN;
+	fds[0].revents = 0;
+	i = poll(fds, 1, params->session_grace);
+	if (i == 1 && (fds[0].revents & POLLHUP)) {
+		VSL_stats->sess_EOF++;
+		vca_close_session(sp, "EOF");
+	} else if (i == 1 && (fds[0].revents & POLLIN)) {
+		VSL_stats->sess_ready++;
+		VSL(SLT_SessionReuse, sp->fd, "%s %s",
+		    sp->addr, sp->port);
+		sp->step = STP_AGAIN;
+		return (0);
+	} else {
+		VSL_stats->sess_herd++;
+	}
 	sp->wrk->idle = sp->t_open.tv_sec;
 	vca_return_session(sp);
 	return (1);

Modified: trunk/varnish-cache/bin/varnishd/heritage.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/heritage.h	2006-09-15 08:48:13 UTC (rev 986)
+++ trunk/varnish-cache/bin/varnishd/heritage.h	2006-09-15 09:43:56 UTC (rev 987)
@@ -53,6 +53,9 @@
 
 	/* Sendfile object minimum size */
 	unsigned		sendfile_threshold;
+
+	/* Session dispostion grace period */
+	unsigned		session_grace;
 };
 
 extern struct params *params;

Modified: trunk/varnish-cache/bin/varnishd/mgt_param.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_param.c	2006-09-15 08:48:13 UTC (rev 986)
+++ trunk/varnish-cache/bin/varnishd/mgt_param.c	2006-09-15 09:43:56 UTC (rev 987)
@@ -169,6 +169,28 @@
 /*--------------------------------------------------------------------*/
 
 static void
+tweak_session_grace(struct cli *cli, struct parspec *par, const char *arg)
+{
+	unsigned u;
+
+	(void)par;
+	if (arg != NULL) {
+		u = strtoul(arg, NULL, 0);
+		if (u == 0) {
+			cli_out(cli, "Timeout must be greater than zero\n");
+			cli_result(cli, CLIS_PARAM);
+			return;
+		}
+		params->session_grace = u;
+	}
+	if (cli == NULL)
+		return;
+	cli_out(cli, "%u [milliseconds]\n", params->session_grace);
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
 tweak_auto_restart(struct cli *cli, struct parspec *par, const char *arg)
 {
 	unsigned u;
@@ -301,6 +323,10 @@
 		"The minimum size of objects transmitted with sendfile.\n"
 		"Default is 8192 bytes.", "8192" },
 #endif /* HAVE_SENDFILE */
+	{ "session_grace", tweak_session_grace,
+		"How long a workerthread waits for a new request to arrive "
+		"before sending the session to the herder.\n"
+		"Default is 10 msec.", "10" },
 	{ NULL, NULL, NULL }
 };
 

Modified: trunk/varnish-cache/include/stat_field.h
===================================================================
--- trunk/varnish-cache/include/stat_field.h	2006-09-15 08:48:13 UTC (rev 986)
+++ trunk/varnish-cache/include/stat_field.h	2006-09-15 09:43:56 UTC (rev 987)
@@ -43,3 +43,10 @@
 MAC_STAT(s_fetch,		uint64_t, "u", "Total fetch")
 MAC_STAT(s_hdrbytes,		uint64_t, "u", "Total header bytes")
 MAC_STAT(s_bodybytes,		uint64_t, "u", "Total body bytes")
+
+MAC_STAT(sess_closed,		uint64_t, "u", "Session Closed")
+MAC_STAT(sess_pipeline,		uint64_t, "u", "Session Pipeline")
+MAC_STAT(sess_readahead,	uint64_t, "u", "Session Read Ahead")
+MAC_STAT(sess_EOF,		uint64_t, "u", "Session EOF")
+MAC_STAT(sess_ready,		uint64_t, "u", "Session Ready")
+MAC_STAT(sess_herd,		uint64_t, "u", "Session herd")




More information about the varnish-commit mailing list