You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2013/04/15 23:20:15 UTC

[46/50] git commit: TS-621 Allow caching of empty docs (currently only if a header Content-Length: 0 is in the response). New config option is named proxy.config.http.cache.allow_empty_doc, and is disabled by default.

TS-621 Allow caching of empty docs (currently only if a header
Content-Length: 0 is in the response). New config option is named
proxy.config.http.cache.allow_empty_doc, and is disabled by default.

We are aware this doesn't fully fix the problem, but is "good enough"
for now.

Reviews and minor cosmetic cleanup changes: James and Leif.


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

Branch: refs/heads/3.3.x
Commit: e2aff41f8d68144a0e90b1412c6006b784769af4
Parents: 80d1f32
Author: weijin <ta...@taobao.com>
Authored: Fri Apr 12 15:23:46 2013 -0600
Committer: Leif Hedstrom <zw...@apache.org>
Committed: Fri Apr 12 15:23:46 2013 -0600

----------------------------------------------------------------------
 CHANGES                                |    4 ++++
 iocore/cache/Cache.cc                  |   12 ++++++++++++
 iocore/cache/CacheWrite.cc             |   20 ++++++++++++++++----
 iocore/cache/P_CacheInternal.h         |    3 +++
 iocore/cache/P_CacheVol.h              |    2 +-
 mgmt/RecordsConfig.cc                  |    4 ++++
 proxy/config/records.config.default.in |    3 +++
 7 files changed, 43 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e2aff41f/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 3444721..dd1dcb5 100644
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,10 @@
   Changes with Apache Traffic Server 3.3.2
 
 
+  *) [TS-621] Allow caching of empty docs (currently only if a header
+   Content-Length: 0 is in the response). New config option is named
+   proxy.config.http.cache.allow_empty_doc, and is disabled by default.
+
   *) [TS-1778] Remove vestigal extensions.config support
 
   *) [TS-1806] bogus buffer sizing in CfgContextUtils.cc

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e2aff41f/iocore/cache/Cache.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/Cache.cc b/iocore/cache/Cache.cc
index d5ba29f..319aca3 100644
--- a/iocore/cache/Cache.cc
+++ b/iocore/cache/Cache.cc
@@ -79,6 +79,9 @@ int cache_config_alt_rewrite_max_size = 4096;
 int cache_config_read_while_writer = 0;
 char cache_system_config_directory[PATH_NAME_MAX + 1];
 int cache_config_mutex_retry_delay = 2;
+#ifdef HTTP_CACHE
+static int enable_cache_empty_http_doc = 0;
+#endif
 
 // Globals
 
@@ -458,6 +461,14 @@ CacheVC::set_http_info(CacheHTTPInfo *ainfo)
     ainfo->object_key_set(earliest_key);
     // don't know the total len yet
   }
+  if (enable_cache_empty_http_doc) {
+    MIMEField *field = ainfo->m_alt->m_response_hdr.field_find(MIME_FIELD_CONTENT_LENGTH, MIME_LEN_CONTENT_LENGTH);
+    if (field && !field->value_get_int64()) 
+      f.allow_empty_doc = 1;
+    else
+      f.allow_empty_doc = 0;
+  } else 
+    f.allow_empty_doc = 0;
   alternate.copy_shallow(ainfo);
   ainfo->clear();
 }
@@ -2819,6 +2830,7 @@ ink_cache_init(ModuleVersion v)
   //  # 1 - MMH hash
   REC_EstablishStaticConfigInt32(url_hash_method, "proxy.config.cache.url_hash_method");
   Debug("cache_init", "proxy.config.cache.url_hash_method = %d", url_hash_method);
+  REC_EstablishStaticConfigInt32(enable_cache_empty_http_doc, "proxy.config.http.cache.allow_empty_doc");
 #endif
 
   REC_EstablishStaticConfigInt32(cache_config_max_disk_errors, "proxy.config.cache.max_disk_errors");

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e2aff41f/iocore/cache/CacheWrite.cc
----------------------------------------------------------------------
diff --git a/iocore/cache/CacheWrite.cc b/iocore/cache/CacheWrite.cc
index b93839d..5160eff 100644
--- a/iocore/cache/CacheWrite.cc
+++ b/iocore/cache/CacheWrite.cc
@@ -779,7 +779,11 @@ agg_copy(char *p, CacheVC *vc)
     }
 
     if (vc->f.use_first_key) {
-      if (doc->data_len())
+      if (doc->data_len()
+#ifdef HTTP_CACHE
+                  || vc->f.allow_empty_doc
+#endif
+                  )
         doc->key = vc->earliest_key;
       else // the vector is being written by itself
         prev_CacheKey(&doc->key, &vc->earliest_key);
@@ -1122,7 +1126,11 @@ CacheVC::openWriteCloseDir(int event, Event *e)
   // one, two and three or more fragments. This is because for
   // updates we dont decrement the variable corresponding the old
   // size of the document
-  if ((closed == 1) && (total_len > 0)) {
+  if ((closed == 1) && (total_len > 0
+#ifdef HTTP_CACHE
+                  || f.allow_empty_doc
+#endif
+                  )) {
     DDebug("cache_stats", "Fragment = %d", fragment);
     switch (fragment) {
       case 0: CACHE_INCREMENT_DYN_STAT(cache_single_fragment_document_count_stat); break;
@@ -1270,10 +1278,14 @@ CacheVC::openWriteClose(int event, Event *e)
     if (!io.ok())
       return openWriteCloseDir(event, e);
   }
-  if (closed > 0) {
+  if (closed > 0
+#ifdef HTTP_CACHE
+                  || f.allow_empty_doc
+#endif
+                  ) {
     if (total_len == 0) {
 #ifdef HTTP_CACHE
-      if (f.update) {
+      if (f.update || f.allow_empty_doc) {
         return updateVector(event, e);
       } else {
         // If we've been CLOSE'd but nothing has been written then

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e2aff41f/iocore/cache/P_CacheInternal.h
----------------------------------------------------------------------
diff --git a/iocore/cache/P_CacheInternal.h b/iocore/cache/P_CacheInternal.h
index b65cb65..634a1bc 100644
--- a/iocore/cache/P_CacheInternal.h
+++ b/iocore/cache/P_CacheInternal.h
@@ -485,6 +485,9 @@ struct CacheVC: public CacheVConnection
 #ifdef HIT_EVACUATE
       unsigned int hit_evacuate:1;
 #endif
+#ifdef HTTP_CACHE
+      unsigned int allow_empty_doc:1; // used for cache empty http document
+#endif
     } f;
   };
   // BTF optimization used to skip reading stuff in cache partition that doesn't contain any

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e2aff41f/iocore/cache/P_CacheVol.h
----------------------------------------------------------------------
diff --git a/iocore/cache/P_CacheVol.h b/iocore/cache/P_CacheVol.h
index dc183a7..4df3f0f 100644
--- a/iocore/cache/P_CacheVol.h
+++ b/iocore/cache/P_CacheVol.h
@@ -423,7 +423,7 @@ Doc::data_len()
 TS_INLINE int
 Doc::single_fragment()
 {
-  return (total_len && (data_len() == total_len));
+  return (data_len() == total_len);
 }
 
 TS_INLINE char *

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e2aff41f/mgmt/RecordsConfig.cc
----------------------------------------------------------------------
diff --git a/mgmt/RecordsConfig.cc b/mgmt/RecordsConfig.cc
index 55b0cb8..3185e2c 100644
--- a/mgmt/RecordsConfig.cc
+++ b/mgmt/RecordsConfig.cc
@@ -629,6 +629,10 @@ RecordElement RecordsConfig[] = {
   //        #################
   {RECT_CONFIG, "proxy.config.http.cache.http", RECD_INT, "1", RECU_DYNAMIC, RR_NULL, RECC_INT, "[0-1]", RECA_NULL}
   ,
+  // Enabling this setting allows the proxy to cache empty documents. This currently requires
+  // that the response has a Content-Length: header, with a value of "0".
+  {RECT_CONFIG, "proxy.config.http.cache.allow_empty_doc", RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_NULL, "[0-1]", RECA_NULL }
+  ,
   {RECT_CONFIG, "proxy.config.http.cache.cluster_cache_local", RECD_INT, "0", RECU_DYNAMIC, RR_NULL, RECC_INT, "[0-1]", RECA_NULL}
   ,
   {RECT_CONFIG, "proxy.config.http.cache.ignore_client_no_cache", RECD_INT, "1", RECU_DYNAMIC, RR_NULL, RECC_INT, "[0-1]", RECA_NULL}

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/e2aff41f/proxy/config/records.config.default.in
----------------------------------------------------------------------
diff --git a/proxy/config/records.config.default.in b/proxy/config/records.config.default.in
index 9e396f0..7b39d07 100644
--- a/proxy/config/records.config.default.in
+++ b/proxy/config/records.config.default.in
@@ -218,6 +218,9 @@ CONFIG proxy.config.http.push_method_enabled INT 0
    # cache control #
    #################
 CONFIG proxy.config.http.cache.http INT 1
+   # Enabling this setting allows the proxy to cache empty documents. This currently
+   # requires that the response has a Content-Length: header, with a value of "0".
+CONFIG proxy.config.http.cache.allow_empty_doc INT 0
 CONFIG proxy.config.http.cache.ignore_client_no_cache INT 1
 CONFIG proxy.config.http.cache.ims_on_client_no_cache INT 1
 CONFIG proxy.config.http.cache.ignore_server_no_cache INT 0