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/09/03 22:35:39 UTC

svn commit: r992457 - in /trafficserver/traffic/trunk/iocore/cache: CachePart.cc CacheRead.cc CacheWrite.cc

Author: jplevyak
Date: Fri Sep  3 20:35:39 2010
New Revision: 992457

URL: http://svn.apache.org/viewvc?rev=992457&view=rev
Log:
TS-413: latest revision of the fix for large buffers fed to the cache

Modified:
    trafficserver/traffic/trunk/iocore/cache/CachePart.cc
    trafficserver/traffic/trunk/iocore/cache/CacheRead.cc
    trafficserver/traffic/trunk/iocore/cache/CacheWrite.cc

Modified: trafficserver/traffic/trunk/iocore/cache/CachePart.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/cache/CachePart.cc?rev=992457&r1=992456&r2=992457&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/cache/CachePart.cc (original)
+++ trafficserver/traffic/trunk/iocore/cache/CachePart.cc Fri Sep  3 20:35:39 2010
@@ -364,6 +364,8 @@ CacheVC::scanOpenWrite(int event, Event 
     // the document was not modified
     // we are safe from now on as we hold the
     // writer lock on the doc
+    if (f.evac_vector)
+      header_len = write_vector->marshal_length();
     SET_HANDLER(&CacheVC::scanUpdateDone);
     ret = do_write_call();
   }

Modified: trafficserver/traffic/trunk/iocore/cache/CacheRead.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/cache/CacheRead.cc?rev=992457&r1=992456&r2=992457&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/cache/CacheRead.cc (original)
+++ trafficserver/traffic/trunk/iocore/cache/CacheRead.cc Fri Sep  3 20:35:39 2010
@@ -815,6 +815,7 @@ Lread:
           buf = NULL;
           last_collision = NULL;
           write_len = 0;
+          header_len = write_vector->marshal_length();
           f.evac_vector = 1;
           f.use_first_key = 1;
           key = first_key;

Modified: trafficserver/traffic/trunk/iocore/cache/CacheWrite.cc
URL: http://svn.apache.org/viewvc/trafficserver/traffic/trunk/iocore/cache/CacheWrite.cc?rev=992457&r1=992456&r2=992457&view=diff
==============================================================================
--- trafficserver/traffic/trunk/iocore/cache/CacheWrite.cc (original)
+++ trafficserver/traffic/trunk/iocore/cache/CacheWrite.cc Fri Sep  3 20:35:39 2010
@@ -125,6 +125,7 @@ CacheVC::updateVector(int event, Event *
               "rewriting resident alt size: %d key: %X, first_key: %X", write_len, doc->key.word(0), first_key.word(0));
       }
     }
+    header_len = write_vector->marshal_length();
     od->writing_vec = 1;
     f.use_first_key = 1;
     SET_HANDLER(&CacheVC::openWriteCloseHeadDone);
@@ -178,26 +179,13 @@ CacheVC::handleWrite(int event, Event *e
 
   // plain write case
   ink_assert(!trigger);
-#ifdef HTTP_CACHE
-  if (frag_type == CACHE_FRAG_TYPE_HTTP && (f.use_first_key || f.evac_vector)) {
-    ink_assert(od->writing_vec);
-    header_len = write_vector->marshal_length();
-    ink_assert(header_len > 0);
-  } else if (f.use_first_key)
-#endif
-    header_len = header_to_write_len;
   if (f.use_first_key && fragment) {
     frag_len = (fragment-1) * sizeof(Frag);
   } else
     frag_len = 0;
   set_agg_write_in_progress();
   POP_HANDLER;
-  uint32 to_write = write_len + header_len + sizeofDoc;
-  if (to_write > MAX_FRAG_SIZE) {
-    write_len = MAX_FRAG_SIZE - header_len - sizeofDoc;
-    to_write = MAX_FRAG_SIZE;
-  }
-  agg_len = round_to_approx_size(to_write);
+  agg_len = round_to_approx_size(write_len + header_len + frag_len + sizeofDoc);
   part->agg_todo_size += agg_len;
   bool agg_error =
     (agg_len > AGG_SIZE || header_len + sizeofDoc > MAX_FRAG_SIZE ||
@@ -759,9 +747,9 @@ agg_copy(char *p, CacheVC *vc)
 
     uint32 len = vc->write_len + vc->header_len + vc->frag_len + sizeofDoc;
     ink_assert(vc->frag_type != CACHE_FRAG_TYPE_HTTP || len != sizeofDoc);
-    int writelen = round_to_approx_size(len);
+    ink_debug_assert(round_to_approx_size(len) == vc->agg_len);
     // update copy of directory entry for this document
-    dir_set_approx_size(&vc->dir, writelen);
+    dir_set_approx_size(&vc->dir, vc->agg_len);
     dir_set_offset(&vc->dir, offset_to_part_offset(part, o));
     ink_assert(part_offset(part, &vc->dir) < (part->skip + part->len));
     dir_set_phase(&vc->dir, part->header->phase);
@@ -870,7 +858,7 @@ agg_copy(char *p, CacheVC *vc)
     if (res_alt_blk)
       res_alt_blk->free();
 
-    return writelen;
+    return vc->agg_len;
   } else {
     // for evacuated documents, copy the data, and update directory
     Doc *doc = (Doc *) vc->buf->data();
@@ -1219,6 +1207,7 @@ int
 CacheVC::openWriteCloseDataDone(int event, Event *e)
 {
   NOWARN_UNUSED(e);
+  int ret = 0;
 
   if (event == AIO_EVENT_DONE)
     set_io_not_in_progress();
@@ -1230,13 +1219,28 @@ CacheVC::openWriteCloseDataDone(int even
     CACHE_TRY_LOCK(lock, part->mutex, this_ethread());
     if (!lock)
       VC_LOCK_RETRY_EVENT();
+    if (!fragment) {
+      ink_assert(key == earliest_key);
+      earliest_dir = dir;
+    }
     fragment++;
     write_pos += write_len;
     dir_insert(&key, part, &dir);
+    blocks = iobufferblock_skip(blocks, &offset, &length, write_len);
+    next_CacheKey(&key, &key);
+    if (length) {
+      write_len = length;
+      if (write_len > MAX_FRAG_SIZE)
+        write_len = MAX_FRAG_SIZE;
+      if ((ret = do_write_call()) == EVENT_RETURN)
+        goto Lcallreturn;
+      return ret;
+    }
     f.data_done = 1;
-    ink_assert(fragment);
     return openWriteCloseHead(event, e); // must be called under part lock from here
   }
+Lcallreturn:
+  return handleEvent(AIO_EVENT_DONE, 0);
 }
 
 int
@@ -1266,9 +1270,11 @@ CacheVC::openWriteClose(int event, Event
       return openWriteCloseDir(event, e);
 #endif
     }
-    if (length && fragment) {
+    if (length && (fragment || length > MAX_FRAG_SIZE)) {
       SET_HANDLER(&CacheVC::openWriteCloseDataDone);
       write_len = length;
+      if (write_len > MAX_FRAG_SIZE)
+        write_len = MAX_FRAG_SIZE;
       return do_write_lock_call();
     } else
       return openWriteCloseHead(event, e);