John, thanks for the idea.

Here is what happened - 

First, I just changed the test in CacheWrite.cc as you said. I wasn't
clear on whether the assert() should now be satisfied or not without
moving it.. the test continued to fail in the same way.

Then I moved the assert from cachedir to cachewrite as you indicated -
the test runs a bit longer subjectively, but it fails on the (new)
assert.

I don't yet understand the flow of the cache code.

This is the patch::


diff --git a/iocore/cache/CacheDir.cc b/iocore/cache/CacheDir.cc
index 2cb271f..28e98f6 100644
--- a/iocore/cache/CacheDir.cc
+++ b/iocore/cache/CacheDir.cc
@@ -690,7 +690,7 @@ dir_overwrite(CacheKey * key, Part * d, Dir * dir, Dir * 
overwrite, bool must_ov
   check_dir(d);
 #endif
 
-  ink_assert((unsigned int) dir_approx_size(dir) <= (unsigned int) 
(MAX_FRAG_SIZE + sizeofDoc));        // XXX - size should be unsigned
+
 Lagain:
   // find entry to overwrite
   e = b;
diff --git a/iocore/cache/CacheWrite.cc b/iocore/cache/CacheWrite.cc
index a1f529a..1e0966a 100644
--- a/iocore/cache/CacheWrite.cc
+++ b/iocore/cache/CacheWrite.cc
@@ -791,6 +791,8 @@ agg_copy(char *p, CacheVC * vc)
     ink_assert(part_offset(part, &vc->dir) < (part->skip + part->len));
     dir_set_phase(&vc->dir, part->header->phase);
 
+    ink_assert((unsigned int) dir_approx_size(&vc->dir) <= (unsigned int) 
(MAX_FRAG_SIZE + sizeofDoc));        // XXX - size should be unsigned
+
     // fill in document header
     doc->magic = DOC_MAGIC;
     doc->len = seglen;
@@ -1362,7 +1364,8 @@ Lagain:
     total_len += avail;
   }
   length = towrite;
-  if (length > TARGET_FRAG_SIZE && length < SHRINK_TARGET_FRAG_SIZE)
+  //  if (length > TARGET_FRAG_SIZE && length < SHRINK_TARGET_FRAG_SIZE)
+  if (length > TARGET_FRAG_SIZE)
     write_len = TARGET_FRAG_SIZE;
   else
     write_len = length;


Reply via email to