r4797 - in trunk/varnish-cache/bin: varnishd varnishtest

phk at varnish-cache.org phk at varnish-cache.org
Mon May 17 10:48:29 CEST 2010


Author: phk
Date: 2010-05-17 10:48:28 +0200 (Mon, 17 May 2010)
New Revision: 4797

Modified:
   trunk/varnish-cache/bin/varnishd/heritage.h
   trunk/varnish-cache/bin/varnishd/mgt_shmem.c
   trunk/varnish-cache/bin/varnishtest/vtc_varnish.c
Log:
Move vsl handles out of heritage, they do no good there.

Change -l argument processing, to take up to three parts:

	-l<shmlog>,<space>,<fill>

<shmlog> is size of space for VSL records.
	default is 80m

<space> is size of space for other allocations (more later)
	default is 1m

<fill> is '+' or '-' to control preallocation of the shmfile,
	default to on (+), which reduces risk of fragmentation.



Modified: trunk/varnish-cache/bin/varnishd/heritage.h
===================================================================
--- trunk/varnish-cache/bin/varnishd/heritage.h	2010-05-17 08:40:08 UTC (rev 4796)
+++ trunk/varnish-cache/bin/varnishd/heritage.h	2010-05-17 08:48:28 UTC (rev 4797)
@@ -55,10 +55,6 @@
 	struct listen_sock_head		socks;
 	unsigned			nsocks;
 
-	/* Share memory log fd and size (incl header) */
-	int				vsl_fd;
-	unsigned			vsl_size;
-
 	/* Hash method */
 	struct hash_slinger		*hash;
 

Modified: trunk/varnish-cache/bin/varnishd/mgt_shmem.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_shmem.c	2010-05-17 08:40:08 UTC (rev 4796)
+++ trunk/varnish-cache/bin/varnishd/mgt_shmem.c	2010-05-17 08:48:28 UTC (rev 4797)
@@ -56,6 +56,8 @@
 struct shmloghead *loghead;
 unsigned char *logstart;
 
+static int vsl_fd = -1;
+static unsigned vsl_size;
 
 /*--------------------------------------------------------------------*/
 
@@ -95,19 +97,21 @@
 	}
 
 	/* XXX more checks */
-	heritage.vsl_size = slh.size + slh.start;
+	vsl_size = slh.size + slh.start;
 	return (1);
 }
 
 static void
-vsl_buildnew(const char *fn, unsigned size)
+vsl_buildnew(const char *fn, unsigned size, int fill)
 {
 	struct shmloghead slh;
 	int i;
+	unsigned u;
+	char buf[64*1024];
 
 	(void)unlink(fn);
-	heritage.vsl_fd = open(fn, O_RDWR | O_CREAT | O_EXCL, 0644);
-	if (heritage.vsl_fd < 0) {
+	vsl_fd = open(fn, O_RDWR | O_CREAT | O_EXCL, 0644);
+	if (vsl_fd < 0) {
 		fprintf(stderr, "Could not open %s: %s\n",
 		    fn, strerror(errno));
 		exit (1);
@@ -119,48 +123,108 @@
 	slh.size = size;
 	slh.ptr = 0;
 	slh.start = sizeof slh + sizeof *params;
-	i = write(heritage.vsl_fd, &slh, sizeof slh);
+	i = write(vsl_fd, &slh, sizeof slh);
 	xxxassert(i == sizeof slh);
-	heritage.vsl_size = slh.start + size;
-	AZ(ftruncate(heritage.vsl_fd, (off_t)heritage.vsl_size));
+	vsl_size = slh.start + size;
+
+	if (fill) {
+		memset(buf, 0, sizeof buf);
+		for (u = sizeof slh; u < size; ) {
+			i = write(vsl_fd, buf, sizeof buf);
+			if (i <= 0) {
+				fprintf(stderr, "Write error %s: %s\n",
+				    fn, strerror(errno));
+				exit (1);
+			}
+			u += i;
+		}
+	}
+
+	AZ(ftruncate(vsl_fd, (off_t)vsl_size));
 }
 
 void
 mgt_SHM_Init(const char *fn, const char *l_arg)
 {
-	int i;
+	int i, fill;
 	struct params *pp;
-	const char *arg_default = "80m";
 	const char *q;
-	uintmax_t size;
+	uintmax_t size, s1, s2;
+	char **av, **ap;
 
 	if (l_arg == NULL)
-		l_arg = arg_default;
+		l_arg = "";
 
-	q = str2bytes(l_arg, &size, 0);
-	if (q != NULL) {
-		fprintf(stderr,  "Parameter error:\n");
-		fprintf(stderr, "\t-l ...:  %s\n", q);
-		exit (1);
+	av = ParseArgv(l_arg, ARGV_COMMA);
+	AN(av);
+	if (av[0] != NULL) 
+		ARGV_ERR("\t-l ...: %s", av[0]);
+
+	printf("<%s> <%s> <%s>\n", av[1], av[2], av[3]);
+
+	ap = av + 1;
+
+	/* Size of SHMLOG */
+	if (*ap != NULL && **ap != '\0') {
+		q = str2bytes(*ap, &s1, 0);
+		if (q != NULL)
+			ARGV_ERR("\t-l[1] ...:  %s\n", q);
+	} else {
+		s1 = 80 * 1024 * 1024;
 	}
+	if (*ap != NULL)
+		ap++;
 
+	/* Size of space for other stuff */
+	if (*ap != NULL && **ap != '\0') {
+		q = str2bytes(*ap, &s2, 0);
+		if (q != NULL)
+			ARGV_ERR("\t-l[2] ...:  %s\n", q);
+	} else {
+		s2 = 1024 * 1024;
+	}
+	if (*ap != NULL)
+		ap++;
+
+	/* Fill or not ? */
+	if (*ap != NULL) {
+		if (*ap == '\0')
+			fill = 1;
+		else if (!strcmp(*ap, "-"))
+			fill = 0;
+		else if (!strcmp(*ap, "+"))
+			fill = 1;
+		else
+			ARGV_ERR("\t-l[3] ...:  Must be \"-\" or \"+\"\n");
+		ap++;
+	} else {
+		fill = 1;
+	}
+
+	FreeArgv(av);
+
+	size = s1 + s2;
+
+	if (av[2] == NULL)
+		q = str2bytes(av[2], &size, 0);
+
 	i = open(fn, O_RDWR, 0644);
 	if (i >= 0 && vsl_goodold(i)) {
 		fprintf(stderr, "Using old SHMFILE\n");
-		heritage.vsl_fd = i;
+		vsl_fd = i;
 	} else {
 		fprintf(stderr, "Creating new SHMFILE\n");
 		(void)close(i);
-		vsl_buildnew(fn, size);
+		vsl_buildnew(fn, size, fill);
 	}
 
-	loghead = (void *)mmap(NULL, heritage.vsl_size,
+	loghead = (void *)mmap(NULL, vsl_size,
 	    PROT_READ|PROT_WRITE,
 	    MAP_HASSEMAPHORE | MAP_NOSYNC | MAP_SHARED,
-	    heritage.vsl_fd, 0);
+	    vsl_fd, 0);
 	loghead->master_pid = getpid();
 	xxxassert(loghead != MAP_FAILED);
-	(void)mlock((void*)loghead, heritage.vsl_size);
+	(void)mlock((void*)loghead, vsl_size);
 	VSL_stats = &loghead->stats;
 	pp = (void *)(loghead + 1);
 	*pp = *params;

Modified: trunk/varnish-cache/bin/varnishtest/vtc_varnish.c
===================================================================
--- trunk/varnish-cache/bin/varnishtest/vtc_varnish.c	2010-05-17 08:40:08 UTC (rev 4796)
+++ trunk/varnish-cache/bin/varnishtest/vtc_varnish.c	2010-05-17 08:48:28 UTC (rev 4797)
@@ -276,6 +276,7 @@
 	AN(vsb);
 	vsb_printf(vsb, "cd ../varnishd &&");
 	vsb_printf(vsb, " ./varnishd -d -d -n %s", v->workdir);
+	vsb_printf(vsb, " -l 10m,1m,-");
 	vsb_printf(vsb, " -p auto_restart=off");
 	vsb_printf(vsb, " -p syslog_cli_traffic=off");
 	vsb_printf(vsb, " -a '%s'", "127.0.0.1:0");




More information about the varnish-commit mailing list