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,
