I am reviewing the code in

http://fossies.org/dox/trafficserver-3.2.0/ClusterLoadMonitor_8cc_source.html#l00134

And am a little confused by the logic at the beginning of 
"ClusterLoadMonitor::compute_cluster_load()" (starting at line 140)

139 void
140 ClusterLoadMonitor::compute_cluster_load()
141 {
142  // Compute ping message latency by scanning the response time
143  // buckets and averaging the results.
144
145  int n;
146  int sum = 0;
147  int entries = 0;
148  int n_bucket = 0;
149
150  for (n = 0; n < num_ping_response_buckets; ++n) {
151  if (ping_response_buckets[n]) {
152  entries += ping_response_buckets[n];
153  sum += (ping_response_buckets[n] * (n + 1));
154  }
155  ping_response_buckets[n] = 0;
156  }
157  if (entries) {
158  n_bucket = sum / entries;
159  } else {
160  n_bucket = 1;
161  }
162  
ink_hrtime<http://fossies.org/dox/trafficserver-3.2.0/ink__hrtime_8h.html#a5dcce63deb8b4a328628791b655b6a56>
 current_ping_latency = 
HRTIME_MSECONDS<http://fossies.org/dox/trafficserver-3.2.0/ink__hrtime_8h.html#af435384e0bfca4b8c7cdc43d71c251f1>(n_bucket
 * msecs_per_ping_response_bucket);
163

In particular I am confused by the purpose of n_bucket. Based on what I am 
seeing, it seems that n_bucket is intended to be the actual average of the non 
zero values of ping_response_buckets, and msecs_per_ping_response_bucket is a 
configurable latency constant which defaults to 50.

However, if the n_bucket value is indeed an average then the math does not seem 
to work out.

Suppose ping_response_buckets contains the following values { 3, 5, 2, 7, 9 }. 
The average of these values is 2.5 but the value that the above logic assigns 
to n_buckets is 3.5.

Another example suppose ping_response_buckets contains the values { 2,2,2,2,2 
}. The average of these values is 2, but the value that the logic above would 
assign to n_buckets is (2 + 4 + 6 + 8 + 10)/(2 + 2 + 2 + 2 + 2) = 30/10 = 3.

So are the comments incorrect or is my understanding of the intent of the code 
wrong?

Reply via email to