diff options
author | Josh Blum | 2013-05-11 19:45:33 -0700 |
---|---|---|
committer | Josh Blum | 2013-05-11 19:45:33 -0700 |
commit | 30123ef51202f8e7e8d9da833e42b23ef77e02f3 (patch) | |
tree | 660f82b9ebe8f69ebc7ebd737dba6bfc9b6bd986 /lib | |
parent | 4e210ade63d800b1a8671999f19019abd3c2ae03 (diff) | |
download | sandhi-30123ef51202f8e7e8d9da833e42b23ef77e02f3.tar.gz sandhi-30123ef51202f8e7e8d9da833e42b23ef77e02f3.tar.bz2 sandhi-30123ef51202f8e7e8d9da833e42b23ef77e02f3.zip |
gras: added port downtime measurements
Diffstat (limited to 'lib')
-rw-r--r-- | lib/block_handlers.cpp | 2 | ||||
-rw-r--r-- | lib/gras_impl/input_buffer_queues.hpp | 16 | ||||
-rw-r--r-- | lib/gras_impl/output_buffer_queues.hpp | 23 | ||||
-rw-r--r-- | lib/top_block_query.cpp | 2 |
4 files changed, 37 insertions, 6 deletions
diff --git a/lib/block_handlers.cpp b/lib/block_handlers.cpp index d548ee0..12ba065 100644 --- a/lib/block_handlers.cpp +++ b/lib/block_handlers.cpp @@ -149,6 +149,8 @@ void BlockActor::handle_get_stats( } this->stats.actor_queue_depth = this->GetNumQueuedMessages(); this->stats.bytes_copied = this->input_queues.bytes_copied; + this->stats.inputs_idle = this->input_queues.total_idle_times; + this->stats.outputs_idle = this->output_queues.total_idle_times; //create the message reply object GetStatsMessage message; diff --git a/lib/gras_impl/input_buffer_queues.hpp b/lib/gras_impl/input_buffer_queues.hpp index f9ae3a2..86b0932 100644 --- a/lib/gras_impl/input_buffer_queues.hpp +++ b/lib/gras_impl/input_buffer_queues.hpp @@ -40,6 +40,10 @@ struct InputBufferQueues return null; } + InputBufferQueues(void): + _init_time(time_now()) + {} + ~InputBufferQueues(void) { this->resize(0); @@ -143,7 +147,12 @@ struct InputBufferQueues GRAS_FORCE_INLINE void __update(const size_t i) { + const bool was_ready = _bitset[i]; _bitset.set(i, _enqueued_bytes[i] >= _reserve_bytes[i]); + const bool is_ready = _bitset[i]; + if (is_ready and not was_ready) total_idle_times[i] += (time_now() - _became_idle_times[i]); + if (not is_ready and was_ready) _became_idle_times[i] = time_now(); + ASSERT(total_idle_times[i] <= (time_now() - _init_time)); } GRAS_FORCE_INLINE size_t get_items_enqueued(const size_t i) @@ -166,6 +175,9 @@ struct InputBufferQueues std::vector<size_t> _preload_bytes; std::vector<boost::shared_ptr<SimpleBufferQueue> > _aux_queues; std::vector<item_index_t> bytes_copied; + std::vector<time_ticks_t> total_idle_times; + std::vector<time_ticks_t> _became_idle_times; + const time_ticks_t _init_time; }; @@ -179,7 +191,9 @@ GRAS_FORCE_INLINE void InputBufferQueues::resize(const size_t size) _preload_bytes.resize(size, 0); _reserve_bytes.resize(size, 1); _maximum_bytes.resize(size, MAX_AUX_BUFF_BYTES); - bytes_copied.resize(size); + bytes_copied.resize(size, 0); + total_idle_times.resize(size, 0); + _became_idle_times.resize(size, time_now()); } inline void InputBufferQueues::update_config( diff --git a/lib/gras_impl/output_buffer_queues.hpp b/lib/gras_impl/output_buffer_queues.hpp index f0859a3..2d7304a 100644 --- a/lib/gras_impl/output_buffer_queues.hpp +++ b/lib/gras_impl/output_buffer_queues.hpp @@ -14,6 +14,10 @@ struct OutputBufferQueues { std::string name; //for debug + OutputBufferQueues(void): + _init_time(time_now()) + {} + void set_buffer_queue(const size_t i, BufferQueueSptr queue) { _queues[i] = queue; @@ -32,6 +36,8 @@ struct OutputBufferQueues _queues.resize(size); _reserve_bytes.resize(size, 1); _inline_buffer.resize(size); + total_idle_times.resize(size, 0); + _became_idle_times.resize(size, time_now()); } GRAS_FORCE_INLINE void push(const size_t i, const SBuffer &buff) @@ -116,14 +122,18 @@ struct OutputBufferQueues GRAS_FORCE_INLINE void _update(const size_t i) { - if (not _queues[i] or _queues[i]->empty()) + size_t avail = 0; + if (_queues[i] and not _queues[i]->empty()) { - _bitset.reset(i); - return; + const SBuffer &front = _queues[i]->front(); + avail = front.get_actual_length() - front.offset - front.length; } - const SBuffer &front = _queues[i]->front(); - const size_t avail = front.get_actual_length() - front.offset - front.length; + const bool was_ready = _bitset[i]; _bitset.set(i, avail >= _reserve_bytes[i]); + const bool is_ready = _bitset[i]; + if (is_ready and not was_ready) total_idle_times[i] += (time_now() - _became_idle_times[i]); + if (not is_ready and was_ready) _became_idle_times[i] = time_now(); + ASSERT(total_idle_times[i] <= (time_now() - _init_time)); } GRAS_FORCE_INLINE void set_inline(const size_t i, const SBuffer &inline_buffer) @@ -137,6 +147,9 @@ struct OutputBufferQueues std::vector<BufferQueueSptr> _queues; std::vector<size_t> _reserve_bytes; std::vector<SBuffer> _inline_buffer; + std::vector<time_ticks_t> total_idle_times; + std::vector<time_ticks_t> _became_idle_times; + const time_ticks_t _init_time; }; diff --git a/lib/top_block_query.cpp b/lib/top_block_query.cpp index b7a532f..29d3bb0 100644 --- a/lib/top_block_query.cpp +++ b/lib/top_block_query.cpp @@ -146,6 +146,8 @@ static std::string query_stats(ElementImpl *self, const boost::property_tree::pt my_block_ptree_append(tags_produced); my_block_ptree_append(msgs_produced); my_block_ptree_append(bytes_copied); + my_block_ptree_append(inputs_idle); + my_block_ptree_append(outputs_idle); blocks.push_back(std::make_pair(message.block_id, block)); } root.push_back(std::make_pair("blocks", blocks)); |