Repository: trafficserver Updated Branches: refs/heads/master fba9b2e36 -> 7785723e4
TS-2831 SPDY statistics. Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/7785723e Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/7785723e Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/7785723e Branch: refs/heads/master Commit: 7785723e475fd498f360cc91b16a617dfb39ae98 Parents: fba9b2e Author: Alan M. Carroll <a...@network-geographics.com> Authored: Thu May 22 11:35:41 2014 -0700 Committer: Alan M. Carroll <a...@network-geographics.com> Committed: Thu May 22 11:35:41 2014 -0700 ---------------------------------------------------------------------- proxy/spdy/SpdyClientSession.cc | 44 ++++++++++++++++++++++++++---------- proxy/spdy/SpdyClientSession.h | 11 +-------- proxy/spdy/SpdyCommon.cc | 9 +++++--- proxy/spdy/SpdyCommon.h | 10 +++++++- proxy/spdy/SpdySessionAccept.cc | 1 - 5 files changed, 48 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/7785723e/proxy/spdy/SpdyClientSession.cc ---------------------------------------------------------------------- diff --git a/proxy/spdy/SpdyClientSession.cc b/proxy/spdy/SpdyClientSession.cc index 602b2ee..2c77ff6 100644 --- a/proxy/spdy/SpdyClientSession.cc +++ b/proxy/spdy/SpdyClientSession.cc @@ -32,12 +32,27 @@ static int spdy_process_write(TSEvent event, SpdyClientSession *sm); static int spdy_process_fetch(TSEvent event, SpdyClientSession *sm, void *edata); static int spdy_process_fetch_header(TSEvent event, SpdyClientSession *sm, TSFetchSM fetch_sm); static int spdy_process_fetch_body(TSEvent event, SpdyClientSession *sm, TSFetchSM fetch_sm); -static uint64_t g_sm_id; -static uint64_t g_sm_cnt; +static uint64_t g_sm_id = 1; + +void +SpdyRequest::init(SpdyClientSession *sm, int id) +{ + spdy_sm = sm; + stream_id = id; + headers.clear(); + + MD5_Init(&recv_md5); + start_time = TShrtime(); + + SpdyStatIncrCount(Config::STAT_ACTIVE_STREAM_COUNT, sm); + SpdyStatIncrCount(Config::STAT_TOTAL_STREAM_COUNT, sm); +} void SpdyRequest::clear() { + SpdyStatDecrCount(Config::STAT_ACTIVE_STREAM_COUNT, spdy_sm); + if (fetch_sm) TSFetchDestroy(fetch_sm); @@ -58,14 +73,18 @@ SpdyClientSession::init(NetVConnection * netvc, spdylay_proto_version vers) { int r; - atomic_inc(g_sm_cnt); - this->mutex = new_ProxyMutex(); this->vc = netvc; this->req_map.clear(); - r = spdylay_session_server_new(&session, vers, - &SPDY_CFG.spdy.callbacks, this); + r = spdylay_session_server_new(&session, vers, &SPDY_CFG.spdy.callbacks, this); + + // A bit ugly but we need a thread and I don't want to wait until the + // session start event in case of a time out generating a decrement + // with no increment. It seems a lesser thing to have the thread counts + // a little off but globally consistent. + SpdyStatIncrCount(Config::STAT_ACTIVE_SESSION_COUNT, netvc); + ink_release_assert(r == 0); sm_id = atomic_inc(g_sm_id); total_size = 0; @@ -79,8 +98,10 @@ SpdyClientSession::init(NetVConnection * netvc, spdylay_proto_version vers) void SpdyClientSession::clear() { - uint64_t nr_pending; int last_event = event; + + SpdyStatDecrCount(Config::STAT_ACTIVE_SESSION_COUNT, this); + // // SpdyRequest depends on SpdyClientSession, // we should delete it firstly to avoid race. @@ -131,9 +152,8 @@ SpdyClientSession::clear() session = NULL; } - nr_pending = atomic_dec(g_sm_cnt); - Debug("spdy-free", "****Delete SpdyClientSession[%" PRIu64 "], last event:%d, nr_pending:%" PRIu64, - sm_id, last_event, --nr_pending); + Debug("spdy-free", "****Delete SpdyClientSession[%" PRIu64 "], last event:%d" PRIu64, + sm_id, last_event); } void @@ -209,8 +229,8 @@ SpdyClientSession::state_session_readwrite(int event, void * edata) ret = spdy_process_fetch((TSEvent)event, this, edata); } - Debug("spdy-event", "++++SpdyClientSession[%" PRIu64 "], EVENT:%d, ret:%d, nr_pending:%" PRIu64, - this->sm_id, event, ret, g_sm_cnt); + Debug("spdy-event", "++++SpdyClientSession[%" PRIu64 "], EVENT:%d, ret:%d", + this->sm_id, event, ret); out: if (ret) { this->clear(); http://git-wip-us.apache.org/repos/asf/trafficserver/blob/7785723e/proxy/spdy/SpdyClientSession.h ---------------------------------------------------------------------- diff --git a/proxy/spdy/SpdyClientSession.h b/proxy/spdy/SpdyClientSession.h index 5845b84..2f37d35 100644 --- a/proxy/spdy/SpdyClientSession.h +++ b/proxy/spdy/SpdyClientSession.h @@ -56,16 +56,7 @@ public: clear(); } - void init(SpdyClientSession *sm, int id) - { - spdy_sm = sm; - stream_id = id; - headers.clear(); - - MD5_Init(&recv_md5); - start_time = TShrtime(); - } - + void init(SpdyClientSession *sm, int id); void clear(); void append_nv(char **nv) http://git-wip-us.apache.org/repos/asf/trafficserver/blob/7785723e/proxy/spdy/SpdyCommon.cc ---------------------------------------------------------------------- diff --git a/proxy/spdy/SpdyCommon.cc b/proxy/spdy/SpdyCommon.cc index 47358c2..0b89bf8 100644 --- a/proxy/spdy/SpdyCommon.cc +++ b/proxy/spdy/SpdyCommon.cc @@ -27,8 +27,9 @@ Config SPDY_CFG; // statistic names -// Total # of streams created. -static char const * const SPDY_STAT_TOTAL_STREAMS_NAME = "proxy.process.spdy.total_streams"; +static char const * const SPDY_STAT_ACTIVE_SESSION_NAME = "proxy.process.spdy.active_sessions"; +static char const * const SPDY_STAT_ACTIVE_STREAM_NAME = "proxy.process.spdy.active_streams"; +static char const * const SPDY_STAT_TOTAL_STREAM_NAME = "proxy.process.spdy.total_streams"; string http_date(time_t t) @@ -52,7 +53,9 @@ spdy_config_load() // Get our statistics up SPDY_CFG.rsb = RecAllocateRawStatBlock(static_cast<int>(Config::N_STATS)); - RecRegisterRawStat(SPDY_CFG.rsb, RECT_PROCESS, SPDY_STAT_TOTAL_STREAMS_NAME, RECD_INT, RECP_NON_PERSISTENT, static_cast<int>(Config::STAT_TOTAL_STREAMS), RecRawStatSyncCount); + RecRegisterRawStat(SPDY_CFG.rsb, RECT_PROCESS, SPDY_STAT_ACTIVE_SESSION_NAME, RECD_INT, RECP_NON_PERSISTENT, static_cast<int>(Config::STAT_ACTIVE_SESSION_COUNT), RecRawStatSyncCount); + RecRegisterRawStat(SPDY_CFG.rsb, RECT_PROCESS, SPDY_STAT_ACTIVE_STREAM_NAME, RECD_INT, RECP_NON_PERSISTENT, static_cast<int>(Config::STAT_ACTIVE_STREAM_COUNT), RecRawStatSyncCount); + RecRegisterRawStat(SPDY_CFG.rsb, RECT_PROCESS, SPDY_STAT_TOTAL_STREAM_NAME, RECD_INT, RECP_NON_PERSISTENT, static_cast<int>(Config::STAT_TOTAL_STREAM_COUNT), RecRawStatSyncCount); return 0; } http://git-wip-us.apache.org/repos/asf/trafficserver/blob/7785723e/proxy/spdy/SpdyCommon.h ---------------------------------------------------------------------- diff --git a/proxy/spdy/SpdyCommon.h b/proxy/spdy/SpdyCommon.h index 6a701c8..92ab047 100644 --- a/proxy/spdy/SpdyCommon.h +++ b/proxy/spdy/SpdyCommon.h @@ -70,7 +70,9 @@ struct Config { // Statistics /// This is the stat slot index for each statistic. enum StatIndex { - STAT_TOTAL_STREAMS, + STAT_ACTIVE_SESSION_COUNT, ///< Current # of active SPDY sessions. + STAT_ACTIVE_STREAM_COUNT, ///< Current # of active SPDY streams. + STAT_TOTAL_STREAM_COUNT, ///< Total number of streams created. N_STATS ///< Terminal counter, NOT A STAT INDEX. }; RecRawStatBlock* rsb; ///< Container for statistics. @@ -104,4 +106,10 @@ inline void SpdyStatIncrCount(Config::StatIndex idx, Continuation* contp) { RecIncrRawStatCount(SPDY_CFG.rsb, contp->mutex->thread_holding, idx, 1); } + +inline void +SpdyStatDecrCount(Config::StatIndex idx, Continuation* contp) { + RecIncrRawStatCount(SPDY_CFG.rsb, contp->mutex->thread_holding, idx, -1); +} + #endif http://git-wip-us.apache.org/repos/asf/trafficserver/blob/7785723e/proxy/spdy/SpdySessionAccept.cc ---------------------------------------------------------------------- diff --git a/proxy/spdy/SpdySessionAccept.cc b/proxy/spdy/SpdySessionAccept.cc index b8c1d75..e679adc 100644 --- a/proxy/spdy/SpdySessionAccept.cc +++ b/proxy/spdy/SpdySessionAccept.cc @@ -52,7 +52,6 @@ SpdySessionAccept::mainEvent(int event, void * edata) #if TS_HAS_SPDY spdy_sm_create(netvc, versmap[this->version], NULL, NULL); - SpdyStatIncrCount(Config::STAT_TOTAL_STREAMS, this); #else Error("accepted a SPDY session, but SPDY support is not available"); netvc->do_io_close();