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);