You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by bc...@apache.org on 2010/03/22 22:41:56 UTC

svn commit: r926357 - in /incubator/trafficserver/traffic/trunk/librecords: I_RecDefs.h RecProcess.cc

Author: bcall
Date: Mon Mar 22 21:41:55 2010
New Revision: 926357

URL: http://svn.apache.org/viewvc?rev=926357&view=rev
Log:
TS-162 Fix so the thread that syncs the stats doesn't modify the local
thread stats value.

Modified:
    incubator/trafficserver/traffic/trunk/librecords/I_RecDefs.h
    incubator/trafficserver/traffic/trunk/librecords/RecProcess.cc

Modified: incubator/trafficserver/traffic/trunk/librecords/I_RecDefs.h
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/librecords/I_RecDefs.h?rev=926357&r1=926356&r2=926357&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/librecords/I_RecDefs.h (original)
+++ incubator/trafficserver/traffic/trunk/librecords/I_RecDefs.h Mon Mar 22 21:41:55 2010
@@ -141,6 +141,11 @@ struct RecRawStat
 {
   ink64 sum;
   ink64 count;
+  // XXX - these will waist some space because they are only needed for the globals
+  // this is a fix for bug TS-162, so I am trying to do as few code changes as
+  // possible, this should be revisted -bcall
+  ink64 last_sum; // value from the last global sync
+  ink64 last_count; // value from the last global sync
 };
 
 // WARNING!  It's advised that developers do not modify the contents of

Modified: incubator/trafficserver/traffic/trunk/librecords/RecProcess.cc
URL: http://svn.apache.org/viewvc/incubator/trafficserver/traffic/trunk/librecords/RecProcess.cc?rev=926357&r1=926356&r2=926357&view=diff
==============================================================================
--- incubator/trafficserver/traffic/trunk/librecords/RecProcess.cc (original)
+++ incubator/trafficserver/traffic/trunk/librecords/RecProcess.cc Mon Mar 22 21:41:55 2010
@@ -73,7 +73,7 @@ raw_stat_get_total(RecRawStatBlock * rsb
 //-------------------------------------------------------------------------
 
 static int
-raw_stat_sync_to_global(RecRawStatBlock * rsb, int id)
+raw_stat_sync_to_global(RecRawStatBlock *rsb, int id)
 {
 
   int i;
@@ -82,16 +82,27 @@ raw_stat_sync_to_global(RecRawStatBlock 
   total.sum = 0;
   total.count = 0;
 
-  // get thread local values and reset them to 0
+  // sum the thread local values
   for (i = 0; i < eventProcessor.n_ethreads; i++) {
     tlp = ((RecRawStat *) ((char *) (eventProcessor.all_ethreads[i]) + rsb->ethr_stat_offset)) + id;
-    total.sum += ink_atomic_swap64(&(tlp->sum), 0);
-    total.count += ink_atomic_swap64(&(tlp->count), 0);
+    total.sum += tlp->sum;
+    total.count += tlp->count;
   }
 
-  // set global values
-  ink_atomic_increment64(&(rsb->global[id]->sum), total.sum);
-  ink_atomic_increment64(&(rsb->global[id]->count), total.count);
+  // get the delta from the last sync
+  RecRawStat delta;
+  delta.sum = total.sum - rsb->global[id]->last_sum;
+  delta.count = total.count - rsb->global[id]->last_count;
+
+  Debug("stats", "raw_stat_sync_to_global(): rsb pointer:%016llX id:%d delta:%lld total:%lld last:%lld global:%lld\n", (long long)rsb, id, delta.sum, total.sum, rsb->global[id]->last_sum, rsb->global[id]->sum);
+
+  // increment the global values by the delta
+  ink_atomic_increment64(&(rsb->global[id]->sum), delta.sum);
+  ink_atomic_increment64(&(rsb->global[id]->count), delta.count);
+
+  // set the new totals as the last values seen
+  ink_atomic_swap64(&(rsb->global[id]->last_sum), total.sum);
+  ink_atomic_swap64(&(rsb->global[id]->last_count), total.count);
 
   return REC_ERR_OKAY;
 
@@ -102,19 +113,21 @@ raw_stat_sync_to_global(RecRawStatBlock 
 //-------------------------------------------------------------------------
 
 static int
-raw_stat_clear_sum(RecRawStatBlock * rsb, int id)
+raw_stat_clear_sum(RecRawStatBlock *rsb, int id)
 {
+  Debug("stats", "raw_stat_clear_sum(): rsb pointer:%llX id:%d\n", (long long)rsb, id);
 
-  int i;
+  // the globals need to be reset too
+  ink_atomic_swap64(&(rsb->global[id]->sum), 0);
+  ink_atomic_swap64(&(rsb->global[id]->last_sum), 0);
+
+  // reset the local stats
   RecRawStat *tlp;
-  // waste. 
-//  ink_atomic_swap64(&(rsb->global[id]->sum), 0);
-  for (i = 0; i < eventProcessor.n_ethreads; i++) {
+  for (int i = 0; i < eventProcessor.n_ethreads; i++) {
     tlp = ((RecRawStat *) ((char *) (eventProcessor.all_ethreads[i]) + rsb->ethr_stat_offset)) + id;
     ink_atomic_swap64(&(tlp->sum), 0);
   }
   return REC_ERR_OKAY;
-
 }
 
 //-------------------------------------------------------------------------
@@ -124,17 +137,19 @@ raw_stat_clear_sum(RecRawStatBlock * rsb
 static int
 raw_stat_clear_count(RecRawStatBlock * rsb, int id)
 {
+  Debug("stats", "raw_stat_clear_count(): rsb pointer:%llX id:%d\n", (long long)rsb, id);
 
-  int i;
+  // the globals need to be reset too
+  ink_atomic_swap64(&(rsb->global[id]->count), 0);
+  ink_atomic_swap64(&(rsb->global[id]->last_count), 0);
+
+  // reset the local stats
   RecRawStat *tlp;
-  // waste.
-//  ink_atomic_swap64(&(rsb->global[id]->count), 0);
-  for (i = 0; i < eventProcessor.n_ethreads; i++) {
+  for (int i = 0; i < eventProcessor.n_ethreads; i++) {
     tlp = ((RecRawStat *) ((char *) (eventProcessor.all_ethreads[i]) + rsb->ethr_stat_offset)) + id;
     ink_atomic_swap64(&(tlp->count), 0);
   }
   return REC_ERR_OKAY;
-
 }
 
 //-------------------------------------------------------------------------
@@ -406,6 +421,8 @@ RecRegisterRawStat(RecRawStatBlock * rsb
                    char *name, RecDataT data_type, RecPersistT persist_type, int id, RecRawStatSyncCb sync_cb)
 {
 
+  Debug("stats", "RecRawStatSyncCb(): rsb pointer:%llX id:%d\n", (long long)rsb, id);
+
   // check to see if we're good to proceed
   ink_debug_assert(id < rsb->max_stats);
 
@@ -428,6 +445,8 @@ RecRegisterRawStat(RecRawStatBlock * rsb
 
   // store a pointer to our record->stat_meta.data_raw in our rsb
   rsb->global[id] = &(r->stat_meta.data_raw);
+  rsb->global[id]->last_sum = 0;
+  rsb->global[id]->last_count = 0;
 
   // setup the periodic sync callback
   RecRegisterRawStatSyncCb(name, sync_cb, rsb, id);