This is an automated email from the ASF dual-hosted git repository.

jinrongtong pushed a commit to branch test-release
in repository https://gitbox.apache.org/repos/asf/rocketmq.git

commit a655070a8960ed844ad8d857b42408ad5271f118
Author: Chengyang He <[email protected]>
AuthorDate: Mon Jan 13 17:11:55 2020 +0800

    [ISSUE #1656] Fix StatsItem bug (#1704)
    
    Fix bug: The stats data could be inaccurate of first minute/hour/day
---
 .../apache/rocketmq/common/stats/StatsItem.java    |  9 +++++++
 .../rocketmq/common/stats/StatsItemSetTest.java    | 29 ++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git 
a/common/src/main/java/org/apache/rocketmq/common/stats/StatsItem.java 
b/common/src/main/java/org/apache/rocketmq/common/stats/StatsItem.java
index bd575ba..6304ea2 100644
--- a/common/src/main/java/org/apache/rocketmq/common/stats/StatsItem.java
+++ b/common/src/main/java/org/apache/rocketmq/common/stats/StatsItem.java
@@ -152,6 +152,9 @@ public class StatsItem {
 
     public void samplingInSeconds() {
         synchronized (this.csListMinute) {
+            if (this.csListMinute.size() == 0) {
+                this.csListMinute.add(new 
CallSnapshot(System.currentTimeMillis() - 10 * 1000, 0, 0));
+            }
             this.csListMinute.add(new CallSnapshot(System.currentTimeMillis(), 
this.times.get(), this.value
                 .get()));
             if (this.csListMinute.size() > 7) {
@@ -162,6 +165,9 @@ public class StatsItem {
 
     public void samplingInMinutes() {
         synchronized (this.csListHour) {
+            if (this.csListHour.size() == 0) {
+                this.csListHour.add(new 
CallSnapshot(System.currentTimeMillis() - 10 * 60 * 1000, 0, 0));
+            }
             this.csListHour.add(new CallSnapshot(System.currentTimeMillis(), 
this.times.get(), this.value
                 .get()));
             if (this.csListHour.size() > 7) {
@@ -172,6 +178,9 @@ public class StatsItem {
 
     public void samplingInHour() {
         synchronized (this.csListDay) {
+            if (this.csListDay.size() == 0) {
+                this.csListDay.add(new CallSnapshot(System.currentTimeMillis() 
- 1 * 60 * 60 * 1000, 0, 0));
+            }
             this.csListDay.add(new CallSnapshot(System.currentTimeMillis(), 
this.times.get(), this.value
                 .get()));
             if (this.csListDay.size() > 25) {
diff --git 
a/common/src/test/java/org/apache/rocketmq/common/stats/StatsItemSetTest.java 
b/common/src/test/java/org/apache/rocketmq/common/stats/StatsItemSetTest.java
index bd6550d..4b4a867 100644
--- 
a/common/src/test/java/org/apache/rocketmq/common/stats/StatsItemSetTest.java
+++ 
b/common/src/test/java/org/apache/rocketmq/common/stats/StatsItemSetTest.java
@@ -44,6 +44,35 @@ public class StatsItemSetTest {
         assertEquals(10, test_unit_moment().longValue());
     }
 
+    @Test
+    public void test_statsOfFirstStatisticsCycle() throws InterruptedException 
{
+        final StatsItemSet statsItemSet = new StatsItemSet("topicTest", 
scheduler, null);
+        executor = new ThreadPoolExecutor(10, 20, 10, TimeUnit.SECONDS,
+            new ArrayBlockingQueue<Runnable>(100), new 
ThreadFactoryImpl("testMultiThread"));
+        for (int i = 0; i < 10; i++) {
+            executor.submit(new Runnable() {
+                @Override
+                public void run() {
+                    statsItemSet.addValue("topicTest", 2, 1);
+                }
+            });
+        }
+        while (true) {
+            if (executor.getCompletedTaskCount() == 10) {
+                break;
+            }
+            Thread.sleep(1000);
+        }
+        // simulate schedule task execution
+        statsItemSet.getStatsItem("topicTest").samplingInSeconds();
+        statsItemSet.getStatsItem("topicTest").samplingInMinutes();
+        statsItemSet.getStatsItem("topicTest").samplingInHour();
+
+        assertEquals(20L, 
statsItemSet.getStatsDataInMinute("topicTest").getSum());
+        assertEquals(20L, 
statsItemSet.getStatsDataInHour("topicTest").getSum());
+        assertEquals(20L, 
statsItemSet.getStatsDataInDay("topicTest").getSum());
+    }
+
     private AtomicLong test_unit() throws InterruptedException {
         final StatsItemSet statsItemSet = new StatsItemSet("topicTest", 
scheduler, null);
         executor = new ThreadPoolExecutor(10, 20, 10, TimeUnit.SECONDS,

Reply via email to