summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJosh Blum2013-05-11 19:45:33 -0700
committerJosh Blum2013-05-11 19:45:33 -0700
commit30123ef51202f8e7e8d9da833e42b23ef77e02f3 (patch)
tree660f82b9ebe8f69ebc7ebd737dba6bfc9b6bd986 /lib
parent4e210ade63d800b1a8671999f19019abd3c2ae03 (diff)
downloadsandhi-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.cpp2
-rw-r--r--lib/gras_impl/input_buffer_queues.hpp16
-rw-r--r--lib/gras_impl/output_buffer_queues.hpp23
-rw-r--r--lib/top_block_query.cpp2
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));