[master] e1e5837 Implement -t timeout option in VUT

Martin Blix Grydeland martin at varnish-software.com
Thu Apr 9 15:16:28 CEST 2015


commit e1e5837022bee655b6b35e2d5b56ed55b9eafed7
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date:   Tue Apr 7 16:12:18 2015 +0200

    Implement -t timeout option in VUT

diff --git a/include/vut.h b/include/vut.h
index 8c0a55f..c455662 100644
--- a/include/vut.h
+++ b/include/vut.h
@@ -40,6 +40,8 @@ struct VUT {
 	int		D_opt;
 	int		g_arg;
 	int		k_arg;
+	char		*n_arg;
+	char		*N_arg;
 	char		*P_arg;
 	char		*q_arg;
 	char		*r_arg;
diff --git a/lib/libvarnishtools/vut.c b/lib/libvarnishtools/vut.c
index 03917b4..72ba126 100644
--- a/lib/libvarnishtools/vut.c
+++ b/lib/libvarnishtools/vut.c
@@ -136,7 +136,6 @@ VUT_Arg(int opt, const char *arg)
 {
 	int i;
 	char *p;
-	double d;
 
 	switch (opt) {
 	case 'd':
@@ -157,21 +156,12 @@ VUT_Arg(int opt, const char *arg)
 			VUT_Error(1, "-k: Invalid number '%s'", arg);
 		return (1);
 	case 'n':
-		/* Varnish instance */
-		if (VUT.vsm == NULL)
-			VUT.vsm = VSM_New();
-		AN(VUT.vsm);
-		if (VSM_n_Arg(VUT.vsm, arg) <= 0)
-			VUT_Error(1, "%s", VSM_Error(VUT.vsm));
+		/* Varnish instance name */
+		REPLACE(VUT.n_arg, arg);
 		return (1);
 	case 'N':
 		/* Varnish stale VSM file */
-		if (VUT.vsm == NULL)
-			VUT.vsm = VSM_New();
-		AN(VUT.vsm);
-		if (VSM_N_Arg(VUT.vsm, arg) <= 0)
-			VUT_Error(1, "%s", VSM_Error(VUT.vsm));
-		VUT.d_opt = 1;	/* Enforces -d */
+		REPLACE(VUT.N_arg, arg);
 		return (1);
 	case 'P':
 		/* PID file */
@@ -187,10 +177,15 @@ VUT_Arg(int opt, const char *arg)
 		return (1);
 	case 't':
 		/* VSM connect timeout */
-		d = VNUM(arg);
-		if (isnan(d))
-			VUT_Error(1, "-t: Syntax error");
-		VUT.t_arg = d;
+		if (!strcasecmp("off", arg))
+			VUT.t_arg = -1.;
+		else {
+			VUT.t_arg = VNUM(arg);
+			if (isnan(VUT.t_arg))
+				VUT_Error(1, "-t: Syntax error");
+			if (VUT.t_arg < 0.)
+				VUT_Error(1, "-t: Range error");
+		}
 		return (1);
 	case 'V':
 		/* Print version number and exit */
@@ -222,36 +217,80 @@ void
 VUT_Setup(void)
 {
 	struct VSL_cursor *c;
+	double t_start;
+	int i;
 
 	AN(VUT.vsl);
-	if (VUT.r_arg && VUT.vsm)
-		VUT_Error(1, "Can't have both -n and -r options");
+	AZ(VUT.vsm);
+	AZ(VUT.vslq);
+
+	/* Check input arguments */
+	if ((VUT.n_arg == NULL ? 0 : 1) +
+	    (VUT.N_arg == NULL ? 0 : 1) +
+	    (VUT.r_arg == NULL ? 0 : 1) > 1)
+		VUT_Error(1, "Only one of -n, -N and -r options may be used");
 
-	/* Create query */
+	/* Create and validate the query expression */
 	VUT.vslq = VSLQ_New(VUT.vsl, NULL, VUT.g_arg, VUT.q_arg);
 	if (VUT.vslq == NULL)
 		VUT_Error(1, "Query expression error:\n%s", VSL_Error(VUT.vsl));
 
-	/* Input cursor */
+	/* Setup input */
 	if (VUT.r_arg) {
 		REPLACE(VUT.name, VUT.r_arg);
 		c = VSL_CursorFile(VUT.vsl, VUT.r_arg, 0);
+		if (c == NULL)
+			VUT_Error(1, "Can't open log file (%s)",
+			    VSL_Error(VUT.vsl));
 	} else {
-		if (VUT.vsm == NULL)
-			/* Default uses VSM with n=hostname */
-			VUT.vsm = VSM_New();
+		VUT.vsm = VSM_New();
 		AN(VUT.vsm);
-		if (VSM_Open(VUT.vsm))
-			VUT_Error(1, "Can't open VSM file (%s)",
-			    VSM_Error(VUT.vsm));
+		if (VUT.n_arg && VSM_n_Arg(VUT.vsm, VUT.n_arg) <= 0)
+			VUT_Error(1, "%s", VSM_Error(VUT.vsm));
+		if (VUT.N_arg && VSM_N_Arg(VUT.vsm, VUT.N_arg) <= 0)
+			VUT_Error(1, "%s", VSM_Error(VUT.vsm));
 		REPLACE(VUT.name, VSM_Name(VUT.vsm));
-		c = VSL_CursorVSM(VUT.vsl, VUT.vsm,
-		    (VUT.d_opt ? VSL_COPT_TAILSTOP : VSL_COPT_TAIL)
-		    | VSL_COPT_BATCH);
+		t_start = NAN;
+		c = NULL;
+		while (1) {
+			i = VSM_Open(VUT.vsm);
+			if (!i)
+				c = VSL_CursorVSM(VUT.vsl, VUT.vsm,
+				    (VUT.d_opt ? VSL_COPT_TAILSTOP :
+					VSL_COPT_TAIL)
+				    | VSL_COPT_BATCH);
+			if (c)
+				break;
+
+			if (isnan(t_start) && VUT.t_arg > 0.) {
+				VUT_Error(0, "Can't open log -"
+				    " retrying for %.0f seconds", VUT.t_arg);
+				t_start = VTIM_real();
+			}
+			VSM_Close(VUT.vsm);
+			if (VUT.t_arg <= 0.)
+				break;
+			if (VTIM_real() - t_start > VUT.t_arg)
+				break;
+
+			VSM_ResetError(VUT.vsm);
+			VSL_ResetError(VUT.vsl);
+			VTIM_sleep(0.5);
+		}
+
+		if (VUT.t_arg >= 0. && (i || !c)) {
+			if (i)
+				VUT_Error(1, "Can't open VSM file (%s)",
+				    VSM_Error(VUT.vsm));
+			else
+				VUT_Error(1, "Can't open log (%s)",
+				    VSL_Error(VUT.vsl));
+		} else if (!isnan(t_start))
+			VUT_Error(0, "Log opened");
 	}
-	if (c == NULL)
-		VUT_Error(1, "Can't open log (%s)", VSL_Error(VUT.vsl));
-	VSLQ_SetCursor(VUT.vslq, &c);
+
+	if (c)
+		VSLQ_SetCursor(VUT.vslq, &c);
 	AZ(c);
 
 	/* Signal handlers */
@@ -282,6 +321,8 @@ VUT_Setup(void)
 void
 VUT_Fini(void)
 {
+	free(VUT.n_arg);
+	free(VUT.N_arg);
 	free(VUT.r_arg);
 	free(VUT.P_arg);
 	free(VUT.name);



More information about the varnish-commit mailing list