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/27 23:38:22 UTC

svn commit: r903893 - in /incubator/trafficserver/traffic/branches/dev/iocore/cache: CacheDir.cc P_CacheDir.h P_CacheInternal.h

Author: jplevyak
Date: Wed Jan 27 22:38:21 2010
New Revision: 903893

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

Modified:
    incubator/trafficserver/traffic/branches/dev/iocore/cache/CacheDir.cc
    incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheDir.h
    incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheInternal.h

Modified: incubator/trafficserver/traffic/branches/dev/iocore/cache/CacheDir.cc
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/branches/dev/iocore/cache/CacheDir.cc?rev=903893&r1=903892&r2=903893&view=diff
==============================================================================
--- incubator/trafficserver/traffic/branches/dev/iocore/cache/CacheDir.cc (original)
+++ incubator/trafficserver/traffic/branches/dev/iocore/cache/CacheDir.cc Wed Jan 27 22:38:21 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
@@ -287,8 +287,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)
@@ -305,7 +307,6 @@
   Debug("cache_check_dir", "inside check dir");
   for (s = 0; s < d->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 *b = dir_bucket(i, seg);
       if (!(dir_bucket_length(b, s, d) >= 0)) return 0;
@@ -364,7 +365,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++;
@@ -560,13 +563,13 @@
             // for the same document and so the collision stat
             // may not accurately reflect the number of documents
             // having the same first_key
-            Debug("cache_stats", "Incrementing dir collisions");
+            DDebug("cache_stats", "Incrementing dir collisions");
             CACHE_INC_DIR_COLLISIONS(d->mutex);
           }
           goto Lcont;
         }
         if (dir_valid(d, e)) {
-          Debug("dir_probe_hit", "found %X %X part %d bucket %d  boffset %d", key->word(0), key->word(1), d->fd, b, (int) dir_offset(e));
+          DDebug("dir_probe_hit", "found %X %X part %d bucket %d  boffset %d", key->word(0), key->word(1), d->fd, b, (int) dir_offset(e));
           dir_assign(result, e);
           *last_collision = e;
           ink_assert(dir_offset(e) * INK_BLOCK_SIZE < d->len);
@@ -577,18 +580,18 @@
           continue;
         }
       } else
-        Debug("dir_probe_tag", "tag mismatch %X %X vs expected %X", e, dir_tag(e), key->word(3));
+        DDebug("dir_probe_tag", "tag mismatch %X %X vs expected %X", e, dir_tag(e), key->word(3));
     Lcont:
       p = e;
       e = next_dir(e, seg);
     } while (e);
   if (collision) {              // last collision no longer in the list, retry
-    Debug("cache_stats", "Incrementing dir collisions");
+    DDebug("cache_stats", "Incrementing dir collisions");
     CACHE_INC_DIR_COLLISIONS(d->mutex);
     collision = NULL;
     goto Lagain;
   }
-  Debug("dir_probe_miss", "missed %X %X on part %d bucket %d at %X", key->word(0), key->word(1), d->fd, b, (long) seg);
+  DDebug("dir_probe_miss", "missed %X %X on part %d bucket %d at %X", key->word(0), key->word(1), d->fd, b, (long) seg);
   CHECK_DIR(d);
   return 0;
 }
@@ -637,7 +640,7 @@
   dir_assign_data(e, to_part);
   dir_set_tag(e, key->word(2));
   ink_assert(part_offset(d, e) < (d->skip + d->len));
-  Debug("dir_insert",
+  DDebug("dir_insert",
         "insert %X %X into part %d bucket %d at %X tag %X %X boffset %d",
         (long) e, key->word(0), d->fd, bi, (long) e, key->word(1), dir_tag(e), (int) dir_offset(e));
   CHECK_DIR(d);
@@ -657,8 +660,10 @@
   Dir *b = dir_bucket(bi, seg);
   unsigned int t = DIR_MASK_TAG(key->word(2));
   int res = 1;
+#ifdef LOOP_CHECK_MODE
   int loop_count = 0;
   bool loop_possible = true;
+#endif
   Part *part = d;
   CHECK_DIR(d);
 
@@ -709,7 +714,7 @@
   dir_assign_data(e, dir);
   dir_set_tag(e, t);
   ink_assert(part_offset(d, e) < d->skip + d->len);
-  Debug("dir_overwrite",
+  DDebug("dir_overwrite",
         "overwrite %X %X into part %d bucket %d at %X tag %X %X boffset %d",
         (long) e, key->word(0), d->fd, bi, (long) e, t, dir_tag(e), (int) dir_offset(e));
   CHECK_DIR(d);
@@ -725,7 +730,9 @@
   int b = key->word(1) % 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;
   CHECK_DIR(d);
 
@@ -764,7 +771,7 @@
     if (b->evac_frags.key == *key) {
       if (dir_valid(d, &b->new_dir)) {
         *result = b->new_dir;
-        Debug("dir_lookaside", "probe %X success", key->word(0));
+        DDebug("dir_lookaside", "probe %X success", key->word(0));
         if (eblock)
           *eblock = b;
         return 1;
@@ -772,7 +779,7 @@
     }
     b = b->link.next;
   }
-  Debug("dir_lookaside", "probe %X failed", key->word(0));
+  DDebug("dir_lookaside", "probe %X failed", key->word(0));
   return 0;
 }
 
@@ -780,7 +787,7 @@
 dir_lookaside_insert(EvacuationBlock *eblock, Part *d, Dir *to)
 {
   CacheKey *key = &eblock->evac_frags.earliest_key;
-  Debug("dir_lookaside", "insert %X %X, offset %d phase %d", key->word(0), key->word(1), (int) dir_offset(to), (int) dir_phase(to));
+  DDebug("dir_lookaside", "insert %X %X, offset %d phase %d", key->word(0), key->word(1), (int) dir_offset(to), (int) dir_phase(to));
   ink_debug_assert(d->mutex->thread_holding == this_ethread());
   int i = key->word(3) % LOOKASIDE_SIZE;
   EvacuationBlock *b = new_EvacuationBlock(d->mutex->thread_holding);
@@ -803,7 +810,7 @@
   while (b) {
     if (b->evac_frags.key == *key) {
       int res = dir_overwrite(key, d, &b->new_dir, &b->dir, false);
-      Debug("dir_lookaside", "fixup %X %X offset %d phase %d %d",
+      DDebug("dir_lookaside", "fixup %X %X offset %d phase %d %d",
             key->word(0), key->word(1), dir_offset(&b->new_dir), dir_phase(&b->new_dir), res);
       d->ram_cache.fixup(key, 0, dir_offset(&b->dir), 0, dir_offset(&b->new_dir));
       d->lookaside[i].remove(b);
@@ -822,7 +829,7 @@
     }
     b = b->link.next;
   }
-  Debug("dir_lookaside", "fixup %X %X failed", key->word(0), key->word(1));
+  DDebug("dir_lookaside", "fixup %X %X failed", key->word(0), key->word(1));
   return 0;
 }
 
@@ -835,7 +842,7 @@
     while (b) {
       if (!dir_valid(d, &b->new_dir)) {
         EvacuationBlock *nb = b->link.next;
-        Debug("dir_lookaside", "cleanup %X %X cleaned up", 
+        DDebug("dir_lookaside", "cleanup %X %X cleaned up", 
               b->evac_frags.earliest_key.word(0), b->evac_frags.earliest_key.word(1));
         d->lookaside[i].remove(b);
         free_CacheVC(b->earliest_evacuator);
@@ -857,7 +864,7 @@
   EvacuationBlock *b = d->lookaside[i].head;
   while (b) {
     if (b->evac_frags.key == *key) {
-      Debug("dir_lookaside", "remove %X %X offset %d phase %d",
+      DDebug("dir_lookaside", "remove %X %X offset %d phase %d",
             key->word(0), key->word(1), dir_offset(&b->new_dir), dir_phase(&b->new_dir));
       d->lookaside[i].remove(b);
       free_EvacuationBlock(b, d->mutex->thread_holding);
@@ -865,7 +872,7 @@
     }
     b = b->link.next;
   }
-  Debug("dir_lookaside", "remove %X %X failed", key->word(0), key->word(1));
+  DDebug("dir_lookaside", "remove %X %X failed", key->word(0), key->word(1));
   return;
 }
 
@@ -894,7 +901,6 @@
 inku64
 dir_entries_used(Part *d)
 {
-
   inku64 full = 0;
   inku64 sfull = 0;
   for (int s = 0; s < d->segments; full += sfull, s++) {
@@ -909,7 +915,6 @@
       while (e) {
         if (dir_offset(e))
           sfull++;
-
         e = next_dir(e, seg);
         if (!e)
           break;
@@ -1310,7 +1315,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));
 }
 
 EXCLUSIVE_REGRESSION_TEST(Cache_dir) (RegressionTest *t, int atype, int *status) {
@@ -1405,18 +1410,19 @@
   }
 
 
-  Dir *last_collision = 0, *seg1 = 0;
+  Dir dir1;
   int s1, b1;
 
   rprintf(t, "corrupt_bucket test\n");
   for (int ntimes = 0; ntimes < 10; ntimes++) {
+#ifdef LOOP_CHECK_MODE
     // dir_probe in bucket with loop
     rand_CacheKey(&key, thread->mutex);
     s1 = key.word(0) % d->segments;
     b1 = key.word(1) % 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);
 
 
@@ -1434,7 +1440,7 @@
     b1 = key.word(1) % 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);
@@ -1453,7 +1459,7 @@
 
     rand_CacheKey(&key, thread->mutex);
     s1 = key.word(0) % d->segments;
-    seg1 = dir_segment(s1, d);
+    Dir *seg1 = dir_segment(s1, d);
     // dir_freelist_length in freelist with loop
     dir_corrupt_bucket(dir_from_offset(d->header->freelist[s], seg1), s1, d);
     dir_freelist_length(d, s1);
@@ -1464,17 +1470,23 @@
     // dir_bucket_length in bucket with loop
     dir_corrupt_bucket(dir_bucket(b1, dir_segment(s1, d)), s1, d);
     dir_bucket_length(dir_bucket(b1, dir_segment(s1, d)), s1, d);
-
-    // this assert by design
+    if (!check_dir(d))
+      ret = REGRESSION_TEST_FAILED;
+#else
+    // test corruption detection
     rand_CacheKey(&key, thread->mutex);
     s1 = key.word(0) % d->segments;
     b1 = key.word(1) % d->buckets;
 
-    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);
+    dir_insert(&key, d, &dir1);
+    dir_insert(&key, d, &dir1);
+    dir_insert(&key, d, &dir1);
+    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);
   *status = ret;

Modified: incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheDir.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheDir.h?rev=903893&r1=903892&r2=903893&view=diff
==============================================================================
--- incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheDir.h (original)
+++ incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheDir.h Wed Jan 27 22:38:21 2010
@@ -235,7 +235,7 @@
 
   Link<OpenDirEntry> link;
 
-  int wait(CacheVC * c, int msec);
+  int wait(CacheVC *c, int msec);
 
   bool has_multiple_writers()
   {
@@ -248,10 +248,10 @@
   Queue<CacheVC> delayed_readers;
   DLL<OpenDirEntry> bucket[OPEN_DIR_BUCKETS];
 
-  int open_write(CacheVC * c, int allow_if_writers, int max_writers);
-  int close_write(CacheVC * c);
-  OpenDirEntry *open_read(INK_MD5 * key);
-  int signal_readers(int event, Event * e);
+  int open_write(CacheVC *c, int allow_if_writers, int max_writers);
+  int close_write(CacheVC *c);
+  OpenDirEntry *open_read(INK_MD5 *key);
+  int signal_readers(int event, Event *e);
 
   OpenDir();
 };
@@ -264,7 +264,7 @@
   int writepos;
   AIOCallbackInternal io;
   Event *trigger;
-  int mainEvent(int event, Event * e);
+  int mainEvent(int event, Event *e);
   void aio_write(int fd, char *b, int n, ink_off_t o);
 
   CacheSync():Continuation(new_ProxyMutex()), part(0), buf(0), buflen(0), writepos(0), trigger(0)
@@ -275,26 +275,26 @@
 
 // Global Functions
 
-void part_init_dir(Part * d);
+void part_init_dir(Part *d);
 int dir_token_probe(CacheKey *, Part *, Dir *);
 int dir_probe(CacheKey *, Part *, Dir *, Dir **);
-int dir_insert(CacheKey * key, Part * d, Dir * to_part);
-int dir_overwrite(CacheKey * key, Part * d, Dir * to_part, Dir * overwrite, bool must_overwrite = true);
-int dir_delete(CacheKey * key, Part * d, Dir * del);
-int dir_lookaside_probe(CacheKey * key, Part * d, Dir * result, EvacuationBlock ** eblock);
-int dir_lookaside_insert(EvacuationBlock * b, Part * d, Dir * to);
-int dir_lookaside_fixup(CacheKey * key, Part * d);
-void dir_lookaside_cleanup(Part * d);
-void dir_lookaside_remove(CacheKey * key, Part * d);
-void dir_free_entry(Dir * e, int s, Part * d);
+int dir_insert(CacheKey *key, Part *d, Dir *to_part);
+int dir_overwrite(CacheKey *key, Part *d, Dir *to_part, Dir *overwrite, bool must_overwrite = true);
+int dir_delete(CacheKey *key, Part *d, Dir *del);
+int dir_lookaside_probe(CacheKey *key, Part *d, Dir *result, EvacuationBlock ** eblock);
+int dir_lookaside_insert(EvacuationBlock *b, Part *d, Dir *to);
+int dir_lookaside_fixup(CacheKey *key, Part *d);
+void dir_lookaside_cleanup(Part *d);
+void dir_lookaside_remove(CacheKey *key, Part *d);
+void dir_free_entry(Dir *e, int s, Part *d);
 void dir_sync_init();
-int check_dir(Part * d);
-void dir_clean_part(Part * d);
-void dir_clear_range(ink_off_t start, ink_off_t end, Part * d);
-int dir_segment_accounted(int s, Part * d, int offby = 0,
+int check_dir(Part *d);
+void dir_clean_part(Part *d);
+void dir_clear_range(ink_off_t start, ink_off_t end, Part *d);
+int dir_segment_accounted(int s, Part *d, int offby = 0,
                           int *free = 0, int *used = 0,
                           int *empty = 0, int *valid = 0, int *agg_valid = 0, int *avg_size = 0);
-inku64 dir_entries_used(Part * d);
+inku64 dir_entries_used(Part *d);
 void sync_cache_dir_on_shutdown();
 
 // Global Data
@@ -303,16 +303,16 @@
 
 // Inline Funtions
 
-#define dir_in_seg(_s, _i) ((Dir*)(((char*)(_s)) + (SIZEOF_DIR * (_i))))
+#define dir_in_seg(_s, _i) ((Dir*)(((char*)(_s)) + (SIZEOF_DIR *(_i))))
 
 inline bool
-dir_compare_tag(Dir * e, CacheKey * key)
+dir_compare_tag(Dir *e, CacheKey *key)
 {
   return (dir_tag(e) == DIR_MASK_TAG(key->word(2)));
 }
 
 inline Dir *
-dir_from_offset(int i, Dir * seg)
+dir_from_offset(int i, Dir *seg)
 {
 #if DIR_DEPTH < 5
   if (!i)
@@ -324,13 +324,13 @@
 #endif
 }
 inline Dir *
-next_dir(Dir * d, Dir * seg)
+next_dir(Dir *d, Dir *seg)
 {
   int i = dir_next(d);
   return dir_from_offset(i, seg);
 }
 inline int
-dir_to_offset(Dir * d, Dir * seg)
+dir_to_offset(Dir *d, Dir *seg)
 {
 #if DIR_DEPTH < 5
   return (((char*)d) - ((char*)seg))/SIZEOF_DIR;
@@ -341,12 +341,12 @@
 #endif
 }
 inline Dir *
-dir_bucket(int b, Dir * seg)
+dir_bucket(int b, Dir *seg)
 {
   return dir_in_seg(seg, b * DIR_DEPTH);
 }
 inline Dir *
-dir_bucket_row(Dir * b, int i)
+dir_bucket_row(Dir *b, int i)
 {
   return dir_in_seg(b, i);
 }

Modified: incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheInternal.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheInternal.h?rev=903893&r1=903892&r2=903893&view=diff
==============================================================================
--- incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheInternal.h (original)
+++ incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheInternal.h Wed Jan 27 22:38:21 2010
@@ -52,6 +52,12 @@
 #endif
 #endif
 
+#ifdef DEBUG
+#define DDebug Debug
+#else
+#define DDebug if (0) dummy_debug
+#endif
+
 #define AIO_SOFT_FAILURE                -100000
 // retry read from writer delay
 #define WRITER_RETRY_DELAY  HRTIME_MSECONDS(50)