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/02/09 22:11:49 UTC

svn commit: r908221 - in /incubator/trafficserver/traffic/branches/dev: iocore/cache/Cache.cc iocore/cache/CachePart.cc iocore/cache/CacheTest.cc iocore/cache/I_Cache.h iocore/cache/P_CacheInternal.h iocore/cluster/ClusterCache.cc proxy/InkAPI.cc

Author: jplevyak
Date: Tue Feb  9 21:11:49 2010
New Revision: 908221

URL: http://svn.apache.org/viewvc?rev=908221&view=rev
Log:
TS-133: added more cache regressions, also cleaned up repetitive stats code
by wrapping repetitive stretches in a function (high tech).  Also
fixed CacheProcessor::remove to not callback the state machine while
holding the partition lock to reduce contention on that lock.

Modified:
    incubator/trafficserver/traffic/branches/dev/iocore/cache/Cache.cc
    incubator/trafficserver/traffic/branches/dev/iocore/cache/CachePart.cc
    incubator/trafficserver/traffic/branches/dev/iocore/cache/CacheTest.cc
    incubator/trafficserver/traffic/branches/dev/iocore/cache/I_Cache.h
    incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheInternal.h
    incubator/trafficserver/traffic/branches/dev/iocore/cluster/ClusterCache.cc
    incubator/trafficserver/traffic/branches/dev/proxy/InkAPI.cc

Modified: incubator/trafficserver/traffic/branches/dev/iocore/cache/Cache.cc
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/branches/dev/iocore/cache/Cache.cc?rev=908221&r1=908220&r2=908221&view=diff
==============================================================================
--- incubator/trafficserver/traffic/branches/dev/iocore/cache/Cache.cc (original)
+++ incubator/trafficserver/traffic/branches/dev/iocore/cache/Cache.cc Tue Feb  9 21:11:49 2010
@@ -25,6 +25,7 @@
 
 
 #include "P_Cache.h"
+#include "P_CacheTest.h"
 
 // Cache Inspector and State Pages
 #ifdef NON_MODULAR
@@ -253,14 +254,14 @@
 {
   ink_debug_assert(mutex->thread_holding == this_ethread());
   closed = (alerrno == -1) ? 1 : -1;    // Stupid default arguments
-  Debug("cache_close", "do_io_close %lX %d %d", (long) this, alerrno, closed);
+  DDebug("cache_close", "do_io_close %lX %d %d", (long) this, alerrno, closed);
   die();
 }
 
 void
 CacheVC::reenable(VIO *avio)
 {
-  Debug("cache_reenable", "reenable %lX", (long) this);
+  DDebug("cache_reenable", "reenable %lX", (long) this);
   (void) avio;
   ink_assert(avio->mutex->thread_holding);
   if (!trigger) {
@@ -278,7 +279,7 @@
 void
 CacheVC::reenable_re(VIO *avio)
 {
-  Debug("cache_reenable", "reenable_re %lX", (long) this);
+  DDebug("cache_reenable", "reenable_re %lX", (long) this);
   (void) avio;
   ink_assert(avio->mutex->thread_holding);
   if (!trigger) {
@@ -1980,115 +1981,87 @@
 }
 #endif
 
-// called to abort another writer so that
-// remove can proceed.
-// checks if there is another writer - if another
-// writer found its write is aborted
-
-// the result of this function call is that -
-// either the other writer (if it exists) is
-// aborted or the cacheVC succeeds in 
-// open_write
-
 int
-CacheVC::removeAbortWriter(int event, Event *e)
+CacheVC::removeEvent(int event, Event *e)
 {
   NOWARN_UNUSED(e);
   NOWARN_UNUSED(event);
-  int ow_ret;
-  cancel_trigger();
-  if (_action.cancelled)
-    return free_CacheVC(this);
-
-  CACHE_TRY_LOCK(lock, part->mutex, mutex->thread_holding);
-  if (!lock)
-    VC_SCHED_LOCK_RETRY();
-
-  // if there are other writers, we still want this remove to go through.
-  // If we are the first writer, don't allow other writers. Otherwise,
-  // we to put the vector in the open directory entry in case there are
-  // new writers.
-  if ((ow_ret = part->open_write(this, true, 1))) {
-    // writer  exists
-    ink_assert(od = part->open_read(&key));
-    od->dont_update_directory = 1;
-    od = NULL;
-  } else {
-    od->dont_update_directory = 1;
-  }
-
-  SET_HANDLER(&CacheVC::removeReadDone);
-  return removeReadDone(EVENT_IMMEDIATE, 0);
-
-}
 
-// remove code
-
-int
-CacheVC::removeReadDone(int event, Event *e)
-{
-  NOWARN_UNUSED(e);
-  NOWARN_UNUSED(event);
   cancel_trigger();
   set_io_not_in_progress();
-  MUTEX_TRY_LOCK(lock, part->mutex, mutex->thread_holding);
-  if (!lock)
-    VC_SCHED_LOCK_RETRY();
-
-  if (_action.cancelled) {
-    if (od)
-      part->close_write(this);
-    od = NULL;
-    return free_CacheVC(this);
-  }
-
-  if (!buf)
-    goto Lcollision;
-
-  if (!dir_valid(part, &dir)) {
-    last_collision = NULL;
-    goto Lcollision;
-  }
-  // check read completed correct FIXME: remove bad parts
-  if ((int) io.aio_result != (int) io.aiocb.aio_nbytes)
-    goto Ldone;
   {
-    // verify that this is our document
-    Doc *doc = (Doc *) buf->data();
-    /* should be first_key not key..right?? */
-    if (doc->first_key == key) {
-      ink_assert(doc->magic == DOC_MAGIC);
-      if (dir_delete(&key, part, &dir) > 0) {
-        if (od)
-          part->close_write(this);
-        _action.continuation->handleEvent(CACHE_EVENT_REMOVE, 0);
+    MUTEX_TRY_LOCK(lock, part->mutex, mutex->thread_holding);
+    if (!lock)
+      VC_SCHED_LOCK_RETRY();
+    if (_action.cancelled) {
+      if (od) {
+        part->close_write(this);
+        od = 0;
+      }
+      goto Lfree;
+    }
+    if (!f.remove_aborted_writers) {
+      if (part->open_write(this, true, 1)) {
+        // writer  exists
+        ink_assert(od = part->open_read(&key));
+        od->dont_update_directory = 1;
         od = NULL;
-        return free_CacheVC(this);
+      } else {
+        od->dont_update_directory = 1;
       }
+      f.remove_aborted_writers = 1;
+    }
+  Lread:
+    if (!buf)
+      goto Lcollision;
+    if (!dir_valid(part, &dir)) {
+      last_collision = NULL;
+      goto Lcollision;
+    }
+    // check read completed correct FIXME: remove bad parts
+    if ((int) io.aio_result != (int) io.aiocb.aio_nbytes)
       goto Ldone;
+    {
+      // verify that this is our document
+      Doc *doc = (Doc *) buf->data();
+      /* should be first_key not key..right?? */
+      if (doc->first_key == key) {
+        ink_assert(doc->magic == DOC_MAGIC);
+        if (dir_delete(&key, part, &dir) > 0) {
+          if (od)
+            part->close_write(this);
+          od = NULL;
+          goto Lremoved;
+        }
+        goto Ldone;
+      }
     }
+  Lcollision:
+    // check for collision
+    if (dir_probe(&key, part, &dir, &last_collision) > 0) {
+      int ret = do_read_call(&key);
+      if (ret == EVENT_RETURN)
+        goto Lread;
+      return ret;
+    }
+  Ldone:
+    CACHE_INCREMENT_DYN_STAT(cache_remove_failure_stat);
+    if (od)
+      part->close_write(this);
   }
-Lcollision:
-  // check for collision
-  if (dir_probe(&key, part, &dir, &last_collision) > 0) {
-    int ret = do_read_call(&key);
-    if (ret == EVENT_RETURN)
-      goto Lcallreturn;
-    return ret;
-  }
-Ldone:
-  CACHE_INCREMENT_DYN_STAT(cache_remove_failure_stat);
-  if (od)
-    part->close_write(this);
+  ink_debug_assert(!part || this_ethread() != part->mutex->thread_holding);
   _action.continuation->handleEvent(CACHE_EVENT_REMOVE_FAILED, (void *) -ECACHE_NO_DOC);
+  goto Lfree;
+Lremoved:
+  _action.continuation->handleEvent(CACHE_EVENT_REMOVE, 0);
+Lfree:
   return free_CacheVC(this);
-Lcallreturn:
-  return handleEvent(AIO_EVENT_DONE, 0); // hopefully a tail call
 }
 
 Action *
-Cache::remove(Continuation *cont, CacheKey *key, bool user_agents,
-              bool link, CacheFragType type, char *hostname, int host_len)
+Cache::remove(Continuation *cont, CacheKey *key, CacheFragType type, 
+              bool user_agents, bool link, 
+              char *hostname, int host_len)
 {
   NOWARN_UNUSED(user_agents);
   NOWARN_UNUSED(link);
@@ -2123,9 +2096,8 @@
   c->dir = result;
   c->f.remove = 1;
 
-  SET_CONTINUATION_HANDLER(c, &CacheVC::removeAbortWriter);
-  //Action *ret_action = ACTION_RESULT_DONE;
-  int ret = c->removeAbortWriter(EVENT_IMMEDIATE, 0);
+  SET_CONTINUATION_HANDLER(c, &CacheVC::removeEvent);
+  int ret = c->removeEvent(EVENT_IMMEDIATE, 0);
   if (ret == EVENT_DONE)
     return ACTION_RESULT_DONE;
   else
@@ -2140,7 +2112,7 @@
   url->MD5_get(&md5);
   int host_len = 0;
   const char *hostname = url->host_get(&host_len);
-  return remove(cont, &md5, true, false, type, (char *) hostname, host_len);
+  return remove(cont, &md5, type, true, false, (char *) hostname, host_len);
 }
 #endif
 
@@ -2154,7 +2126,6 @@
 void
 cplist_init()
 {
-
   int i;
   unsigned int j;
   cp_list_len = 0;
@@ -2548,236 +2519,66 @@
     return host_rec->parts[0];
 }
 
+static void reg_int(const char *str, int stat, RecRawStatBlock *rsb, const char *prefix) {
+  char stat_str[256];
+  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, str);
+  RecRegisterRawStat(rsb, RECT_PROCESS,
+                     stat_str, RECD_INT, RECP_NON_PERSISTENT, stat, RecRawStatSyncSum);
+  DOCACHE_CLEAR_DYN_STAT(stat)
+}
+#define REG_INT(_str, _stat) reg_int(_str, (int)_stat, rsb, prefix)
 
 // Register Stats
 void
 register_cache_stats(RecRawStatBlock *rsb, const char *prefix)
 {
-
   char stat_str[256];
 
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "bytes_used");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_bytes_used_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_bytes_used_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "bytes_total");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_bytes_total_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_bytes_total_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "ram_cache.bytes_used");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_ram_cache_bytes_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_ram_cache_bytes_stat);
-
+  REG_INT("bytes_used", cache_bytes_used_stat);
+  REG_INT("bytes_total", cache_bytes_total_stat);
   snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "ram_cache.total_bytes");
   RecRegisterRawStat(rsb, RECT_PROCESS,
                      stat_str, RECD_INT, RECP_NULL, (int) cache_ram_cache_bytes_total_stat, RecRawStatSyncSum);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "ram_cache.misses");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_ram_cache_misses_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_ram_cache_misses_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "ram_cache.hits");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_ram_cache_hits_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_ram_cache_hits_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "pread_count");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_pread_count_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_pread_count_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "percent_full");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_percent_full_stat, RecRawStatSyncSum);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "lookup.active");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_lookup_active_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_lookup_active_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "lookup.success");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_lookup_success_stat, RecRawStatSyncSum);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "lookup.failure");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_lookup_failure_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_lookup_failure_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "read.active");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_read_active_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_read_active_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "read.success");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_read_success_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_read_success_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "read.failure");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_read_failure_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_read_failure_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "write.active");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_write_active_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_write_active_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "write.success");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_write_success_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_write_success_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "write.failure");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_write_failure_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_write_failure_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "write.backlog.failure");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str,
-                     RECD_INT, RECP_NON_PERSISTENT, (int) cache_write_backlog_failure_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_write_backlog_failure_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "update.active");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_update_active_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_update_active_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "update.success");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_update_success_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_update_success_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "update.failure");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_update_failure_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_update_failure_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "remove.active");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_remove_active_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_remove_active_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "remove.success");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_remove_success_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_remove_success_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "remove.failure");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_remove_failure_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_remove_failure_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "evacuate.active");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_evacuate_active_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_evacuate_active_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "evacuate.success");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_evacuate_success_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_evacuate_success_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "evacuate.failure");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_evacuate_failure_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_evacuate_failure_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "scan.active");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_scan_active_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_scan_active_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "scan.success");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_scan_success_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_scan_success_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "scan.failure");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_scan_failure_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_scan_failure_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "direntries.total");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_direntries_total_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_direntries_total_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "direntries.used");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_direntries_used_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_direntries_used_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "directory_collision");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str,
-                     RECD_INT, RECP_NON_PERSISTENT, (int) cache_directory_collision_count_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_directory_collision_count_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "frags_per_doc.1");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str,
-                     RECD_INT, RECP_NON_PERSISTENT, (int) cache_single_fragment_document_count_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_single_fragment_document_count_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "frags_per_doc.2");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str,
-                     RECD_INT, RECP_NON_PERSISTENT, (int) cache_two_fragment_document_count_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_two_fragment_document_count_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "frags_per_doc.3+");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str,
-                     RECD_INT, RECP_NON_PERSISTENT,
-                     (int) cache_three_plus_plus_fragment_document_count_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_three_plus_plus_fragment_document_count_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "read_busy.success");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_read_busy_success_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_read_busy_success_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "read_busy.failure");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_read_busy_failure_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_read_busy_failure_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "write_bytes_stat");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_write_bytes_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_write_bytes_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "vector_marshals");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_hdr_vector_marshal_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_hdr_vector_marshal_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "hdr_marshals");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_hdr_marshal_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_hdr_marshal_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "hdr_marshal_bytes");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_hdr_marshal_bytes_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_hdr_marshal_bytes_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "gc_bytes_evacuated");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_gc_bytes_evacuated_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_gc_bytes_evacuated_stat);
-
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, "gc_frags_evacuated");
-  RecRegisterRawStat(rsb, RECT_PROCESS,
-                     stat_str, RECD_INT, RECP_NON_PERSISTENT, (int) cache_gc_frags_evacuated_stat, RecRawStatSyncSum);
-  DOCACHE_CLEAR_DYN_STAT(cache_gc_frags_evacuated_stat);
+  REG_INT("ram_cache.bytes_used", cache_ram_cache_bytes_stat);
+  REG_INT("ram_cache.hits", cache_ram_cache_hits_stat);
+  REG_INT("pread_count", cache_pread_count_stat);
+  REG_INT("percent_full", cache_percent_full_stat);
+  REG_INT("lookup.active", cache_lookup_active_stat);
+  REG_INT("lookup.success", cache_lookup_success_stat);
+  REG_INT("lookup.failure", cache_lookup_failure_stat);
+  REG_INT("read.active", cache_read_active_stat);
+  REG_INT("read.success", cache_read_success_stat);
+  REG_INT("read.failure", cache_read_failure_stat);
+  REG_INT("write.active", cache_write_active_stat);
+  REG_INT("write.success", cache_write_success_stat);
+  REG_INT("write.failure", cache_write_failure_stat);
+  REG_INT("write.backlog.failure", cache_write_backlog_failure_stat);
+  REG_INT("update.active", cache_update_active_stat);
+  REG_INT("update.success", cache_update_success_stat);
+  REG_INT("update.failure", cache_update_failure_stat);
+  REG_INT("remove.active", cache_remove_active_stat);
+  REG_INT("remove.success", cache_remove_success_stat);
+  REG_INT("remove.failure", cache_remove_failure_stat);
+  REG_INT("evacuate.active", cache_evacuate_active_stat);
+  REG_INT("evacuate.success", cache_evacuate_success_stat);
+  REG_INT("evacuate.failure", cache_evacuate_failure_stat);
+  REG_INT("scan.active", cache_scan_active_stat);
+  REG_INT("scan.success", cache_scan_success_stat);
+  REG_INT("scan.failure", cache_scan_failure_stat);
+  REG_INT("direntries.total", cache_direntries_total_stat);
+  REG_INT("direntries.used", cache_direntries_used_stat);
+  REG_INT("directory_collision", cache_directory_collision_count_stat);
+  REG_INT("frags_per_doc.1", cache_single_fragment_document_count_stat);
+  REG_INT("frags_per_doc.2", cache_two_fragment_document_count_stat);
+  REG_INT("frags_per_doc.3+", cache_three_plus_plus_fragment_document_count_stat);
+  REG_INT("read_busy.success", cache_read_busy_success_stat);
+  REG_INT("read_busy.failure", cache_read_busy_failure_stat);
+  REG_INT("write_bytes_stat", cache_write_bytes_stat);
+  REG_INT("vector_marshals", cache_hdr_vector_marshal_stat);
+  REG_INT("hdr_marshals", cache_hdr_marshal_stat);
+  REG_INT("hdr_marshal_bytes", cache_hdr_marshal_bytes_stat);
+  REG_INT("gc_bytes_evacuated", cache_gc_bytes_evacuated_stat);
+  REG_INT("gc_frags_evacuated", cache_gc_frags_evacuated_stat);
 }
 
 
@@ -3013,7 +2814,7 @@
       sm->handleEvent(CACHE_EVENT_OPEN_WRITE, (void *) vc);
       return ACTION_RESULT_DONE;
     } else {
-      Debug("cache_plugin", "[CacheProcessor::open_write] Error: NewCacheVC not set");
+      DDebug("cache_plugin", "[CacheProcessor::open_write] Error: NewCacheVC not set");
       sm->handleEvent(CACHE_EVENT_OPEN_WRITE_FAILED, (void *) -ECACHE_WRITE_FAIL);
       return ACTION_RESULT_DONE;
     }
@@ -3032,7 +2833,7 @@
   }
 #endif
   if (cache_global_hooks != NULL && cache_global_hooks->hooks_set > 0) {
-    Debug("cache_plugin", "[CacheProcessor::remove] Cache hooks are set");
+    DDebug("cache_plugin", "[CacheProcessor::remove] Cache hooks are set");
     APIHook *cache_lookup = cache_global_hooks->get(INK_CACHE_PLUGIN_HOOK);
     if (cache_lookup != NULL) {
       NewCacheVC *vc = NewCacheVC::alloc(cont, url, NULL);

Modified: incubator/trafficserver/traffic/branches/dev/iocore/cache/CachePart.cc
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/branches/dev/iocore/cache/CachePart.cc?rev=908221&r1=908220&r2=908221&view=diff
==============================================================================
--- incubator/trafficserver/traffic/branches/dev/iocore/cache/CachePart.cc (original)
+++ incubator/trafficserver/traffic/branches/dev/iocore/cache/CachePart.cc Tue Feb  9 21:11:49 2010
@@ -222,7 +222,7 @@
         ink_debug_assert(hostinfo_copied);
         SET_HANDLER(&CacheVC::scanRemoveDone);
         // force remove even if there is a writer
-        cacheProcessor.remove(this, &doc->first_key, true, false, CACHE_FRAG_TYPE_HTTP, (char *) hname, hlen);
+        cacheProcessor.remove(this, &doc->first_key, CACHE_FRAG_TYPE_HTTP, true, false, (char *) hname, hlen);
         return EVENT_CONT;
       } else {
         offset = (char *) doc - buf->data();

Modified: incubator/trafficserver/traffic/branches/dev/iocore/cache/CacheTest.cc
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/branches/dev/iocore/cache/CacheTest.cc?rev=908221&r1=908220&r2=908221&view=diff
==============================================================================
--- incubator/trafficserver/traffic/branches/dev/iocore/cache/CacheTest.cc (original)
+++ incubator/trafficserver/traffic/branches/dev/iocore/cache/CacheTest.cc Tue Feb  9 21:11:49 2010
@@ -313,12 +313,32 @@
   read_test.expect_event = VC_EVENT_READ_COMPLETE;
   read_test.total_size = 100;
   read_test.key = write_test.key;
+
+  CACHE_SM(t, remove_test, { cacheProcessor.remove(this, &key); } );
+  remove_test.expect_event = CACHE_EVENT_REMOVE;
+  remove_test.key = write_test.key;
+
+  CACHE_SM(t, lookup_fail_test, { cacheProcessor.lookup(this, &key); } );
+  lookup_fail_test.expect_event = CACHE_EVENT_LOOKUP_FAILED;
+  lookup_fail_test.key = write_test.key;
+
+  CACHE_SM(t, read_fail_test, { cacheProcessor.open_read(this, &key); } );
+  read_fail_test.expect_event = CACHE_EVENT_OPEN_READ_FAILED;
+  read_fail_test.key = write_test.key;
   
+  CACHE_SM(t, remove_fail_test, { cacheProcessor.remove(this, &key); } );
+  remove_fail_test.expect_event = CACHE_EVENT_REMOVE_FAILED;
+  rand_CacheKey(&remove_fail_test.key, thread->mutex);
+
   r_sequential(
     t,
     write_test.clone(),
     lookup_test.clone(),
     read_test.clone(),
+    remove_test.clone(),
+    lookup_fail_test.clone(),
+    read_fail_test.clone(),
+    remove_fail_test.clone(),
     NULL
     )->run(pstatus);
   return;

Modified: incubator/trafficserver/traffic/branches/dev/iocore/cache/I_Cache.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/branches/dev/iocore/cache/I_Cache.h?rev=908221&r1=908220&r2=908221&view=diff
==============================================================================
--- incubator/trafficserver/traffic/branches/dev/iocore/cache/I_Cache.h (original)
+++ incubator/trafficserver/traffic/branches/dev/iocore/cache/I_Cache.h Tue Feb  9 21:11:49 2010
@@ -79,8 +79,9 @@
                             time_t pin_in_cache = (time_t) 0,
                             char *hostname = 0, int host_len = 0);
   inkcoreapi Action *remove(Continuation *cont, CacheKey *key,
+                            CacheFragType frag_type = CACHE_FRAG_TYPE_NONE, 
                             bool rm_user_agents = true, bool rm_link = false,
-                            CacheFragType frag_type = CACHE_FRAG_TYPE_NONE, char *hostname = 0, int host_len = 0);
+                            char *hostname = 0, int host_len = 0);
   Action *scan(Continuation *cont, char *hostname = 0, int host_len = 0, int KB_per_second = 2500);
 #ifdef HTTP_CACHE
   Action *lookup(Continuation *cont, URL *url, bool local_only = false,

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=908221&r1=908220&r2=908221&view=diff
==============================================================================
--- incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheInternal.h (original)
+++ incubator/trafficserver/traffic/branches/dev/iocore/cache/P_CacheInternal.h Tue Feb  9 21:11:49 2010
@@ -178,20 +178,16 @@
 	RecIncrRawStat(cache_rsb, mutex->thread_holding, (int) (x), -1); \
 	RecIncrRawStat(part->cache_part->part_rsb, mutex->thread_holding, (int) (x), -1);
 
-
 #define CACHE_PART_SUM_DYN_STAT(x,y) \
-  RecIncrRawStat(part->cache_part->part_rsb, mutex->thread_holding, (int) (x), (int) y);
-
+        RecIncrRawStat(part->cache_part->part_rsb, mutex->thread_holding, (int) (x), (int) y);
 
 #define CACHE_SUM_DYN_STAT(x, y) \
 	RecIncrRawStat(cache_rsb, mutex->thread_holding, (int) (x), (int) (y)); \
 	RecIncrRawStat(part->cache_part->part_rsb, mutex->thread_holding, (int) (x), (int) (y));
 
-
 #define GLOBAL_CACHE_SUM_GLOBAL_DYN_STAT(x, y) \
 	RecIncrGlobalRawStatSum(cache_rsb,(x),(y))
 
-
 #define CACHE_SUM_GLOBAL_DYN_STAT(x, y) \
 	RecIncrGlobalRawStatSum(cache_rsb,(x),(y)) \
 	RecIncrGlobalRawStatSum(part->cache_part->part_rsb,(x),(y))
@@ -300,10 +296,9 @@
 
   int updateVector(int event, Event *e);
   int updateReadDone(int event, Event *e);
-
   int updateVecWrite(int event, Event *e);
-  int removeReadDone(int event, Event *e);
-  int removeAbortWriter(int event, Event *e);
+
+  int removeEvent(int event, Event *e);
 
   int linkWrite(int event, Event *e);
   int derefRead(int event, Event *e);
@@ -448,6 +443,7 @@
 #endif
       unsigned int update:1;
       unsigned int remove:1;
+      unsigned int remove_aborted_writers:1;
       unsigned int open_read_timeout:1; // UNUSED
       unsigned int data_done:1;
       unsigned int read_from_writer_called:1;
@@ -915,8 +911,9 @@
                                 CacheFragType frag_type, bool overwrite = false,
                                 time_t pin_in_cache = (time_t) 0, char *hostname = 0, int host_len = 0);
   inkcoreapi Action *remove(Continuation *cont, CacheKey *key,
+                            CacheFragType type = CACHE_FRAG_TYPE_HTTP, 
                             bool user_agents = true, bool link = false,
-                            CacheFragType type = CACHE_FRAG_TYPE_HTTP, char *hostname = 0, int host_len = 0);
+                            char *hostname = 0, int host_len = 0);
   Action *scan(Continuation *cont, char *hostname = 0, int host_len = 0, int KB_per_second = 2500);
 
 #ifdef HTTP_CACHE
@@ -1134,8 +1131,8 @@
 }
 
 inline Action *
-CacheProcessor::remove(Continuation *cont, CacheKey *key,
-                       bool rm_user_agents, bool rm_link, CacheFragType frag_type, char *hostname, int host_len)
+CacheProcessor::remove(Continuation *cont, CacheKey *key, CacheFragType frag_type,
+                       bool rm_user_agents, bool rm_link, char *hostname, int host_len)
 {
 #ifdef CLUSTER_CACHE
   if (cache_clustering_enabled > 0) {
@@ -1146,7 +1143,7 @@
     }
   }
 #endif
-  return caches[frag_type]->remove(cont, key, rm_user_agents, rm_link, frag_type, hostname, host_len);
+  return caches[frag_type]->remove(cont, key, frag_type, rm_user_agents, rm_link, hostname, host_len);
 }
 
 inline Action *
@@ -1168,8 +1165,6 @@
   return lookup(cont, &md5, local_only, frag_type, (char *) hostname, host_len);
 }
 
-
-
 inline Action *
 CacheProcessor::open_read_buffer(Continuation *cont, MIOBuffer *buf,
                                  URL *url, CacheHTTPHdr *request, CacheLookupHttpConfig *params, CacheFragType type)
@@ -1184,8 +1179,6 @@
   return caches[type]->open_read(cont, url, request, params, type);
 }
 
-
-
 inline Action *
 CacheProcessor::open_write_buffer(Continuation * cont, MIOBuffer * buf, URL * url,
                                   CacheHTTPHdr * request, CacheHTTPHdr * response, CacheFragType type)
@@ -1203,7 +1196,6 @@
 #endif
 
 
-
 #ifdef CLUSTER_CACHE
 inline Action *
 CacheProcessor::open_read_internal(int opcode,
@@ -1291,13 +1283,4 @@
   return theCache;
 }
 
-inline int
-cache_history_dump()
-{
-  return 0;
-}
-
-
-
-
 #endif /* _P_CACHE_INTERNAL_H__ */

Modified: incubator/trafficserver/traffic/branches/dev/iocore/cluster/ClusterCache.cc
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/branches/dev/iocore/cluster/ClusterCache.cc?rev=908221&r1=908220&r2=908221&view=diff
==============================================================================
--- incubator/trafficserver/traffic/branches/dev/iocore/cluster/ClusterCache.cc (original)
+++ incubator/trafficserver/traffic/branches/dev/iocore/cluster/ClusterCache.cc Tue Feb  9 21:11:49 2010
@@ -1395,10 +1395,10 @@
       }
 
       Cache *call_cache = caches[c->frag_type];
-      Action *a = call_cache->remove(c, &key,
+      Action *a = call_cache->remove(c, &key, c->frag_type,
                                      !!(c->cfl_flags & CFL_REMOVE_USER_AGENTS),
                                      !!(c->cfl_flags & CFL_REMOVE_LINK),
-                                     c->frag_type, hostname, host_len);
+                                     hostname, host_len);
       if (a != ACTION_RESULT_DONE) {
         c->cache_action = a;
       }

Modified: incubator/trafficserver/traffic/branches/dev/proxy/InkAPI.cc
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/branches/dev/proxy/InkAPI.cc?rev=908221&r1=908220&r2=908221&view=diff
==============================================================================
--- incubator/trafficserver/traffic/branches/dev/proxy/InkAPI.cc (original)
+++ incubator/trafficserver/traffic/branches/dev/proxy/InkAPI.cc Tue Feb  9 21:11:49 2010
@@ -7070,7 +7070,7 @@
   CacheInfo *info = (CacheInfo *) key;
   INKContInternal *i = (INKContInternal *) contp;
   return (INKAction)
-    cacheProcessor.remove(i, &info->cache_key, true, false, info->frag_type, info->hostname, info->len);
+    cacheProcessor.remove(i, &info->cache_key, info->frag_type, true, false, info->hostname, info->len);
 }
 
 INKAction