[master] 76ee005 Emit VSL warnings as synth log records while scanning the shmlog

Martin Blix Grydeland martin at varnish-cache.org
Wed Jun 26 14:45:26 CEST 2013


commit 76ee00515bb6b31c3f648aef03785914fe001475
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date:   Wed Jun 26 14:42:23 2013 +0200

    Emit VSL warnings as synth log records while scanning the shmlog

diff --git a/include/tbl/vsl_tags.h b/include/tbl/vsl_tags.h
index 25ba677..827a231 100644
--- a/include/tbl/vsl_tags.h
+++ b/include/tbl/vsl_tags.h
@@ -184,3 +184,8 @@ SLTM(Begin, "Marks the start of a VXID",
 SLTM(End, "Marks the end of a VXID",
     "The last record of a VXID transaction.\n"
 )
+
+SLTM(VSL, "Internally generated VSL API warnings and error message",
+    "Warnings and error messages genererated by the VSL API while reading the"
+    " shared memory log"
+)
diff --git a/lib/libvarnishapi/vsl_dispatch.c b/lib/libvarnishapi/vsl_dispatch.c
index 79fb02a..b74c1d45 100644
--- a/lib/libvarnishapi/vsl_dispatch.c
+++ b/lib/libvarnishapi/vsl_dispatch.c
@@ -135,6 +135,10 @@ struct VSLQ {
 	unsigned		n_cache;
 };
 
+static int vtx_diag(struct VSLQ *vslq, struct vtx *vtx, const char *fmt, ...);
+static int vtx_diag_tag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr,
+    const char *reason);
+
 static inline int
 vtx_keycmp(const struct vtx_key *a, const struct vtx_key *b)
 {
@@ -149,29 +153,6 @@ VRB_PROTOTYPE(vtx_tree, vtx_key, entry, vtx_keycmp);
 VRB_GENERATE(vtx_tree, vtx_key, entry, vtx_keycmp);
 
 static int
-vtx_diag(struct vtx *vtx, const char *fmt, ...)
-{
-	va_list ap;
-
-	/* XXX: Prepend diagnostic message on vtx as a synthetic log
-	   record. For now print to stderr */
-	fprintf(stderr, "vtx_diag <%u>: ", vtx->key.vxid);
-	va_start(ap, fmt);
-	vfprintf(stderr, fmt, ap);
-	va_end(ap);
-	fprintf(stderr, "\n");
-
-	return (-1);
-}
-
-static int
-vtx_diag_tag(struct vtx *vtx, const uint32_t *ptr, const char *reason)
-{
-	return (vtx_diag(vtx, "%s (%s: %.*s)", reason, VSL_tags[VSL_TAG(ptr)],
-		(int)VSL_LEN(ptr), VSL_CDATA(ptr)));
-}
-
-static int
 vslc_raw_next(void *cursor)
 {
 	struct vslc_raw *c;
@@ -401,6 +382,7 @@ vtx_set_bufsize(struct vtx *vtx, ssize_t len)
 	while (vtx->bufsize < len)
 		vtx->bufsize *= 2;
 	vtx->buf = realloc(vtx->buf, sizeof (uint32_t) * vtx->bufsize);
+	AN(vtx->buf);
 }
 
 static void
@@ -471,7 +453,7 @@ vtx_check_ready(struct VSLQ *vslq, struct vtx *vtx)
 	AZ(vtx->flags & VTX_F_READY);
 
 	if (vtx->type == VSL_t_unknown)
-		vtx_diag(vtx, "vtx of unknown type marked complete");
+		vtx_diag(vslq, vtx, "vtx of unknown type marked complete");
 
 	ready = vtx;
 	while (1) {
@@ -555,16 +537,16 @@ vtx_scan_begintag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr)
 	assert(VSL_TAG(ptr) == SLT_Begin);
 
 	if (vtx->flags & VTX_F_READY)
-		return (vtx_diag_tag(vtx, ptr, "link too late"));
+		return (vtx_diag_tag(vslq, vtx, ptr, "link too late"));
 
 	i = vtx_parsetag_bl(VSL_CDATA(ptr), VSL_LEN(ptr), &type, &p_vxid);
 	if (i < 1)
-		return (vtx_diag_tag(vtx, ptr, "parse error"));
+		return (vtx_diag_tag(vslq, vtx, ptr, "parse error"));
 
 	/* Check/set vtx type */
 	assert(type != VSL_t_unknown);
 	if (vtx->type != VSL_t_unknown && vtx->type != type)
-		return (vtx_diag_tag(vtx, ptr, "type mismatch"));
+		return (vtx_diag_tag(vslq, vtx, ptr, "type mismatch"));
 	vtx->type = type;
 
 	if (i == 1 || p_vxid == 0)
@@ -583,9 +565,9 @@ vtx_scan_begintag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr)
 		return (0);
 
 	if (vtx->parent != NULL)
-		return (vtx_diag_tag(vtx, ptr, "duplicate link"));
+		return (vtx_diag_tag(vslq, vtx, ptr, "duplicate link"));
 	if (p_vtx->flags & VTX_F_READY)
-		return (vtx_diag_tag(vtx, ptr, "link too late"));
+		return (vtx_diag_tag(vslq, vtx, ptr, "link too late"));
 
 	vtx_set_parent(p_vtx, vtx);
 
@@ -603,11 +585,11 @@ vtx_scan_linktag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr)
 	assert(VSL_TAG(ptr) == SLT_Link);
 
 	if (vtx->flags & VTX_F_READY)
-		return (vtx_diag_tag(vtx, ptr, "link too late"));
+		return (vtx_diag_tag(vslq, vtx, ptr, "link too late"));
 
 	i = vtx_parsetag_bl(VSL_CDATA(ptr), VSL_LEN(ptr), &c_type, &c_vxid);
 	if (i < 2)
-		return (vtx_diag_tag(vtx, ptr, "parse error"));
+		return (vtx_diag_tag(vslq, vtx, ptr, "parse error"));
 	assert(i == 2);
 
 	if (vslq->grouping == VSL_g_vxid)
@@ -622,11 +604,11 @@ vtx_scan_linktag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr)
 		/* Link already exists */
 		return (0);
 	if (c_vtx->parent != NULL)
-		return (vtx_diag_tag(vtx, ptr, "duplicate link"));
+		return (vtx_diag_tag(vslq, vtx, ptr, "duplicate link"));
 	if (c_vtx->flags & VTX_F_READY)
-		return (vtx_diag_tag(vtx, ptr, "link too late"));
+		return (vtx_diag_tag(vslq, vtx, ptr, "link too late"));
 	if (c_vtx->type != VSL_t_unknown && c_vtx->type != c_type)
-		return (vtx_diag_tag(vtx, ptr, "type mismatch"));
+		return (vtx_diag_tag(vslq, vtx, ptr, "type mismatch"));
 	c_vtx->type = c_type;
 
 	vtx_set_parent(vtx, c_vtx);
@@ -648,13 +630,17 @@ vtx_scan(struct VSLQ *vslq, struct vtx *vtx)
 		if (tag == SLT__Batch)
 			continue;
 
+		if (tag == SLT_VSL)
+			/* Don't process these to avoid looping */
+			continue;
+
 		if (vtx->flags & VTX_F_COMPLETE) {
-			vtx_diag_tag(vtx, ptr, "late log rec");
+			vtx_diag_tag(vslq, vtx, ptr, "late log rec");
 			continue;
 		}
 
 		if (vtx->type == VSL_t_unknown && tag != SLT_Begin)
-			vtx_diag_tag(vtx, ptr, "early log rec");
+			vtx_diag_tag(vslq, vtx, ptr, "early log rec");
 
 		switch (tag) {
 		case SLT_Begin:
@@ -688,7 +674,7 @@ vtx_force(struct VSLQ *vslq, struct vtx *vtx, const char *reason)
 {
 	AZ(vtx->flags & VTX_F_COMPLETE);
 	AZ(vtx->flags & VTX_F_READY);
-	vtx_diag(vtx, reason);
+	vtx_diag(vslq, vtx, reason);
 
 	VTAILQ_REMOVE(&vslq->incomplete, vtx, list_incomplete);
 	vtx->flags |= VTX_F_COMPLETE;
@@ -756,6 +742,38 @@ vslq_callback(struct VSLQ *vslq, struct vtx *vtx, VSLQ_dispatch_f *func,
 	return ((func)(vslq->vsl, ptrans, priv));
 }
 
+static int
+vtx_diag(struct VSLQ *vslq, struct vtx *vtx, const char *fmt, ...)
+{
+	va_list ap;
+	uint32_t buf[256];
+	int i, len;
+	struct VSLC_ptr rec;
+
+	len = sizeof buf - 2 * sizeof (uint32_t);
+	va_start(ap, fmt);
+	i = vsnprintf((char *)&buf[2], len, fmt, ap);
+	assert(i >= 0);
+	va_end(ap);
+	if (i < len)
+		len = i;
+	buf[1] = vtx->key.vxid;
+	buf[0] = ((((unsigned)SLT_VSL & 0xff) << 24) | len);
+	rec.ptr = buf;
+	rec.priv = 0;
+	vtx_append(vslq, vtx, &rec, VSL_NEXT(rec.ptr) - rec.ptr, 1);
+
+	return (-1);
+}
+
+static int
+vtx_diag_tag(struct VSLQ *vslq, struct vtx *vtx, const uint32_t *ptr,
+    const char *reason)
+{
+	return (vtx_diag(vslq, vtx, "%s (%s: %.*s)", reason,
+		VSL_tags[VSL_TAG(ptr)],	(int)VSL_LEN(ptr), VSL_CDATA(ptr)));
+}
+
 struct VSLQ *
 VSLQ_New(struct VSL_data *vsl, struct VSL_cursor **cp,
     enum VSL_grouping_e grouping, const char *querystring)
@@ -904,7 +922,7 @@ VSLQ_Dispatch(struct VSLQ *vslq, VSLQ_dispatch_f *func, void *priv)
 
 		i = VSL_Next(c);
 		if (i != 1)
-			return (i);
+			break;
 		tag = VSL_TAG(c->rec.ptr);
 		if (tag == SLT__Batch) {
 			vxid = VSL_BATCHID(c->rec.ptr);
@@ -928,7 +946,7 @@ VSLQ_Dispatch(struct VSLQ *vslq, VSLQ_dispatch_f *func, void *priv)
 			vtx_retire(vslq, &vtx);
 			AZ(vtx);
 			if (i)
-				return (i);
+				break;
 		}
 	}
 	if (i)



More information about the varnish-commit mailing list