TS-2156: Fix stats trap in different type of threads There are two ways to create threads in ATS: 1) By EventProcessor::spawn_event_threads(), such as ET_NET threads. 2) By EventProcessor::spawn_thread(), such as flush thread.
But I found that we can't stats the same things across these two type of threads. This patch will make stats in both type of threads transparent for upper layer developers. BTW: renames "dthreads" to "all_dthreads" to keep naming consistency with "all_ethreads". Signed-off-by: Yunkai Zhang <qiushu....@taobao.com> Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/fb20be52 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/fb20be52 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/fb20be52 Branch: refs/heads/5.0.x Commit: fb20be5250272d010503a0a642d7f1deaa17d065 Parents: 4633563 Author: Yunkai Zhang <qiushu....@taobao.com> Authored: Mon Aug 26 15:24:37 2013 +0800 Committer: Yunkai Zhang <qiushu....@taobao.com> Committed: Tue Aug 27 14:33:13 2013 +0800 ---------------------------------------------------------------------- CHANGES | 2 ++ iocore/eventsystem/I_EventProcessor.h | 2 +- iocore/eventsystem/P_UnixEventProcessor.h | 2 +- iocore/eventsystem/UnixEventProcessor.cc | 6 ++--- lib/records/RecProcess.cc | 33 ++++++++++++++++++++++++++ proxy/StatSystem.h | 8 +++++++ 6 files changed, 48 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fb20be52/CHANGES ---------------------------------------------------------------------- diff --git a/CHANGES b/CHANGES index f249ab1..c71119d 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,8 @@ Changes with Apache Traffic Server 4.1.0 + *) [TS-2156] Fix stats trap in different type of threads + *) [TS-2160] Remove ats_is_ip_nonroutable and replace it with the less confusing ats_is_ip_linklocal and ats_is_ip_private. http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fb20be52/iocore/eventsystem/I_EventProcessor.h ---------------------------------------------------------------------- diff --git a/iocore/eventsystem/I_EventProcessor.h b/iocore/eventsystem/I_EventProcessor.h index cf2f796..40d8e94 100644 --- a/iocore/eventsystem/I_EventProcessor.h +++ b/iocore/eventsystem/I_EventProcessor.h @@ -314,7 +314,7 @@ public: Event * schedule(Event * e, EventType etype, bool fast_signal = false); EThread *assign_thread(EventType etype); - EThread *dthreads[MAX_EVENT_THREADS]; + EThread *all_dthreads[MAX_EVENT_THREADS]; int n_dthreads; // No. of dedicated threads volatile int thread_data_used; }; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fb20be52/iocore/eventsystem/P_UnixEventProcessor.h ---------------------------------------------------------------------- diff --git a/iocore/eventsystem/P_UnixEventProcessor.h b/iocore/eventsystem/P_UnixEventProcessor.h index 7249770..d9a1e73 100644 --- a/iocore/eventsystem/P_UnixEventProcessor.h +++ b/iocore/eventsystem/P_UnixEventProcessor.h @@ -36,7 +36,7 @@ n_dthreads(0), thread_data_used(0) { memset(all_ethreads, 0, sizeof(all_ethreads)); - memset(dthreads, 0, sizeof(dthreads)); + memset(all_dthreads, 0, sizeof(all_dthreads)); memset(n_threads_for_type, 0, sizeof(n_threads_for_type)); memset(next_thread_for_type, 0, sizeof(next_thread_for_type)); } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fb20be52/iocore/eventsystem/UnixEventProcessor.cc ---------------------------------------------------------------------- diff --git a/iocore/eventsystem/UnixEventProcessor.cc b/iocore/eventsystem/UnixEventProcessor.cc index 776eb64..29f730a 100644 --- a/iocore/eventsystem/UnixEventProcessor.cc +++ b/iocore/eventsystem/UnixEventProcessor.cc @@ -223,9 +223,9 @@ EventProcessor::spawn_thread(Continuation *cont, const char* thr_name, size_t st Event *e = eventAllocator.alloc(); e->init(cont, 0, 0); - dthreads[n_dthreads] = NEW(new EThread(DEDICATED, e, sem)); - e->ethread = dthreads[n_dthreads]; - e->mutex = e->continuation->mutex = dthreads[n_dthreads]->mutex; + all_dthreads[n_dthreads] = NEW(new EThread(DEDICATED, e, sem)); + e->ethread = all_dthreads[n_dthreads]; + e->mutex = e->continuation->mutex = all_dthreads[n_dthreads]->mutex; n_dthreads++; e->ethread->start(thr_name, stacksize); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fb20be52/lib/records/RecProcess.cc ---------------------------------------------------------------------- diff --git a/lib/records/RecProcess.cc b/lib/records/RecProcess.cc index 3f1f34e..f5606cc 100644 --- a/lib/records/RecProcess.cc +++ b/lib/records/RecProcess.cc @@ -117,6 +117,13 @@ raw_stat_get_total(RecRawStatBlock *rsb, int id, RecRawStat *total) total->sum += tlp->sum; total->count += tlp->count; } + + for (i = 0; i < eventProcessor.n_dthreads; i++) { + tlp = ((RecRawStat *) ((char *) (eventProcessor.all_dthreads[i]) + rsb->ethr_stat_offset)) + id; + total->sum += tlp->sum; + total->count += tlp->count; + } + if (total->sum < 0) { // Assure that we stay positive total->sum = 0; } @@ -144,6 +151,13 @@ raw_stat_sync_to_global(RecRawStatBlock *rsb, int id) total.sum += tlp->sum; total.count += tlp->count; } + + for (i = 0; i < eventProcessor.n_dthreads; i++) { + tlp = ((RecRawStat *) ((char *) (eventProcessor.all_dthreads[i]) + rsb->ethr_stat_offset)) + id; + total.sum += tlp->sum; + total.count += tlp->count; + } + if (total.sum < 0) { // Assure that we stay positive total.sum = 0; } @@ -198,6 +212,13 @@ raw_stat_clear(RecRawStatBlock *rsb, int id) ink_atomic_swap(&(tlp->sum), (int64_t)0); ink_atomic_swap(&(tlp->count), (int64_t)0); } + + for (int i = 0; i < eventProcessor.n_dthreads; i++) { + tlp = ((RecRawStat *) ((char *) (eventProcessor.all_dthreads[i]) + rsb->ethr_stat_offset)) + id; + ink_atomic_swap(&(tlp->sum), (int64_t)0); + ink_atomic_swap(&(tlp->count), (int64_t)0); + } + return REC_ERR_OKAY; } @@ -223,6 +244,12 @@ raw_stat_clear_sum(RecRawStatBlock *rsb, int id) tlp = ((RecRawStat *) ((char *) (eventProcessor.all_ethreads[i]) + rsb->ethr_stat_offset)) + id; ink_atomic_swap(&(tlp->sum), (int64_t)0); } + + for (int i = 0; i < eventProcessor.n_dthreads; i++) { + tlp = ((RecRawStat *) ((char *) (eventProcessor.all_dthreads[i]) + rsb->ethr_stat_offset)) + id; + ink_atomic_swap(&(tlp->sum), (int64_t)0); + } + return REC_ERR_OKAY; } @@ -248,6 +275,12 @@ raw_stat_clear_count(RecRawStatBlock *rsb, int id) tlp = ((RecRawStat *) ((char *) (eventProcessor.all_ethreads[i]) + rsb->ethr_stat_offset)) + id; ink_atomic_swap(&(tlp->count), (int64_t)0); } + + for (int i = 0; i < eventProcessor.n_dthreads; i++) { + tlp = ((RecRawStat *) ((char *) (eventProcessor.all_dthreads[i]) + rsb->ethr_stat_offset)) + id; + ink_atomic_swap(&(tlp->count), (int64_t)0); + } + return REC_ERR_OKAY; } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/fb20be52/proxy/StatSystem.h ---------------------------------------------------------------------- diff --git a/proxy/StatSystem.h b/proxy/StatSystem.h index 6d56797..32128ab 100644 --- a/proxy/StatSystem.h +++ b/proxy/StatSystem.h @@ -410,6 +410,10 @@ global_dyn_stats[X].sum = 0 _s.count += eventProcessor.all_ethreads[_e]->global_dyn_stats[X].count; \ _s.sum += eventProcessor.all_ethreads[_e]->global_dyn_stats[X].sum; \ } \ + for (int _e = 0; _e < eventProcessor.n_dthreads ; _e++) { \ + _s.count += eventProcessor.all_dthreads[_e]->global_dyn_stats[X].count; \ + _s.sum += eventProcessor.all_dthreads[_e]->global_dyn_stats[X].sum; \ + } \ C = _s.count; \ S = _s.sum; \ } while (0) @@ -418,6 +422,8 @@ global_dyn_stats[X].sum = 0 ink_statval_t _s = global_dyn_stats[X].count; \ for (int _e = 0; _e < eventProcessor.n_ethreads ; _e++) \ _s += eventProcessor.all_ethreads[_e]->global_dyn_stats[X].count; \ + for (int _e = 0; _e < eventProcessor.n_dthreads ; _e++) \ + _s += eventProcessor.all_dthreads[_e]->global_dyn_stats[X].count; \ C = _s; \ } while (0) @@ -425,6 +431,8 @@ global_dyn_stats[X].sum = 0 ink_statval_t _s = global_dyn_stats[X].sum; \ for (int _e = 0; _e < eventProcessor.n_ethreads ; _e++) \ _s += eventProcessor.all_ethreads[_e]->global_dyn_stats[X].sum; \ + for (int _e = 0; _e < eventProcessor.n_dthreads ; _e++) \ + _s += eventProcessor.all_dthreads[_e]->global_dyn_stats[X].sum; \ S = _s; \ } while (0)