[master] d0dfe0a Rearrange the varnishhist loop

Martin Blix Grydeland martin at varnish-software.com
Tue Feb 25 15:58:40 CET 2014


commit d0dfe0ae50f74af49c8e0d5bcb41b0cc76973830
Author: Martin Blix Grydeland <martin at varnish-software.com>
Date:   Tue Feb 25 14:41:23 2014 +0100

    Rearrange the varnishhist loop
    
    Rearrange the varnishhist loop so that we can skip restarts from being
    counted and make it more readable.

diff --git a/bin/varnishhist/varnishhist.c b/bin/varnishhist/varnishhist.c
index faec821..b77d381 100644
--- a/bin/varnishhist/varnishhist.c
+++ b/bin/varnishhist/varnishhist.c
@@ -190,8 +190,7 @@ static int /*__match_proto__ (VSLQ_dispatch_f)*/
 accumulate(struct VSL_data *vsl, struct VSL_transaction * const pt[],
 	void *priv)
 {
-	int i, j;
-	unsigned tag, hit;
+	int i, j, tag, skip, match, hit;
 	double value;
 	struct VSL_transaction *tr;
 
@@ -205,62 +204,75 @@ accumulate(struct VSL_data *vsl, struct VSL_transaction * const pt[],
 		if (tr->reason == VSL_r_esi)
 			/* Skip ESI requests */
 			continue;
-		value = -1;
+
 		hit = 0;
-		while ((1 == VSL_Next(tr->c))) {
+		skip = 0;
+		match = 0;
+		while (skip == 0 && 1 == VSL_Next(tr->c)) {
 			/* get the value we want, and register if it's a hit*/
 			tag = VSL_TAG(tr->c->rec.ptr);
-			assert(match_tag >= 0);
-			if (tag == (unsigned)match_tag) {
+
+			switch (tag) {
+			case SLT_Hit:
+				hit = 1;
+				break;
+			case SLT_VCL_return:
+				if (!strcasecmp(VSL_CDATA(tr->c->rec.ptr),
+					"restart"))
+					skip = 1;
+				break;
+			default:
+				if (tag != match_tag)
+					break;
 				i = sscanf(VSL_CDATA(tr->c->rec.ptr), format,
 				    &value);
 				if (i != 1)
-					continue;
-			} else if (tag == SLT_Hit)
-				hit = 1;
-			if (tag != SLT_ReqEnd && value == -1)
-				continue;
-
-			/* select bucket */
-			i = HIST_RES * (log(value) / log_ten);
-			if (i < hist_low * HIST_RES)
-				i = hist_low * HIST_RES;
-			if (i >= hist_high * HIST_RES)
-				i = hist_high * HIST_RES - 1;
-			i -= hist_low * HIST_RES;
-			assert(i >= 0);
-			assert(i < hist_buckets);
-			pthread_mutex_lock(&mtx);
-
-			/* phase out old data */
-			if (nhist == HIST_N) {
-				j = rr_hist[next_hist];
-				if (j < 0) {
-					assert(bucket_miss[-j] > 0);
-					bucket_miss[-j]--;
-				} else {
-					assert(bucket_hit[j] > 0);
-					bucket_hit[j]--;
-				}
-			} else {
-				++nhist;
+					break;
+				match = 1;
+				break;
 			}
+		}
 
-			/* phase in new data */
-			if (hit) {
-				bucket_hit[i]++;
-				rr_hist[next_hist] = i;
+		if (skip || !match)
+			continue;
+
+		/* select bucket */
+		i = HIST_RES * (log(value) / log_ten);
+		if (i < hist_low * HIST_RES)
+			i = hist_low * HIST_RES;
+		if (i >= hist_high * HIST_RES)
+			i = hist_high * HIST_RES - 1;
+		i -= hist_low * HIST_RES;
+		assert(i >= 0);
+		assert(i < hist_buckets);
+		pthread_mutex_lock(&mtx);
+
+		/* phase out old data */
+		if (nhist == HIST_N) {
+			j = rr_hist[next_hist];
+			if (j < 0) {
+				assert(bucket_miss[-j] > 0);
+				bucket_miss[-j]--;
 			} else {
-				bucket_miss[i]++;
-				rr_hist[next_hist] = -i;
-			}
-			if (++next_hist == HIST_N) {
-				next_hist = 0;
+				assert(bucket_hit[j] > 0);
+				bucket_hit[j]--;
 			}
-			pthread_mutex_unlock(&mtx);
-
+		} else {
+			++nhist;
+		}
 
+		/* phase in new data */
+		if (hit) {
+			bucket_hit[i]++;
+			rr_hist[next_hist] = i;
+		} else {
+			bucket_miss[i]++;
+			rr_hist[next_hist] = -i;
 		}
+		if (++next_hist == HIST_N) {
+			next_hist = 0;
+		}
+		pthread_mutex_unlock(&mtx);
 	}
 	return (0);
 }



More information about the varnish-commit mailing list