You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2014/07/30 20:20:25 UTC

git commit: TS-2975: add x-cache header to publish cache lookup status

Repository: trafficserver
Updated Branches:
  refs/heads/master de1bcc7a6 -> 0c8f9343c


TS-2975: add x-cache header to publish cache lookup status


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/0c8f9343
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/0c8f9343
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/0c8f9343

Branch: refs/heads/master
Commit: 0c8f9343c2d55c2469af36e368e0b7a86cf6def5
Parents: de1bcc7
Author: James Peach <jp...@apache.org>
Authored: Tue Jul 29 13:55:50 2014 -0700
Committer: James Peach <jp...@apache.org>
Committed: Wed Jul 30 11:20:04 2014 -0700

----------------------------------------------------------------------
 CHANGES                               |  2 ++
 doc/reference/plugins/xdebug.en.rst   | 13 +++++++
 plugins/experimental/xdebug/xdebug.cc | 58 ++++++++++++++++++++++++++++--
 3 files changed, 70 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0c8f9343/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 69df453..1295f23 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,8 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache Traffic Server 5.1.0
 
+  *) [TS-2975] Add cache lookup status support to the xdebug plugin.
+
   *) [TS-2974] Add a new metrics plugin to support the Epic monitoring system.
 
   *) [TS-2973] Add milestones support to the xdebug plugin.

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0c8f9343/doc/reference/plugins/xdebug.en.rst
----------------------------------------------------------------------
diff --git a/doc/reference/plugins/xdebug.en.rst b/doc/reference/plugins/xdebug.en.rst
index 003201f..0ee9197 100644
--- a/doc/reference/plugins/xdebug.en.rst
+++ b/doc/reference/plugins/xdebug.en.rst
@@ -46,6 +46,19 @@ X-Cache-Key
     Traffic Server cache. This header is particularly useful if a custom cache
     key is being used.
 
+X-Cache
+    The ``X-Cache`` header contains the results of any cache lookup.
+
+    ==========  ===========
+    Value       Description
+    ==========  ===========
+    none        No cache lookup was attempted.
+    miss        The object was not found in the cache.
+    hit-stale   The object was found in the cache, but it was stale.
+    hit-fresh   The object was fresh in the cache.
+    skipped     The cache lookup was skipped.
+    ==========  ===========
+
 X-Milestones
     The ``X-Milestones`` header contains detailed information about
     how long the transaction took to traverse portions of the HTTP

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/0c8f9343/plugins/experimental/xdebug/xdebug.cc
----------------------------------------------------------------------
diff --git a/plugins/experimental/xdebug/xdebug.cc b/plugins/experimental/xdebug/xdebug.cc
index 883f5ca..2d357c1 100644
--- a/plugins/experimental/xdebug/xdebug.cc
+++ b/plugins/experimental/xdebug/xdebug.cc
@@ -27,6 +27,7 @@
 
 #define XHEADER_X_CACHE_KEY   0x0004u
 #define XHEADER_X_MILESTONES  0x0008u
+#define XHEADER_X_CACHE       0x0010u
 
 static int XArgIndex = 0;
 static TSCont XInjectHeadersCont = NULL;
@@ -99,6 +100,47 @@ done:
 }
 
 static void
+InjectCacheHeader(TSHttpTxn txn, TSMBuffer buffer, TSMLoc hdr)
+{
+  TSMLoc dst = TS_NULL_MLOC;
+  int status;
+
+  static const char * names[] =
+  {
+    "miss" ,      // TS_CACHE_LOOKUP_MISS,
+    "hit-stale",  // TS_CACHE_LOOKUP_HIT_STALE,
+    "hit-fresh",  // TS_CACHE_LOOKUP_HIT_FRESH,
+    "skipped"     // TS_CACHE_LOOKUP_SKIPPED
+  };
+
+  TSDebug("xdebug", "attempting to inject X-Cache header");
+
+  // Create a new response header field.
+  dst = FindOrMakeHdrField(buffer, hdr, "X-Cache", lengthof("X-Cache"));
+  if (dst == TS_NULL_MLOC) {
+    goto done;
+  }
+
+  if (TSHttpTxnCacheLookupStatusGet(txn, &status) == TS_ERROR) {
+    // If the cache lookup hasn't happened yes, TSHttpTxnCacheLookupStatusGet will fail.
+    TSReleaseAssert(
+      TSMimeHdrFieldValueStringInsert(buffer, hdr, dst, 0 /* idx */, "none", 4) == TS_SUCCESS
+    );
+  } else {
+    const char * msg = (status < 0 || status >= (int)countof(names)) ? "unknown" : names[status];
+
+    TSReleaseAssert(
+      TSMimeHdrFieldValueStringInsert(buffer, hdr, dst, 0 /* idx */, msg, -1) == TS_SUCCESS
+    );
+  }
+
+done:
+  if (dst != TS_NULL_MLOC) {
+    TSHandleMLocRelease(buffer, hdr, dst);
+  }
+}
+
+static void
 InjectMilestonesHeader(TSHttpTxn txn, TSMBuffer buffer, TSMLoc hdr)
 {
   struct milestone {
@@ -188,6 +230,10 @@ XInjectResponseHeaders(TSCont /* contp */, TSEvent event, void * edata)
     InjectCacheKeyHeader(txn, buffer, hdr);
   }
 
+  if (xheaders & XHEADER_X_CACHE) {
+    InjectCacheHeader(txn, buffer, hdr);
+  }
+
   if (xheaders & XHEADER_X_MILESTONES) {
     InjectMilestonesHeader(txn, buffer, hdr);
   }
@@ -230,11 +276,15 @@ XScanRequestHeaders(TSCont /* contp */, TSEvent event, void * edata)
         continue;
       }
 
-      if (strncasecmp("x-cache-key", value, vsize) == 0) {
+#define header_field_eq(name, vptr, vlen) (((int)lengthof(name) == vlen) && (strncasecmp(name, vptr, vlen) == 0))
+
+      if (header_field_eq("x-cache-key", value, vsize)) {
         xheaders |= XHEADER_X_CACHE_KEY;
-      } else if (strncasecmp("x-milestones", value, vsize) == 0) {
+      } else if (header_field_eq("x-milestones", value, vsize)) {
         xheaders |= XHEADER_X_MILESTONES;
-      } else if (strncasecmp("via", value, vsize) == 0) {
+      } else if (header_field_eq("x-cache", value, vsize)) {
+        xheaders |= XHEADER_X_CACHE;
+      } else if (header_field_eq("via", value, vsize)) {
         // If the client requests the Via header, enable verbose Via debugging for this transaction.
         TSHttpTxnConfigIntSet(txn, TS_CONFIG_HTTP_INSERT_RESPONSE_VIA_STR, 3);
       } else {
@@ -242,6 +292,8 @@ XScanRequestHeaders(TSCont /* contp */, TSEvent event, void * edata)
       }
     }
 
+#undef header_field_eq
+
     // Get the next duplicate.
     next = TSMimeHdrFieldNextDup(buffer, hdr, field);