You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by mi...@apache.org on 2010/03/27 17:31:56 UTC

svn commit: r928223 - in /httpd/httpd/trunk: CHANGES support/htcacheclean.c

Author: minfrin
Date: Sat Mar 27 16:31:56 2010
New Revision: 928223

URL: http://svn.apache.org/viewvc?rev=928223&view=rev
Log:
htcacheclean: Report additional statistics about entries deleted.
PR: 48944
Submitted by: Mark Drayton mark markdrayton.info

Modified:
    httpd/httpd/trunk/CHANGES
    httpd/httpd/trunk/support/htcacheclean.c

Modified: httpd/httpd/trunk/CHANGES
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/CHANGES?rev=928223&r1=928222&r2=928223&view=diff
==============================================================================
--- httpd/httpd/trunk/CHANGES [utf-8] (original)
+++ httpd/httpd/trunk/CHANGES [utf-8] Sat Mar 27 16:31:56 2010
@@ -28,6 +28,9 @@ Changes with Apache 2.3.7
      processing is completed, avoiding orphaned callback pointers.
      [Brett Gervasoni <brettg senseofsecurity.com>, Jeff Trawick]
 
+  *) htcacheclean: Report additional statistics about entries deleted.
+     PR 48944. [Mark Drayton mark markdrayton.info]
+
   *) Introduce SSLFIPS directive to support OpenSSL FIPS_mode; permits all
      builds of mod_ssl to use 'SSLFIPS off' for portability, but the proper
      build of openssl is required for 'SSLFIPS on'.  PR 46270.

Modified: httpd/httpd/trunk/support/htcacheclean.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/support/htcacheclean.c?rev=928223&r1=928222&r2=928223&view=diff
==============================================================================
--- httpd/httpd/trunk/support/htcacheclean.c (original)
+++ httpd/httpd/trunk/support/htcacheclean.c Sat Mar 27 16:31:56 2010
@@ -109,6 +109,19 @@ static APR_RING_ENTRY(_entry) root; /* E
 /* short program name as called */
 static const char *shortname = "htcacheclean";
 
+/* what did we clean? */
+struct stats {
+    apr_off_t total;
+    apr_off_t sum;
+    apr_off_t max;
+    apr_off_t etotal;
+    apr_off_t entries;
+    apr_off_t dfuture;
+    apr_off_t dexpired;
+    apr_off_t dfresh;
+};
+
+
 #ifdef DEBUG
 /*
  * fake delete for debug purposes
@@ -154,8 +167,7 @@ static int oom(int unused)
 /*
  * print purge statistics
  */
-static void printstats(apr_off_t total, apr_off_t sum, apr_off_t max,
-                       apr_off_t etotal, apr_off_t entries)
+static void printstats(char *path, struct stats *s)
 {
     char ttype, stype, mtype, utype;
     apr_off_t tfrag, sfrag, ufrag;
@@ -165,31 +177,31 @@ static void printstats(apr_off_t total, 
     }
 
     ttype = 'K';
-    tfrag = ((total * 10) / KBYTE) % 10;
-    total /= KBYTE;
-    if (total >= KBYTE) {
+    tfrag = ((s->total * 10) / KBYTE) % 10;
+    s->total /= KBYTE;
+    if (s->total >= KBYTE) {
         ttype = 'M';
-        tfrag = ((total * 10) / KBYTE) % 10;
-        total /= KBYTE;
+        tfrag = ((s->total * 10) / KBYTE) % 10;
+        s->total /= KBYTE;
     }
 
     stype = 'K';
-    sfrag = ((sum * 10) / KBYTE) % 10;
-    sum /= KBYTE;
-    if (sum >= KBYTE) {
+    sfrag = ((s->sum * 10) / KBYTE) % 10;
+    s->sum /= KBYTE;
+    if (s->sum >= KBYTE) {
         stype = 'M';
-        sfrag = ((sum * 10) / KBYTE) % 10;
-        sum /= KBYTE;
+        sfrag = ((s->sum * 10) / KBYTE) % 10;
+        s->sum /= KBYTE;
     }
 
     mtype = 'K';
-    max /= KBYTE;
-    if (max >= KBYTE) {
+    s->max /= KBYTE;
+    if (s->max >= KBYTE) {
         mtype = 'M';
-        max /= KBYTE;
+        s->max /= KBYTE;
     }
 
-    apr_file_printf(errfile, "Statistics:" APR_EOL_STR);
+    apr_file_printf(errfile, "Cleaned %s. Statistics:" APR_EOL_STR, path);
     if (unsolicited) {
         utype = 'K';
         ufrag = ((unsolicited * 10) / KBYTE) % 10;
@@ -206,13 +218,18 @@ static void printstats(apr_off_t total, 
                         (int)(unsolicited), (int)(ufrag), utype);
      }
      apr_file_printf(errfile, "size limit %d.0%c" APR_EOL_STR,
-                     (int)(max), mtype);
+                     (int)(s->max), mtype);
      apr_file_printf(errfile, "total size was %d.%d%c, total size now "
                               "%d.%d%c" APR_EOL_STR,
-                     (int)(total), (int)(tfrag), ttype, (int)(sum),
-                     (int)(sfrag), stype);
+                     (int)(s->total), (int)(tfrag), ttype,
+                     (int)(s->sum), (int)(sfrag), stype);
      apr_file_printf(errfile, "total entries was %d, total entries now %d"
-                              APR_EOL_STR, (int)(etotal), (int)(entries));
+                              APR_EOL_STR, (int)(s->etotal),
+                              (int)(s->entries));
+     apr_file_printf(errfile, "%d entries deleted (%d from future, %d "
+                              "expired, %d fresh)" APR_EOL_STR,
+                     (int)(s->etotal - s->entries), (int)(s->dfuture),
+                     (int)(s->dexpired), (int)(s->dfresh));
 }
 
 /*
@@ -596,25 +613,29 @@ static int process_dir(char *path, apr_p
  */
 static void purge(char *path, apr_pool_t *pool, apr_off_t max)
 {
-    apr_off_t sum, total, entries, etotal;
     ENTRY *e, *n, *oldest;
 
-    sum = 0;
-    entries = 0;
+    struct stats s;
+    s.sum = 0;
+    s.entries = 0;
+    s.dfuture = 0;
+    s.dexpired = 0;
+    s.dfresh = 0;
+    s.max = max;
 
     for (e = APR_RING_FIRST(&root);
          e != APR_RING_SENTINEL(&root, _entry, link);
          e = APR_RING_NEXT(e, link)) {
-        sum += e->hsize;
-        sum += e->dsize;
-        entries++;
+        s.sum += e->hsize;
+        s.sum += e->dsize;
+        s.entries++;
     }
 
-    total = sum;
-    etotal = entries;
+    s.total = s.sum;
+    s.etotal = s.entries;
 
-    if (sum <= max) {
-        printstats(total, sum, max, etotal, entries);
+    if (s.sum <= s.max) {
+        printstats(path, &s);
         return;
     }
 
@@ -627,13 +648,14 @@ static void purge(char *path, apr_pool_t
         n = APR_RING_NEXT(e, link);
         if (e->response_time > now || e->htime > now || e->dtime > now) {
             delete_entry(path, e->basename, pool);
-            sum -= e->hsize;
-            sum -= e->dsize;
-            entries--;
+            s.sum -= e->hsize;
+            s.sum -= e->dsize;
+            s.entries--;
+            s.dfuture++;
             APR_RING_REMOVE(e, link);
-            if (sum <= max) {
+            if (s.sum <= s.max) {
                 if (!interrupted) {
-                    printstats(total, sum, max, etotal, entries);
+                    printstats(path, &s);
                 }
                 return;
             }
@@ -651,13 +673,14 @@ static void purge(char *path, apr_pool_t
         n = APR_RING_NEXT(e, link);
         if (e->expire != APR_DATE_BAD && e->expire < now) {
             delete_entry(path, e->basename, pool);
-            sum -= e->hsize;
-            sum -= e->dsize;
-            entries--;
+            s.sum -= e->hsize;
+            s.sum -= e->dsize;
+            s.entries--;
+            s.dexpired++;
             APR_RING_REMOVE(e, link);
-            if (sum <= max) {
+            if (s.sum <= s.max) {
                 if (!interrupted) {
-                    printstats(total, sum, max, etotal, entries);
+                    printstats(path, &s);
                 }
                 return;
             }
@@ -674,7 +697,8 @@ static void purge(char *path, apr_pool_t
      * corrupt 64bit arithmetics which happend to me once, so better safe
      * than sorry
      */
-    while (sum > max && !interrupted && !APR_RING_EMPTY(&root, _entry, link)) {
+    while (s.sum > s.max && !interrupted
+           && !APR_RING_EMPTY(&root, _entry, link)) {
         oldest = APR_RING_FIRST(&root);
 
         for (e = APR_RING_NEXT(oldest, link);
@@ -686,14 +710,15 @@ static void purge(char *path, apr_pool_t
         }
 
         delete_entry(path, oldest->basename, pool);
-        sum -= oldest->hsize;
-        sum -= oldest->dsize;
-        entries--;
+        s.sum -= oldest->hsize;
+        s.sum -= oldest->dsize;
+        s.entries--;
+        s.dfresh++;
         APR_RING_REMOVE(oldest, link);
     }
 
     if (!interrupted) {
-        printstats(total, sum, max, etotal, entries);
+        printstats(path, &s);
     }
 }