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

phk at projects.linpro.no phk at projects.linpro.no
Sat Aug 19 23:32:10 CEST 2006


Author: phk
Date: 2006-08-19 23:32:10 +0200 (Sat, 19 Aug 2006)
New Revision: 838

Modified:
   trunk/varnish-cache/bin/varnishd/mgt_param.c
   trunk/varnish-cache/include/cli.h
Log:
Implement the first load of tweable parameters


Modified: trunk/varnish-cache/bin/varnishd/mgt_param.c
===================================================================
--- trunk/varnish-cache/bin/varnishd/mgt_param.c	2006-08-19 20:28:30 UTC (rev 837)
+++ trunk/varnish-cache/bin/varnishd/mgt_param.c	2006-08-19 21:32:10 UTC (rev 838)
@@ -2,27 +2,247 @@
  * $Id$
  */
 
+#include <string.h>
+#include <stdlib.h>
 #include <unistd.h>
+#include <limits.h>
 
+#include "cli.h"
 #include "cli_priv.h"
 #include "mgt.h"
 #include "mgt_cli.h"
 
+#include "heritage.h"
+
+struct parspec;
+
+typedef void tweak_t(struct cli *, struct parspec *, const char *arg);
+
+struct parspec {
+	const char	*name;
+	tweak_t		*func;
+	const char	*expl;
+};
+
+/*--------------------------------------------------------------------*/
+
+static void
+tweak_default_ttl(struct cli *cli, struct parspec *par, const char *arg)
+{
+
+	(void)par;
+	if (arg != NULL)
+		params->default_ttl = strtoul(arg, NULL, 0);
+	cli_out(cli, "%u [seconds]\n", params->default_ttl);
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
+tweak_thread_pool_min(struct cli *cli, struct parspec *par, const char *arg)
+{
+	unsigned u;
+
+	(void)par;
+	if (arg != NULL) {
+		u = strtoul(arg, NULL, 0);
+		if (u >= params->wthread_max) {
+			cli_out(cli, "Minimum must be less than maximum\n");
+			cli_result(cli, CLIS_PARAM);
+			return;
+		}
+		params->wthread_min = u;
+	}
+	cli_out(cli, "%u [threads]\n", params->wthread_min);
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
+tweak_thread_pool_max(struct cli *cli, struct parspec *par, const char *arg)
+{
+	unsigned u;
+
+	(void)par;
+	if (arg != NULL) {
+		u = strtoul(arg, NULL, 0);
+		if (u <= params->wthread_min) {
+			cli_out(cli, "Maximum must be greater than minimum\n");
+			cli_result(cli, CLIS_PARAM);
+			return;
+		}
+		params->wthread_max = u;
+	}
+	if (params->wthread_max == UINT_MAX) 
+		cli_out(cli, "unlimited\n");
+	else 
+		cli_out(cli, "%u [threads]\n", params->wthread_max);
+}
+
+/*--------------------------------------------------------------------*/
+
+static void
+tweak_thread_pool_timeout(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->wthread_timeout = u;
+	}
+	cli_out(cli, "%u [seconds]\n", params->wthread_timeout);
+}
+/*--------------------------------------------------------------------*/
+
+static void
+tweak_http_workspace(struct cli *cli, struct parspec *par, const char *arg)
+{
+	unsigned u;
+
+	(void)par;
+	if (arg != NULL) {
+		u = strtoul(arg, NULL, 0);
+		if (u <= 1024) {
+			cli_out(cli, "Workspace must be at least 1024 bytes\n");
+			cli_result(cli, CLIS_PARAM);
+			return;
+		}
+		params->mem_workspace = u;
+	}
+	cli_out(cli, "%u [bytes]\n", params->mem_workspace);
+}
+
+/*--------------------------------------------------------------------*/
+
+/*
+ * Make sure to end all lines with either a space or newline of the
+ * formatting will go haywire.
+ */
+
+#define DELAYED_EFFECT \
+	"\nNB: This parameter will take some time to take effect.\n"
+
+#define SHOULD_RESTART \
+	"\nNB: This parameter will not take full effect until the " \
+	"child process has been restarted.\n"
+
+#define MUST_RESTART \
+	"\nNB: This parameter will not take any effect until the " \
+	"child process has been restarted.\n"
+
+
+static struct parspec parspec[] = {
+	{ "default_ttl", tweak_default_ttl,
+		"The TTL assigned to objects if neither the backend nor "
+		"the VCL code assigns one.\n"
+		"Objects already cached will not be affected by changes "
+		"made until they are fetched from the backend again.\n"
+		"To force an immediate effect at the expense of a total "
+		"flush of the cache use \"url.purge .\"\n"
+		"Default is 120 seconds. " },
+	{ "thread_pool_min", tweak_thread_pool_min,
+		"The minimum number of threads in the worker pool.\n"
+		DELAYED_EFFECT
+		"Default is 1 thread. " 
+		"Minimum is 1 thread. " },
+	{ "thread_pool_max", tweak_thread_pool_max,
+		"The maximum number of threads in the worker pool.\n"
+		DELAYED_EFFECT
+		"Default is no limit." },
+	{ "thread_pool_timeout", tweak_thread_pool_timeout,
+		"Thread dies after this many seconds of inactivity.\n"
+		"Default is 10 seconds. "
+		"Minimum is 1 second. " },
+	{ "http_workspace", tweak_http_workspace,
+		"Bytes of HTTP protocol workspace allocated. "
+		"This space must be big enough for the entire HTTP protocol "
+		"header and any edits done to it in the VCL code.\n"
+		SHOULD_RESTART
+		"Default is 4096 bytes. "
+		"Minimum is 1024 bytes. " },
+	{ NULL, NULL, NULL }
+};
+
+/*--------------------------------------------------------------------*/
+
 void
 mcf_param_show(struct cli *cli, char **av, void *priv)
 {
+	struct parspec *pp;
+	const char *p, *q;
+	int lfmt;
 
-	(void)cli;
-	(void)av;
 	(void)priv;
+	if (av[2] == NULL || strcmp(av[2], "-l"))
+		lfmt = 0;
+	else
+		lfmt = 1;
+	for (pp = parspec; pp->name != NULL; pp++) {
+		if (av[2] != NULL && !lfmt && strcmp(pp->name, av[2]))
+			continue;
+		cli_out(cli, "%-20s ", pp->name);
+		if (pp->func == NULL) {
+			cli_out(cli, "Not implemented.\n");
+			if (av[2] != NULL && !lfmt) 
+				return;
+			else
+				continue;
+		}
+		pp->func(cli, pp, NULL);
+		if (av[2] != NULL) {
+			/* Format text to 72 col width */
+			for (p = pp->expl; *p != '\0'; ) {
+				q = strchr(p, '\n');
+				if (q == NULL)
+					q = strchr(p, '\0');
+				assert(q != NULL);
+				if (q > p + 52) {
+					q = p + 52;
+					while (q > p && *q != ' ')
+						q--;
+					assert(q != NULL);
+				}
+				cli_out(cli, "%20s %.*s\n", "", q - p, p);
+				p = q;
+				if (*p == ' ' || *p == '\n')
+					p++;
+			}
+			if (!lfmt)
+				return;
+			else
+				cli_out(cli, "\n");
+		}
+	}
+	if (av[2] != NULL && !lfmt) {
+		cli_result(cli, CLIS_PARAM);
+		cli_out(cli, "Unknown paramter \"%s\".", av[2]);
+	}
 }
 
+/*--------------------------------------------------------------------*/
+
 void
 mcf_param_set(struct cli *cli, char **av, void *priv)
 {
+	struct parspec *pp;
 
-	(void)cli;
-	(void)av;
 	(void)priv;
+	for (pp = parspec; pp->name != NULL; pp++) {
+		if (!strcmp(pp->name, av[2])) {
+			cli_out(cli, "%-20s ", pp->name);
+			pp->func(cli, pp, av[3]);
+			return;
+		}
+	}
+	if (av[2] != NULL) {
+		cli_result(cli, CLIS_PARAM);
+		cli_out(cli, "Unknown paramter \"%s\".", av[2]);
+	}
 }
 

Modified: trunk/varnish-cache/include/cli.h
===================================================================
--- trunk/varnish-cache/include/cli.h	2006-08-19 20:28:30 UTC (rev 837)
+++ trunk/varnish-cache/include/cli.h	2006-08-19 21:32:10 UTC (rev 838)
@@ -79,9 +79,9 @@
 
 #define CLI_PARAM_SHOW							\
 	"param.show",							\
-	"param.show [<param>]",						\
+	"param.show [-l] [<param>]",					\
 	"\tShow parameters and their values.",				\
-	0, 1
+	0, 2
 
 #define CLI_PARAM_SET							\
 	"param.set",							\




More information about the varnish-commit mailing list