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 2010/01/28 03:22:27 UTC

svn commit: r903943 - in /incubator/trafficserver/traffic/trunk/iocore/cache: CacheDir.cc P_CacheDir.h

Author: jplevyak
Date: Thu Jan 28 02:22:26 2010
New Revision: 903943

URL: http://svn.apache.org/viewvc?rev=903943&view=rev
Log:
TS-74: fix Cache_dir regression

Modified:
    incubator/trafficserver/traffic/trunk/iocore/cache/CacheDir.cc
    incubator/trafficserver/traffic/trunk/iocore/cache/P_CacheDir.h

Modified: incubator/trafficserver/traffic/trunk/iocore/cache/CacheDir.cc
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/cache/CacheDir.cc?rev=903943&r1=903942&r2=903943&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/cache/CacheDir.cc (original)
+++ incubator/trafficserver/traffic/trunk/iocore/cache/CacheDir.cc Thu Jan 28 02:22:26 2010
@@ -24,7 +24,7 @@
 
 #include "P_Cache.h"
 
-#define LOOP_CHECK_MODE
+// #define LOOP_CHECK_MODE 1
 #ifdef LOOP_CHECK_MODE
 #define DIR_LOOP_THRESHOLD	      1000
 #endif
@@ -295,8 +295,10 @@
   Dir *e = b;
   int i = 0;
   Dir *seg = dir_segment(s, d);
+#ifdef LOOP_CHECK_MODE
   if (dir_bucket_loop_fix(b, s, d))
     return 1;
+#endif
   while (e) {
     i++;
     if (i > 100)
@@ -306,22 +308,21 @@
   return i;
 }
 
-
-void
+int
 check_dir(Part * d)
 {
   int i, s;
   Debug("cache_check_dir", "inside check dir");
   for (s = 0; s < DIR_SEGMENTS; s++) {
     Dir *seg = dir_segment(s, d);
-    ink_debug_assert(dir_bucket_loop_check(dir_from_offset(d->header->freelist[s], seg), seg));
     for (i = 0; i < d->buckets; i++) {
-      Dir RELEASE_UNUSED *b = dir_bucket(i, seg);
-      ink_debug_assert(dir_bucket_length(b, s, d) >= 0);
-      ink_debug_assert(!dir_next(b) || dir_offset(b));
-      ink_debug_assert(dir_bucket_loop_check(b, seg));
+      Dir *b = dir_bucket(i, seg);
+      if (!(dir_bucket_length(b, s, d) >= 0)) return 0;
+      if (!(!dir_next(b) || dir_offset(b))) return 0;
+      if (!(dir_bucket_loop_check(b, seg))) return 0;
     }
   }
+  return 1;
 }
 
 inline void
@@ -372,7 +373,9 @@
 {
   Dir *e = b, *p = NULL;
   Dir *seg = dir_segment(s, part);
+#ifdef LOOP_CHECK_MODE
   int loop_count = 0;
+#endif
   do {
 #ifdef LOOP_CHECK_MODE
     loop_count++;
@@ -678,8 +681,10 @@
   Dir *b = dir_bucket(bi, seg);
   unsigned int t = DIR_MASK_TAG(key->word(1));
   int res = 1;
+#ifdef LOOP_CHECK_MODE
   int loop_count = 0;
   bool loop_possible = true;
+#endif
   Part *part = d;
 #if defined(DEBUG) && defined(CHECK_DIR)
   check_dir(d);
@@ -750,7 +755,9 @@
   int b = (key->word(0) / DIR_SEGMENTS) % d->buckets;
   Dir *seg = dir_segment(s, d);
   Dir *e = NULL, *p = NULL;
+#ifdef LOOP_CHECK_MODE
   int loop_count = 0;
+#endif
   Part *part = d;
 #if defined(DEBUG) && defined(CHECK_DIR)
   check_dir(d);
@@ -924,7 +931,6 @@
 inku64
 dir_entries_used(Part * d)
 {
-
   inku64 full = 0;
   inku64 sfull = 0;
   for (int s = 0; s < DIR_SEGMENTS; full += sfull, s++) {
@@ -939,7 +945,6 @@
       while (e) {
         if (dir_offset(e))
           sfull++;
-
         e = next_dir(e, seg);
         if (!e)
           break;
@@ -1340,7 +1345,7 @@
     ink_release_assert(e);
     e = next_dir(e, seg);
   }
-  dir_next(e) = dir_to_offset(e, seg);
+  dir_set_next(e, dir_to_offset(e, seg));
 }
 
 struct CacheDirReg:Continuation
@@ -1457,30 +1462,19 @@
   }
 
 
-  /* introduce loops */
-  /* in bucket */
-#if 0
-  for (int sno = 0; sno < DIR_SEGMENTS; sno++) {
-    for (int bno = 0; bno < d->buckets; bno++) {
-      // coverity[secure_coding]
-      if (drand48() < 0.01)
-        rprintf(t, "creating loop in bucket %d, seg %d\n", bno, sno);
-      dir_corrupt_bucket(dir_bucket(bno, dir_segment(sno, d)), sno, d);
-    }
-  }
-
-#else
-  Dir *last_collision = 0, *seg1 = 0;
+  Dir dir1;
+  memset(&dir1, 0, sizeof(Dir));
   int s1, b1;
 
-  for (int ntimes = 0; ntimes < 1000; ntimes++) {
+  for (int ntimes = 0; ntimes < 10; ntimes++) {
+#ifdef LOOP_CHECK_MODE
     rprintf(t, "dir_probe in bucket with loop\n");
     rand_CacheKey(&key, thread->mutex);
     s1 = key.word(0) % DIR_SEGMENTS;
     b1 = (key.word(0) / DIR_SEGMENTS) % d->buckets;
     dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d);
     dir_insert(&key, d, &dir);
-    last_collision = 0;
+    Dir *last_collision = 0;
     dir_probe(&key, d, &dir, &last_collision);
 
 
@@ -1498,7 +1492,7 @@
     b1 = (key.word(0) / DIR_SEGMENTS) % d->buckets;
     CacheKey key1;
     key1.b[1] = 127;
-    Dir dir1 = dir;
+    dir1 = dir;
     dir_set_offset(&dir1, 23);
     dir_insert(&key1, d, &dir1);
     dir_insert(&key, d, &dir);
@@ -1518,7 +1512,7 @@
 
     rand_CacheKey(&key, thread->mutex);
     s1 = key.word(0) % DIR_SEGMENTS;
-    seg1 = dir_segment(s1, d);
+    Dir *seg1 = dir_segment(s1, d);
     rprintf(t, "dir_freelist_length in freelist with loop: segment %d\n", s1);
     dir_corrupt_bucket(dir_from_offset(d->header->freelist[s], seg1), s1, d);
     dir_freelist_length(d, s1);
@@ -1532,19 +1526,22 @@
     dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d);
     dir_bucket_length(dir_bucket(b1, dir_segment(s1, d)), s1, d);
 
-
-
+    if (!check_dir(d))
+      ret = REGRESSION_TEST_FAILED;
+#else
+    // test corruption detection
     rand_CacheKey(&key, thread->mutex);
     s1 = key.word(0) % DIR_SEGMENTS;
     b1 = (key.word(0) / DIR_SEGMENTS) % d->buckets;
-    rprintf(t, "check_dir in bucket with loop: segment %d %d %d\n", 3, 23, 17);
-    dir_corrupt_bucket(dir_bucket(b1, dir_segment(3, d)), 3, d);
-    dir_corrupt_bucket(dir_bucket(b1, dir_segment(7, d)), 7, d);
-    dir_corrupt_bucket(dir_bucket(b1, dir_segment(17, d)), 17, d);
-    check_dir(d);
+
+    dir_insert(&key, d, &dir1);
+    dir_insert(&key, d, &dir1);
+
+    dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d);
+    if (check_dir(d))
+      ret = REGRESSION_TEST_FAILED;
+#endif
   }
   part_dir_clear(d);
-#endif
-
-  NEW(new CacheDirReg(status));
+  *status = ret;
 }

Modified: incubator/trafficserver/traffic/trunk/iocore/cache/P_CacheDir.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/iocore/cache/P_CacheDir.h?rev=903943&r1=903942&r2=903943&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/iocore/cache/P_CacheDir.h (original)
+++ incubator/trafficserver/traffic/trunk/iocore/cache/P_CacheDir.h Thu Jan 28 02:22:26 2010
@@ -247,7 +247,7 @@
 void dir_lookaside_remove(CacheKey * key, Part * d);
 void dir_free_entry(Dir * e, int s, Part * d);
 void dir_sync_init();
-void check_dir(Part * d);
+int check_dir(Part * d);
 void dir_clean_part(Part * d);
 void dir_clear_range(int start, int end, Part * d);
 int dir_segment_accounted(int s, Part * d, int offby = 0,