[master] 5c8b67f Work on print out of transaction statements.

Martin Blix Grydeland martin at varnish-cache.org
Wed May 15 14:46:14 CEST 2013


commit 5c8b67f8f4a7a924c920304380ae73bed22f515b
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date:   Wed May 15 13:32:52 2013 +0200

    Work on print out of transaction statements.
    
    Document and be consistent about how log statements are printed.
    
    Make the dispatch-reported data be of struct VSL_transactions, and
    move the transaction metadata there.
    
    Add a verbose option.

diff --git a/bin/varnishlog/varnishlog.c b/bin/varnishlog/varnishlog.c
index c669e70..c48bb1b 100644
--- a/bin/varnishlog/varnishlog.c
+++ b/bin/varnishlog/varnishlog.c
@@ -95,7 +95,7 @@ main(int argc, char * const *argv)
 	vsm = VSM_New();
 	AN(vsm);
 
-	while ((optchar = getopt(argc, argv, "dg:n:r:")) != -1) {
+	while ((optchar = getopt(argc, argv, "dg:n:r:v")) != -1) {
 		switch (optchar) {
 		case 'd':
 			d_opt = 1;
@@ -113,7 +113,8 @@ main(int argc, char * const *argv)
 			r_arg = optarg;
 			break;
 		default:
-			usage();
+			if (!VSL_Arg(vsl, optchar, optarg))
+				usage();
 		}
 	}
 
@@ -165,7 +166,7 @@ main(int argc, char * const *argv)
 			AZ(c);
 		}
 
-		i = VSLQ_Dispatch(q, VSL_PrintSet, stdout);
+		i = VSLQ_Dispatch(q, VSL_PrintTransactions, stdout);
 		if (i == 0) {
 			/* Nothing to do but wait */
 			VTIM_sleep(0.01);
@@ -174,7 +175,7 @@ main(int argc, char * const *argv)
 			break;
 		} else if (i <= -2) {
 			/* XXX: Make continuation optional */
-			VSLQ_Flush(q, VSL_PrintSet, stdout);
+			VSLQ_Flush(q, VSL_PrintTransactions, stdout);
 			VSLQ_Delete(&q);
 			AZ(q);
 			if (i == -2) {
@@ -191,7 +192,7 @@ main(int argc, char * const *argv)
 	}
 
 	if (q != NULL) {
-		VSLQ_Flush(q, VSL_PrintSet, stdout);
+		VSLQ_Flush(q, VSL_PrintTransactions, stdout);
 		VSLQ_Delete(&q);
 		AZ(q);
 	}
diff --git a/include/vapi/vsl.h b/include/vapi/vsl.h
index 4bb1d60..2da4684 100644
--- a/include/vapi/vsl.h
+++ b/include/vapi/vsl.h
@@ -59,16 +59,22 @@ struct VSLC_ptr {
 struct VSL_cursor {
 	/* The record this cursor points to */
 	struct VSLC_ptr		rec;
+};
 
-	/* If not -1, the vxid of all records in this set */
-	int32_t			vxid;
-
-	/* For set cursors, the depth level of these records */
-	unsigned level;
+enum VSL_transaction_e {
+	VSL_t_unknown,
+	VSL_t_sess,
+	VSL_t_req,
+	VSL_t_esireq,
+	VSL_t_bereq,
+	VSL_t_raw,
+};
 
-	/* Nonzero if pointer values from this cursor are still valid
-	   after next call to VSL_Next */
-	unsigned shmptr_ok;
+struct VSL_transaction {
+	unsigned		level;
+	int32_t			vxid;
+	enum VSL_transaction_e	type;
+	struct VSL_cursor	*c;
 };
 
 enum VSL_grouping_e {
@@ -192,11 +198,13 @@ int VSL_Match(struct VSL_data *vsl, const struct VSL_cursor *c);
 	 *	0:	No match
 	 */
 
-int VSL_PrintVXID(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo);
+int VSL_Print(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo);
 	/*
 	 * Print the log record pointed to by cursor to stream.
 	 *
-	 * Format: <vxid> <tag> <type> <data>
+	 * Format: (t=type)
+	 * 1234567890 12345678901234 1 ...
+	 *       vxid tag            t content
 	 *
 	 * Arguments:
 	 *   vsl: The VSL_data context
@@ -208,11 +216,13 @@ int VSL_PrintVXID(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo);
 	 *     -5:	I/O write error - see errno
 	 */
 
-int VSL_PrintLevel(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo);
+int VSL_PrintTerse(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo);
 	/*
 	 * Print the log record pointed to by cursor to stream.
 	 *
-	 * Format: <level> <tag> <type> <data>
+	 * Format:
+	 * 12345678901234 ...
+	 * tag            content
 	 *
 	 * Arguments:
 	 *   vsl: The VSL_data context
@@ -227,10 +237,7 @@ int VSL_PrintLevel(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo);
 int VSL_PrintAll(struct VSL_data *vsl, struct VSL_cursor *c, void *fo);
 	/*
 	 * Calls VSL_Next on c until c is exhausted. In turn calls
-	 * prints all records where VSL_Match returns true.
-	 *
-	 * If c->vxid == -1, calls VSL_PrintVXID on each record. Else
-	 * prints a VXID header and calls VSL_PrintLevel on each record.
+	 * VSL_Print on all records where VSL_Match returns true.
 	 *
 	 * Arguments:
 	 *   vsl: The VSL_data context
@@ -242,11 +249,14 @@ int VSL_PrintAll(struct VSL_data *vsl, struct VSL_cursor *c, void *fo);
 	 *    !=0:	Return value from either VSL_Next or VSL_Print
 	 */
 
-int VSL_PrintSet(struct VSL_data *vsl, struct VSL_cursor *cp[], void *fo);
+int VSL_PrintTransactions(struct VSL_data *vsl,
+    struct VSL_transaction *ptrans[], void *fo);
 	/*
-	 * Calls VSL_PrintAll on each cursor in cp[]. If any cursor in cp
-	 * has vxid != -1 it will end with a double line break as a set
-	 * delimeter.
+	 * Prints out each transaction in the array ptrans. For
+	 * transactions of level > 0 it will print a header before the log
+	 * records. The records will for level == 0 (single records) or if
+	 * v_opt is set, be printed by VSL_Print. Else VSL_PrintTerse is
+	 * used.
 	 *
 	 * Arguments:
 	 *   vsl: The VSL_data context
@@ -255,7 +265,7 @@ int VSL_PrintSet(struct VSL_data *vsl, struct VSL_cursor *cp[], void *fo);
 	 *
 	 * Return values:
 	 *	0:	OK
-	 *    !=0:	Return value from either VSL_Next or VSL_PrintAll
+	 *    !=0:	Return value from either VSL_Next or VSL_Print
 	 */
 
 struct VSLQ *VSLQ_New(struct VSL_data *vsl, struct VSL_cursor **cp,
@@ -280,16 +290,15 @@ void VSLQ_Delete(struct VSLQ **pvslq);
 	 * Delete the query pointed to by pvslq, freeing up the resources
 	 */
 
-typedef int VSLQ_dispatch_f(struct VSL_data *vsl, struct VSL_cursor *cp[],
-    void *priv);
+typedef int VSLQ_dispatch_f(struct VSL_data *vsl,
+    struct VSL_transaction *trans[], void *priv);
 	/*
 	 * The callback function type for use with VSLQ_Dispatch.
 	 *
 	 * Arguments:
-	 *   vsl: The VSL_data context
-	 *  cp[]: A NULL terminated array of pointer to cursors. Each cursor
-	 *        will iterate over the log records of a single VXID
-	 *  priv: The priv argument from VSL_Dispatch
+	 *      vsl: The VSL_data context
+	 *  trans[]: A NULL terminated array of pointers to VSL_transaction.
+	 *     priv: The priv argument from VSL_Dispatch
 	 *
 	 * Return value:
 	 *     0: OK - continue
diff --git a/lib/libvarnishapi/libvarnishapi.map b/lib/libvarnishapi/libvarnishapi.map
index 5d8101b..df2e644 100644
--- a/lib/libvarnishapi/libvarnishapi.map
+++ b/lib/libvarnishapi/libvarnishapi.map
@@ -102,10 +102,10 @@ LIBVARNISHAPI_1.3 {
 	VSL_DeleteCursor;
 	VSL_Next;
 	VSL_Match;
-	VSL_PrintVXID;
-	VSL_PrintLevel;
+	VSL_Print;
+	VSL_PrintTerse;
 	VSL_PrintAll;
-	VSL_PrintSet;
+	VSL_PrintTransactions;
 	VSLQ_New;
 	VSLQ_Delete;
 	VSLQ_Dispatch;
diff --git a/lib/libvarnishapi/vsl.c b/lib/libvarnishapi/vsl.c
index 25e1898..a9b1726 100644
--- a/lib/libvarnishapi/vsl.c
+++ b/lib/libvarnishapi/vsl.c
@@ -154,15 +154,30 @@ VSL_Match(struct VSL_data *vsl, const struct VSL_cursor *c)
 	return (1);
 }
 
+const char *VSL_transactions[256] = {
+	/*                 12345678901234 */
+	[VSL_t_unknown] = "<< Unknown  >>",
+	[VSL_t_sess]	= "<< Session  >>",
+	[VSL_t_req]	= "<< Request  >>",
+	[VSL_t_esireq]	= "<< ESI-req  >>",
+	[VSL_t_bereq]	= "<< BeReq    >>",
+	[VSL_t_raw]	= "<< Record   >>",
+};
+
+#define VSL_PRINT(...)					\
+	do {						\
+		if (0 > fprintf(__VA_ARGS__))		\
+			return (-5);			\
+	} while (0)
+
 int
-VSL_PrintVXID(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo)
+VSL_Print(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo)
 {
 	enum VSL_tag_e tag;
 	uint32_t vxid;
 	unsigned len;
 	const char *data;
 	int type;
-	int i;
 
 	CHECK_OBJ_NOTNULL(vsl, VSL_MAGIC);
 	if (c == NULL || c->rec.ptr == NULL)
@@ -177,76 +192,51 @@ VSL_PrintVXID(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo)
 	data = VSL_CDATA(c->rec.ptr);
 
 	if (tag == SLT_Debug) {
-		i = fprintf(fo, "%10u %-15s %c \"", vxid, VSL_tags[tag], type);
-		if (i < 0)
-			return (-5);
+		VSL_PRINT(fo, "%10u %-14s %c \"", vxid, VSL_tags[tag], type);
 		while (len-- > 0) {
 			if (*data >= ' ' && *data <= '~')
-				i = fprintf(fo, "%c", *data);
+				VSL_PRINT(fo, "%c", *data);
 			else
-				i = fprintf(fo, "%%%02x", (unsigned char)*data);
-			if (i < 0)
-				return (-5);
+				VSL_PRINT(fo, "%%%02x", (unsigned char)*data);
 			data++;
 		}
-		i = fprintf(fo, "\"\n");
-		if (i < 0)
-			return (-5);
-		return (0);
-	}
+		VSL_PRINT(fo, "\"\n");
+	} else
+		VSL_PRINT(fo, "%10u %-14s %c %.*s\n", vxid, VSL_tags[tag],
+		    type, (int)len, data);
 
-	i = fprintf(fo, "%10u %-15s %c %.*s\n",
-	    vxid, VSL_tags[tag], type, (int)len, data);
-	if (i < 0)
-		return (-5);
 	return (0);
 }
 
 int
-VSL_PrintLevel(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo)
+VSL_PrintTerse(struct VSL_data *vsl, const struct VSL_cursor *c, void *fo)
 {
 	enum VSL_tag_e tag;
-	unsigned len, lvl;
+	unsigned len;
 	const char *data;
-	int type;
-	int i;
 
 	CHECK_OBJ_NOTNULL(vsl, VSL_MAGIC);
 	if (c == NULL || c->rec.ptr == NULL)
 		return (0);
 	if (fo == NULL)
 		fo = stdout;
-
 	tag = VSL_TAG(c->rec.ptr);
 	len = VSL_LEN(c->rec.ptr);
-	type = VSL_CLIENT(c->rec.ptr) ? 'c' : VSL_BACKEND(c->rec.ptr) ?
-	    'b' : '-';
 	data = VSL_CDATA(c->rec.ptr);
-	lvl = c->level;
+
 	if (tag == SLT_Debug) {
-		i = fprintf(fo, "%2u %-15s %c \"", lvl, VSL_tags[tag],
-		    type);
-		if (i < 0)
-			return (-5);
+		VSL_PRINT(fo, "%-14s \"", VSL_tags[tag]);
 		while (len-- > 0) {
 			if (*data >= ' ' && *data <= '~')
-				i = fprintf(fo, "%c", *data);
+				VSL_PRINT(fo, "%c", *data);
 			else
-				i = fprintf(fo, "%%%02x",
-				    (unsigned char)*data);
-			if (i < 0)
-				return (-5);
+				VSL_PRINT(fo, "%%%02x", (unsigned char)*data);
 			data++;
 		}
-		i = fprintf(fo, "\"\n");
-		if (i < 0)
-			return (-5);
-		return (0);
-	}
-	i = fprintf(fo, "%2u %-15s %c %.*s\n",
-	    lvl, VSL_tags[tag], type, (int)len, data);
-	if (i < 0)
-		return (-5);
+		VSL_PRINT(fo, "\"\n");
+	} else
+		VSL_PRINT(fo, "%-14s %.*s\n", VSL_tags[tag], (int)len, data);
+
 	return (0);
 }
 
@@ -257,46 +247,76 @@ VSL_PrintAll(struct VSL_data *vsl, struct VSL_cursor *c, void *fo)
 
 	if (c == NULL)
 		return (0);
-	if (c->vxid >= 0) {
-		i = fprintf(fo, "vv VXID: %11u vv\n", c->vxid);
-		if (i < 0)
-			return (-5);
-	}
 	while (1) {
 		i = VSL_Next(c);
 		if (i <= 0)
 			return (i);
 		if (!VSL_Match(vsl, c))
 			continue;
-		if (c->vxid < 0)
-			i = VSL_PrintVXID(vsl, c, fo);
-		else
-			i = VSL_PrintLevel(vsl, c, fo);
+		i = VSL_Print(vsl, c, fo);
 		if (i != 0)
 			return (i);
 	}
 }
 
 int
-VSL_PrintSet(struct VSL_data *vsl, struct VSL_cursor *cp[], void *fo)
+VSL_PrintTransactions(struct VSL_data *vsl, struct VSL_transaction *pt[],
+    void *fo)
 {
+	struct VSL_transaction *t;
 	int i;
 	int delim = 0;
-	struct VSL_cursor *c;
+	int verbose;
+
+	(void)vsl;
+	if (pt[0] == NULL)
+		return (0);
+
+	t = pt[0];
+	while (t) {
+		verbose = 0;
+		if (t->level == 0 || vsl->v_opt)
+			verbose = 1;
 
-	c = cp[0];
-	while (c) {
-		if (c->vxid >= 0)
+		if (t->level) {
+			/* Print header */
+			if (t->level > 3)
+				VSL_PRINT(fo, "*%1.1u* ", t->level);
+			else
+				VSL_PRINT(fo, "%-3.*s ", t->level, "***");
+			VSL_PRINT(fo, "%*.s%-14s %*.s%-10u\n",
+			    verbose ? 10 + 1 : 0, " ",
+			    VSL_transactions[t->type],
+			    verbose ? 1 + 1 : 0, " ",
+			    t->vxid);
 			delim = 1;
-		i = VSL_PrintAll(vsl, c, fo);
-		if (i)
-			return (i);
-		c = *++cp;
-	}
-	if (delim) {
-		i = fprintf(fo, "\n");
-		if (i < 0)
-			return (-5);
+		}
+
+		while (1) {
+			/* Print records */
+			i = VSL_Next(t->c);
+			if (i < 0)
+				return (i);
+			if (i == 0)
+				break;
+			if (!VSL_Match(vsl, t->c))
+				continue;
+			if (t->level > 3)
+				VSL_PRINT(fo, "-%1.1u- ", t->level);
+			else if (t->level)
+				VSL_PRINT(fo, "%-3.*s ", t->level, "---");
+			if (verbose)
+				i = VSL_Print(vsl, t->c, fo);
+			else
+				i = VSL_PrintTerse(vsl, t->c, fo);
+			if (i != 0)
+				return (i);
+		}
+		t = *++pt;
 	}
+
+	if (delim)
+		VSL_PRINT(fo, "\n");;
+
 	return (0);
 }
diff --git a/lib/libvarnishapi/vsl_api.h b/lib/libvarnishapi/vsl_api.h
index eb9e543..b2f9fb7 100644
--- a/lib/libvarnishapi/vsl_api.h
+++ b/lib/libvarnishapi/vsl_api.h
@@ -80,6 +80,8 @@ struct VSL_data {
 	/* Bitmaps of -ix selected tags */
 	struct vbitmap			*vbm_select;
 	struct vbitmap			*vbm_supress;
+
+	int				v_opt;
 };
 
 /* vsl_query.c */
@@ -87,4 +89,4 @@ struct vslq_query;
 struct vslq_query *vslq_newquery(struct VSL_data *vsl,
     enum VSL_grouping_e grouping, const char *query);
 void vslq_deletequery(struct vslq_query **pquery);
-int vslq_runquery(struct vslq_query *query, struct VSL_cursor *cp[]);
+int vslq_runquery(struct vslq_query *query, struct VSL_transaction *ptrans[]);
diff --git a/lib/libvarnishapi/vsl_arg.c b/lib/libvarnishapi/vsl_arg.c
index 72c1f22..fcbc528 100644
--- a/lib/libvarnishapi/vsl_arg.c
+++ b/lib/libvarnishapi/vsl_arg.c
@@ -131,6 +131,7 @@ VSL_Arg(struct VSL_data *vsl, int opt, const char *arg)
 {
 	switch (opt) {
 	case 'i': case'x': return (vsl_ix_arg(vsl, opt, arg));
+	case 'v': vsl->v_opt = 1; return (1);
 	default:
 		return (0);
 	}
diff --git a/lib/libvarnishapi/vsl_cursor.c b/lib/libvarnishapi/vsl_cursor.c
index 01808a4..9bee281 100644
--- a/lib/libvarnishapi/vsl_cursor.c
+++ b/lib/libvarnishapi/vsl_cursor.c
@@ -250,8 +250,6 @@ VSL_CursorVSM(struct VSL_data *vsl, struct VSM_data *vsm, int tail)
 		vsl_diag(vsl, "Out of memory\n");
 		return (NULL);
 	}
-	c->c.c.vxid = -1;	/* N/A to this cursor type */
-	c->c.c.shmptr_ok = 1;
 	c->c.magic = VSLC_MAGIC;
 	c->c.tbl = & vslc_vsm_tbl;
 
@@ -409,7 +407,6 @@ VSL_CursorFile(struct VSL_data *vsl, const char *name)
 		vsl_diag(vsl, "Out of memory\n");
 		return (NULL);
 	}
-	c->c.c.vxid = -1;	/* N/A to this cursor type */
 	c->c.magic = VSLC_MAGIC;
 	c->c.tbl = &vslc_file_tbl;
 
diff --git a/lib/libvarnishapi/vsl_dispatch.c b/lib/libvarnishapi/vsl_dispatch.c
index 98a438d..7053500 100644
--- a/lib/libvarnishapi/vsl_dispatch.c
+++ b/lib/libvarnishapi/vsl_dispatch.c
@@ -50,21 +50,6 @@
 
 struct vtx;
 
-enum vtx_type_e {
-	vtx_t_unknown,
-	vtx_t_sess,
-	vtx_t_req,
-	vtx_t_esireq,
-	vtx_t_bereq,
-};
-
-enum vtx_link_e {
-	vtx_l_sess,
-	vtx_l_req,
-	vtx_l_esireq,
-	vtx_l_bereq,
-};
-
 struct vslc_raw {
 	struct vslc		c;
 	unsigned		magic;
@@ -111,7 +96,7 @@ struct vtx {
 #define VTX_F_COMPLETE		0x1
 #define VTX_F_READY		0x2
 
-	enum vtx_type_e		type;
+	enum VSL_transaction_e	type;
 
 	struct vtx		*parent;
 	VTAILQ_HEAD(,vtx)	child;
@@ -307,7 +292,7 @@ vtx_new(struct VSLQ *vslq)
 	vtx->key.vxid = 0;
 	vtx->t_start = VTIM_mono();
 	vtx->flags = 0;
-	vtx->type = vtx_t_unknown;
+	vtx->type = VSL_t_unknown;
 	vtx->parent = NULL;
 	VTAILQ_INIT(&vtx->child);
 	vtx->n_child = 0;
@@ -399,7 +384,6 @@ vtx_lori(struct VSLQ *vslq, unsigned vxid)
 	vtx = vtx_new(vslq);
 	AN(vtx);
 	vtx->key.vxid = vxid;
-	vtx->c.c.c.vxid = vxid;
 	AZ(VRB_INSERT(vtx_tree, &vslq->tree, &vtx->key));
 	return (vtx);
 }
@@ -486,7 +470,7 @@ vtx_check_ready(struct VSLQ *vslq, struct vtx *vtx)
 	AN(vtx->flags & VTX_F_COMPLETE);
 	AZ(vtx->flags & VTX_F_READY);
 
-	if (vtx->type == vtx_t_unknown)
+	if (vtx->type == VSL_t_unknown)
 		vtx_diag(vtx, "vtx of unknown type marked complete");
 
 	ready = vtx;
@@ -511,14 +495,14 @@ vtx_check_ready(struct VSLQ *vslq, struct vtx *vtx)
 }
 
 static int
-vtx_parsetag_bl(const char *str, unsigned strlen, enum vtx_type_e *ptype,
+vtx_parsetag_bl(const char *str, unsigned strlen, enum VSL_transaction_e *ptype,
     unsigned *pvxid)
 {
 	char ibuf[strlen + 1];
 	char tbuf[7];
 	unsigned vxid;
 	int i;
-	enum vtx_type_e type = vtx_t_unknown;
+	enum VSL_transaction_e type = VSL_t_unknown;
 
 	AN(str);
 	memcpy(ibuf, str, strlen);
@@ -527,13 +511,13 @@ vtx_parsetag_bl(const char *str, unsigned strlen, enum vtx_type_e *ptype,
 	if (i < 1)
 		return (-1);
 	if (!strcmp(tbuf, "sess"))
-		type = vtx_t_sess;
+		type = VSL_t_sess;
 	else if (!strcmp(tbuf, "req"))
-		type = vtx_t_req;
+		type = VSL_t_req;
 	else if (!strcmp(tbuf, "esireq"))
-		type = vtx_t_esireq;
+		type = VSL_t_esireq;
 	else if (!strcmp(tbuf, "bereq"))
-		type = vtx_t_bereq;
+		type = VSL_t_bereq;
 	else
 		return (-1);
 	if (i == 1)
@@ -564,7 +548,7 @@ static int
 vtx_scan_begintag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr)
 {
 	int i;
-	enum vtx_type_e type;
+	enum VSL_transaction_e type;
 	unsigned p_vxid;
 	struct vtx *p_vtx;
 
@@ -578,8 +562,8 @@ vtx_scan_begintag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr)
 		return (vtx_diag_tag(vtx, ptr, "parse error"));
 
 	/* Check/set vtx type */
-	assert(type != vtx_t_unknown);
-	if (vtx->type != vtx_t_unknown && vtx->type != type)
+	assert(type != VSL_t_unknown);
+	if (vtx->type != VSL_t_unknown && vtx->type != type)
 		return (vtx_diag_tag(vtx, ptr, "type mismatch"));
 	vtx->type = type;
 
@@ -588,7 +572,7 @@ vtx_scan_begintag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr)
 
 	if (vslq->grouping == VSL_g_vxid)
 		return (0);	/* No links */
-	if (vslq->grouping == VSL_g_request && vtx->type == vtx_t_req)
+	if (vslq->grouping == VSL_g_request && vtx->type == VSL_t_req)
 		return (0);	/* No links */
 
 	/* Lookup and check parent vtx */
@@ -612,7 +596,7 @@ static int
 vtx_scan_linktag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr)
 {
 	int i;
-	enum vtx_type_e c_type;
+	enum VSL_transaction_e c_type;
 	unsigned c_vxid;
 	struct vtx *c_vtx;
 
@@ -628,7 +612,7 @@ vtx_scan_linktag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr)
 
 	if (vslq->grouping == VSL_g_vxid)
 		return (0);	/* No links */
-	if (vslq->grouping == VSL_g_request && vtx->type == vtx_t_sess)
+	if (vslq->grouping == VSL_g_request && vtx->type == VSL_t_sess)
 		return (0);	/* No links */
 
 	/* Lookup and check child vtx */
@@ -641,7 +625,7 @@ vtx_scan_linktag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr)
 		return (vtx_diag_tag(vtx, ptr, "duplicate link"));
 	if (c_vtx->flags & VTX_F_READY)
 		return (vtx_diag_tag(vtx, ptr, "link too late"));
-	if (c_vtx->type != vtx_t_unknown && c_vtx->type != c_type)
+	if (c_vtx->type != VSL_t_unknown && c_vtx->type != c_type)
 		return (vtx_diag_tag(vtx, ptr, "type mismatch"));
 	c_vtx->type = c_type;
 
@@ -669,7 +653,7 @@ vtx_scan(struct VSLQ *vslq, struct vtx *vtx)
 			continue;
 		}
 
-		if (vtx->type == vtx_t_unknown && tag != SLT_Begin)
+		if (vtx->type == VSL_t_unknown && tag != SLT_Begin)
 			vtx_diag_tag(vtx, ptr, "early log rec");
 
 		switch (tag) {
@@ -719,7 +703,9 @@ vslq_callback(struct VSLQ *vslq, struct vtx *vtx, VSLQ_dispatch_f *func,
     void *priv)
 {
 	unsigned n = vtx->n_descend + 1;
-	struct vslc_vtx *cp[n + 1];
+	struct VSL_transaction trans[n];
+	struct VSL_transaction *ptrans[n + 1];
+	struct vslc_vtx *c;
 	unsigned i, j;
 
 	AN(vslq);
@@ -728,40 +714,46 @@ vslq_callback(struct VSLQ *vslq, struct vtx *vtx, VSLQ_dispatch_f *func,
 	if (func == NULL)
 		return (0);
 	if (vslq->grouping == VSL_g_session &&
-	    vtx->type != vtx_t_sess)
+	    vtx->type != VSL_t_sess)
 		return (0);
 	if (vslq->grouping == VSL_g_request &&
-	    vtx->type != vtx_t_req)
+	    vtx->type != VSL_t_req)
 		return (0);
 
-	/* Build cursor array */
-	i = j = 0;
-	cp[i] = &vtx->c;
-	vslc_vtx_reset(cp[i]);
-	cp[i]->c.c.level = 0;
-	i++;
+	/* Build transaction array */
+	vslc_vtx_reset(&vtx->c);
+	trans[0].level = 1;
+	trans[0].vxid = vtx->key.vxid;
+	trans[0].type = vtx->type;
+	trans[0].c = &vtx->c.c.c;
+	i = 1;
+	j = 0;
 	while (j < i) {
-		vtx = VTAILQ_FIRST(&cp[j]->vtx->child);
-		while (vtx) {
+		CAST_OBJ_NOTNULL(c, (void *)trans[j].c, VSLC_VTX_MAGIC);
+		VTAILQ_FOREACH(vtx, &c->vtx->child, list_child) {
 			assert(i < n);
-			cp[i] = &vtx->c;
-			vslc_vtx_reset(cp[i]);
-			cp[i]->c.c.level = cp[j]->c.c.level + 1;
+			vslc_vtx_reset(&vtx->c);
+			trans[i].level = trans[j].level + 1;
+			trans[i].vxid = vtx->key.vxid;
+			trans[i].type = vtx->type;
+			trans[i].c = &vtx->c.c.c;
 			i++;
-			vtx = VTAILQ_NEXT(vtx, list_child);
 		}
 		j++;
 	}
 	assert(i == n);
-	cp[i] = NULL;
+
+	/* Build pointer array */
+	for (i = 0; i < n; i++)
+		ptrans[i] = &trans[i];
+	ptrans[i] = NULL;
 
 	/* Query test goes here */
-	if (vslq->query != NULL &&
-	    vslq_runquery(vslq->query, (struct VSL_cursor **)cp))
+	if (vslq->query != NULL && vslq_runquery(vslq->query, ptrans))
 		return (0);
 
 	/* Callback */
-	return ((func)(vslq->vsl, (struct VSL_cursor **)cp, priv));
+	return ((func)(vslq->vsl, ptrans, priv));
 }
 
 struct VSLQ *
@@ -835,20 +827,23 @@ static int
 vslq_raw(struct VSLQ *vslq, VSLQ_dispatch_f *func, void *priv)
 {
 	struct vslc_raw rawc;
+	struct VSL_transaction trans;
+	struct VSL_transaction *ptrans[2];
 	struct VSL_cursor *c;
-	struct VSL_cursor *pc[2];
 	int i;
 
 	assert(vslq->grouping == VSL_g_raw);
 	c = vslq->c;
 
 	memset(&rawc, 0, sizeof rawc);
-	rawc.c.c.vxid = -1;
 	rawc.c.magic = VSLC_MAGIC;
 	rawc.c.tbl = &vslc_raw_tbl;
 	rawc.magic = VSLC_RAW_MAGIC;
-	pc[0] = &rawc.c.c;
-	pc[1] = NULL;
+	trans.level = 0;
+	trans.type = VSL_t_raw;
+	trans.c = &rawc.c.c;
+	ptrans[0] = &trans;
+	ptrans[1] = NULL;
 
 	while (1) {
 		i = VSL_Next(c);
@@ -861,11 +856,14 @@ vslq_raw(struct VSLQ *vslq, VSLQ_dispatch_f *func, void *priv)
 		rawc.len = VSL_NEXT(c->rec.ptr) - c->rec.ptr;
 		rawc.next = rawc.start;
 		rawc.c.c.rec.ptr = NULL;
+		trans.vxid = VSL_ID(c->rec.ptr);
 
 		/* Query check goes here */
-		i = 0;
-		if (vslq->query == NULL ? 1 : vslq_runquery(vslq->query, pc))
-			i = (func)(vslq->vsl, pc, priv);
+		if (vslq->query != NULL && vslq_runquery(vslq->query, ptrans))
+			continue;
+
+		/* Callback */
+		i = (func)(vslq->vsl, ptrans, priv);
 		if (i)
 			break;
 	}
diff --git a/lib/libvarnishapi/vsl_query.c b/lib/libvarnishapi/vsl_query.c
index 852f8d3..20efff4 100644
--- a/lib/libvarnishapi/vsl_query.c
+++ b/lib/libvarnishapi/vsl_query.c
@@ -88,8 +88,9 @@ vslq_deletequery(struct vslq_query **pquery)
 }
 
 int
-vslq_runquery(struct vslq_query *query, struct VSL_cursor *cp[])
+vslq_runquery(struct vslq_query *query, struct VSL_transaction *ptrans[])
 {
+	struct VSL_transaction *t;
 	struct VSL_cursor *c;
 	int i, len;
 	const char *data;
@@ -97,8 +98,9 @@ vslq_runquery(struct vslq_query *query, struct VSL_cursor *cp[])
 	CHECK_OBJ_NOTNULL(query, VSLQ_QUERY_MAGIC);
 	AN(query->regex);
 
-	c = cp[0];
-	while (c) {
+	t = ptrans[0];
+	while (t) {
+		c = t->c;
 		while (1) {
 			i = VSL_Next(c);
 			if (i == 0)
@@ -115,7 +117,7 @@ vslq_runquery(struct vslq_query *query, struct VSL_cursor *cp[])
 			}
 		}
 		AZ(VSL_ResetCursor(c));
-		c = *++cp;
+		t = *++ptrans;
 	}
 
 	return (0);



More information about the varnish-commit mailing list