Skip to content

Commit ee6f252

Browse files
cxxrockslodoyun
authored andcommitted
fixed MovingAverageStat when value < old_value (#865)
1 parent e483800 commit ee6f252

File tree

2 files changed

+35
-4
lines changed

2 files changed

+35
-4
lines changed

erizo/src/erizo/stats/StatNode.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
#include "stats/StatNode.h"
22

3+
#include <cmath>
34
#include <sstream>
45
#include <string>
56
#include <memory>
@@ -249,7 +250,7 @@ StatNode& MovingAverageStat::operator+=(uint64_t value) {
249250
}
250251

251252
uint64_t MovingAverageStat::value() {
252-
return static_cast<uint64_t>(current_average_);
253+
return static_cast<uint64_t>(std::round(current_average_));
253254
}
254255

255256
uint64_t MovingAverageStat::value(uint32_t sample_number) {
@@ -266,7 +267,11 @@ void MovingAverageStat::add(uint64_t value) {
266267
/ (next_sample_position_ + 1);
267268
} else {
268269
uint64_t old_value = (*sample_vector_.get())[next_sample_position_ % window_size_];
269-
current_average_ = current_average_ + static_cast<double>(value - old_value) / window_size_;
270+
if (value > old_value) {
271+
current_average_ = current_average_ + static_cast<double>(value - old_value) / window_size_;
272+
} else {
273+
current_average_ = current_average_ - static_cast<double>(old_value - value) / window_size_;
274+
}
270275
}
271276

272277
(*sample_vector_.get())[next_sample_position_ % window_size_] = value;

erizo/src/test/stats/MovingAverageStatTest.cpp

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@ TEST_F(MovingAverageStatTest, shouldCalculateAverageForLessSamplesThanWindowSize
4242
EXPECT_EQ(moving_average_stat.value(), calculated_average);
4343
}
4444

45+
TEST_F(MovingAverageStatTest, shouldCalculateAverageForLessSamplesThanWindowSize2) {
46+
moving_average_stat+=kArbitraryNumberToAdd;
47+
moving_average_stat+=kArbitraryNumberToAdd - 1;
48+
moving_average_stat+=kArbitraryNumberToAdd - 2;
49+
uint32_t calculated_average = (3*kArbitraryNumberToAdd - 3)/3;
50+
EXPECT_EQ(moving_average_stat.value(), calculated_average);
51+
}
52+
4553
TEST_F(MovingAverageStatTest, shouldCalculateAverageForValuesInWindow) {
4654
for (uint i = 0; i < kArbitraryWindowSize; i++) {
4755
moving_average_stat+=kArbitraryNumberToAdd;
@@ -52,10 +60,28 @@ TEST_F(MovingAverageStatTest, shouldCalculateAverageForValuesInWindow) {
5260
EXPECT_EQ(moving_average_stat.value(), kArbitraryNumberToAdd + 1);
5361
}
5462

63+
TEST_F(MovingAverageStatTest, shouldCalculateAverageForValuesInWindow2) {
64+
for (uint i = 0; i < kArbitraryWindowSize; i++) {
65+
moving_average_stat+=kArbitraryNumberToAdd;
66+
}
67+
for (uint i = 0; i < kArbitraryWindowSize; i++) {
68+
moving_average_stat+=kArbitraryNumberToAdd - 1;
69+
}
70+
EXPECT_EQ(moving_average_stat.value(), kArbitraryNumberToAdd - 1);
71+
}
72+
5573
TEST_F(MovingAverageStatTest, shouldCalculateAverageForGivenNumberOfSamples) {
5674
for (uint i = 0; i < kArbitraryWindowSize; i++) {
5775
moving_average_stat+=i;
5876
}
59-
EXPECT_EQ(moving_average_stat.value(1), 4u);
60-
EXPECT_EQ(moving_average_stat.value(2), uint((4 + 3) / 2));
77+
EXPECT_EQ(moving_average_stat.value(1), kArbitraryWindowSize - 1);
78+
EXPECT_EQ(moving_average_stat.value(2), uint((kArbitraryWindowSize * 2 - 3) / 2));
79+
}
80+
81+
TEST_F(MovingAverageStatTest, shouldCalculateAverageForGivenNumberOfSamples2) {
82+
for (uint i = kArbitraryWindowSize; i > 0; i--) {
83+
moving_average_stat+=i;
84+
}
85+
EXPECT_EQ(moving_average_stat.value(1), 1u);
86+
EXPECT_EQ(moving_average_stat.value(2), uint((1 + 2) / 2));
6187
}

0 commit comments

Comments
 (0)