You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by pa...@apache.org on 2018/05/21 22:02:29 UTC

[trafficserver] branch master updated: CacheTool: Fix Unmarshal code and check for loops while scanning

This is an automated email from the ASF dual-hosted git repository.

paziz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new 052bf40  CacheTool: Fix Unmarshal code and check for loops while scanning
052bf40 is described below

commit 052bf4000f93fc63ee5bd95d3e1064a1fdace37c
Author: Persia Aziz <pe...@yahoo-inc.com>
AuthorDate: Tue May 15 17:01:55 2018 -0500

    CacheTool: Fix Unmarshal code and check for loops while scanning
---
 cmd/traffic_cache_tool/CacheScan.cc | 77 +++++++++++++++++++++++++++----------
 cmd/traffic_cache_tool/CacheScan.h  |  3 +-
 2 files changed, 59 insertions(+), 21 deletions(-)

diff --git a/cmd/traffic_cache_tool/CacheScan.cc b/cmd/traffic_cache_tool/CacheScan.cc
index f365869..43e7aae 100644
--- a/cmd/traffic_cache_tool/CacheScan.cc
+++ b/cmd/traffic_cache_tool/CacheScan.cc
@@ -38,13 +38,21 @@ CacheScan::Scan()
 {
   int64_t guessed_size = 1048576; // 1M
   Errata zret;
+  std::bitset<65536> dir_bitset;
   char *stripe_buff2 = (char *)ats_memalign(ats_pagesize(), guessed_size);
   for (int s = 0; s < this->stripe->_segments; s++) {
+    dir_bitset.reset();
     for (int b = 0; b < this->stripe->_buckets; b++) {
       CacheDirEntry *seg = this->stripe->dir_segment(s);
       CacheDirEntry *e   = dir_bucket(b, seg);
       if (dir_offset(e)) {
         do {
+          if (dir_bitset[dir_to_offset(e, seg)]) {
+            std::string str = "Loop detected in stripe " + this->stripe->hashText + " segment: " + std::to_string(s) +
+                              " bucket: " + std::to_string(b);
+            std::cout << str << std::endl;
+            break;
+          }
           int64_t size = dir_approx_size(e);
           if (size > guessed_size) {
             ats_free(stripe_buff2);
@@ -58,7 +66,8 @@ CacheScan::Scan()
           Doc *doc = reinterpret_cast<Doc *>(stripe_buff2);
           get_alternates(doc->hdr(), doc->hlen);
 
-          e = next_dir(e, seg);
+          dir_bitset[dir_to_offset(e, seg)] = true;
+          e                                 = next_dir(e, seg);
         } while (e);
       }
     }
@@ -128,9 +137,32 @@ CacheScan::unmarshal(URLImpl *obj, intptr_t offset)
 }
 
 Errata
-CacheScan::unmarshal(HdrHeap *hh, int buf_length, int obj_type, HdrHeapObjImpl **found_obj, RefCountObj *block_ref)
+CacheScan::unmarshal(MIMEFieldBlockImpl *mf, intptr_t offset)
 {
   Errata zret;
+  HDR_UNMARSHAL_PTR(mf->m_next, MIMEFieldBlockImpl, offset);
+
+  for (uint32_t index = 0; index < mf->m_freetop; index++) {
+    MIMEField *field = &(mf->m_field_slots[index]);
+
+    if (field->is_live()) {
+      HDR_UNMARSHAL_STR(field->m_ptr_name, offset);
+      HDR_UNMARSHAL_STR(field->m_ptr_value, offset);
+      if (field->m_next_dup) {
+        HDR_UNMARSHAL_PTR(field->m_next_dup, MIMEField, offset);
+      }
+    } else {
+      // Clear out other types of slots
+      field->m_readiness = MIME_FIELD_SLOT_READINESS_EMPTY;
+    }
+  }
+  return zret;
+}
+
+int
+CacheScan::unmarshal(HdrHeap *hh, int buf_length, int obj_type, HdrHeapObjImpl **found_obj, RefCountObj *block_ref)
+{
+  int zret   = -1;
   *found_obj = nullptr;
 
   // Check out this heap and make sure it is OK
@@ -192,9 +224,9 @@ CacheScan::unmarshal(HdrHeap *hh, int buf_length, int obj_type, HdrHeapObjImpl *
     case HDR_HEAP_OBJ_URL:
       this->unmarshal((URLImpl *)obj, offset);
       break;
-    //        case HDR_HEAP_OBJ_FIELD_BLOCK:
-    //          this->unmarshal((MIMEFieldBlockImpl *)obj,offset);
-    //          break;
+    case HDR_HEAP_OBJ_FIELD_BLOCK:
+      this->unmarshal((MIMEFieldBlockImpl *)obj, offset);
+      break;
     case HDR_HEAP_OBJ_MIME_HEADER:
       this->unmarshal((MIMEHdrImpl *)obj, offset);
       break;
@@ -202,8 +234,8 @@ CacheScan::unmarshal(HdrHeap *hh, int buf_length, int obj_type, HdrHeapObjImpl *
     //      // Nothing to do
     //      break;
     default:
-      zret.push(0, 0, "WARNING: Unmarshal failed due to unknow obj type ", (int)obj->m_type, " after ",
-                (int)(obj_data - (char *)this), " bytes");
+      std::cout << "WARNING: Unmarshal failed due to unknown obj type " << (int)obj->m_type << " after "
+                << (int)(obj_data - (char *)hh) << " bytes" << std::endl;
       // dump_heap(unmarshal_size);
       return zret;
     }
@@ -213,8 +245,8 @@ CacheScan::unmarshal(HdrHeap *hh, int buf_length, int obj_type, HdrHeapObjImpl *
 
   hh->m_magic = HDR_BUF_MAGIC_ALIVE;
 
-  // hh->unmarshal_size = ROUND(unmarshal_size, HDR_PTR_SIZE);
-  return zret;
+  int unmarshal_length = ROUND(hh->unmarshal_size(), HDR_PTR_SIZE);
+  return unmarshal_length;
 }
 
 Errata
@@ -272,7 +304,7 @@ CacheScan::unmarshal(char *buf, int len, RefCountObj *block_ref)
   if (heap != nullptr) {
     tmp = this->unmarshal(heap, len, HDR_HEAP_OBJ_HTTP_HEADER, (HdrHeapObjImpl **)&hh, block_ref);
     if (hh == nullptr || tmp < 0) {
-      ink_assert(!"HTTPInfo::request unmarshal failed");
+      zret.push(0, 0, "HTTPInfo::request unmarshal failed");
       return zret;
     }
     len -= tmp;
@@ -286,9 +318,9 @@ CacheScan::unmarshal(char *buf, int len, RefCountObj *block_ref)
 
   heap = (HdrHeap *)(alt->m_response_hdr.m_heap ? (buf + (intptr_t)alt->m_response_hdr.m_heap) : nullptr);
   if (heap != nullptr) {
-    // tmp = heap->unmarshal(len, HDR_HEAP_OBJ_HTTP_HEADER, (HdrHeapObjImpl **)&hh, block_ref);
+    tmp = this->unmarshal(heap, len, HDR_HEAP_OBJ_HTTP_HEADER, (HdrHeapObjImpl **)&hh, block_ref);
     if (hh == nullptr || tmp < 0) {
-      ink_assert(!"HTTPInfo::response unmarshal failed");
+      zret.push(0, 0, "HTTPInfo::response unmarshal failed");
       return zret;
     }
     len -= tmp;
@@ -316,14 +348,19 @@ CacheScan::get_alternates(const char *buf, int length)
     HTTPCacheAlt *a = (HTTPCacheAlt *)buf;
 
     if (a->m_magic == CACHE_ALT_MAGIC_MARSHALED) {
-      this->unmarshal((char *)buf, length, block_ref);
-      //        std::cout << "alternate unmarshal failed" << std::endl;
-      //      }
-      auto *url       = a->m_request_hdr.m_http->u.req.m_url_impl;
-      std::string str = "stripe: " + this->stripe->hashText + " : " + std::string(url->m_ptr_scheme, url->m_len_scheme) + "://" +
-                        std::string(url->m_ptr_host, url->m_len_host) + ":" + std::string(url->m_ptr_port, url->m_len_port) + "/" +
-                        std::string(url->m_ptr_path, url->m_len_path) + ";" + std::string(url->m_ptr_params, url->m_len_params) +
-                        "?" + std::string(url->m_ptr_query, url->m_len_query);
+      zret = this->unmarshal((char *)buf, length, block_ref);
+      if (zret.size()) {
+        std::cerr << zret << std::endl;
+        return zret;
+      }
+
+      auto *url = a->m_request_hdr.m_http->u.req.m_url_impl;
+      std::string str;
+      ts::bwprint(str, "stripe: {} : {}://{}:{}/{};{}?{}", std::string_view(this->stripe->hashText),
+                  std::string_view(url->m_ptr_scheme, url->m_len_scheme), std::string_view(url->m_ptr_host, url->m_len_host),
+                  std::string_view(url->m_ptr_port, url->m_len_port), std::string_view(url->m_ptr_path, url->m_len_path),
+                  std::string_view(url->m_ptr_params, url->m_len_params), std::string_view(url->m_ptr_query, url->m_len_query));
+
       std::cout << str << std::endl;
     } else {
       // std::cout << "alternate retrieval failed" << std::endl;
diff --git a/cmd/traffic_cache_tool/CacheScan.h b/cmd/traffic_cache_tool/CacheScan.h
index b0f2a00..c10fb87 100644
--- a/cmd/traffic_cache_tool/CacheScan.h
+++ b/cmd/traffic_cache_tool/CacheScan.h
@@ -43,13 +43,14 @@ class CacheScan
 
 public:
   CacheScan(Stripe *str) : stripe(str){};
+  int unmarshal(HdrHeap *hh, int buf_length, int obj_type, HdrHeapObjImpl **found_obj, RefCountObj *block_ref);
   Errata Scan();
   Errata get_alternates(const char *buf, int length);
   Errata unmarshal(char *buf, int len, RefCountObj *block_ref);
-  Errata unmarshal(HdrHeap *hh, int buf_length, int obj_type, HdrHeapObjImpl **found_obj, RefCountObj *block_ref);
   Errata unmarshal(HTTPHdrImpl *obj, intptr_t offset);
   Errata unmarshal(MIMEHdrImpl *obj, intptr_t offset);
   Errata unmarshal(URLImpl *obj, intptr_t offset);
+  Errata unmarshal(MIMEFieldBlockImpl *mf, intptr_t offset);
 };
 } // namespace ct
 

-- 
To stop receiving notification emails like this one, please contact
paziz@apache.org.