You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by al...@apache.org on 2022/10/14 12:20:23 UTC

[ignite] branch master updated: IGNITE-17895 Fix assertion on histogram update if currentTimeMillis decreases - Fixes #10313.

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

alexpl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 36574bdbe7a IGNITE-17895 Fix assertion on histogram update if currentTimeMillis decreases - Fixes #10313.
36574bdbe7a is described below

commit 36574bdbe7a23f4e743d02f202ce520cd25d8df5
Author: Aleksey Plekhanov <pl...@gmail.com>
AuthorDate: Fri Oct 14 15:17:12 2022 +0300

    IGNITE-17895 Fix assertion on histogram update if currentTimeMillis decreases - Fixes #10313.
    
    Signed-off-by: Aleksey Plekhanov <pl...@gmail.com>
---
 .../internal/processors/metric/impl/HistogramMetricImpl.java |  2 --
 .../processors/metric/impl/PeriodicHistogramMetricImpl.java  | 12 ++++++------
 .../org/apache/ignite/internal/metric/MetricsSelfTest.java   |  7 ++++++-
 .../internal/metric/PeriodicHistogramMetricImplTest.java     | 10 ++++++++++
 4 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/HistogramMetricImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/HistogramMetricImpl.java
index df2731c3273..25263006139 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/HistogramMetricImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/HistogramMetricImpl.java
@@ -58,8 +58,6 @@ public class HistogramMetricImpl extends AbstractMetric implements ConfigurableH
      * @param x Value.
      */
     public void value(long x) {
-        assert x >= 0;
-
         HistogramHolder h = holder;
 
         //Expect arrays of few elements.
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/PeriodicHistogramMetricImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/PeriodicHistogramMetricImpl.java
index f412f0feaec..008173c0b94 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/PeriodicHistogramMetricImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/metric/impl/PeriodicHistogramMetricImpl.java
@@ -183,7 +183,7 @@ public class PeriodicHistogramMetricImpl extends AbstractMetric implements Confi
         long curTs = U.currentTimeMillis();
 
         if (curTs >= upperBoundTs)
-            shiftBuckets();
+            shiftBuckets(curTs);
 
         int cnt = (int)((upperBoundTs - lowerBoundTs) / bucketsInterval) + 1;
 
@@ -250,10 +250,12 @@ public class PeriodicHistogramMetricImpl extends AbstractMetric implements Confi
     private void add(long ts, int val) {
         long curTs = U.currentTimeMillis();
 
-        assert ts <= curTs : "Unexpected timestamp [curTs = " + curTs + ", ts=" + ts + ']';
+        // In case time was changed in OS manually or synced by NTP ts can be greater than current time.
+        if (ts > curTs)
+            curTs = ts;
 
         if (curTs >= upperBoundTs)
-            shiftBuckets();
+            shiftBuckets(curTs);
 
         if (ts < lowerBoundTs)
             outOfBoundsBucket.addAndGet(val);
@@ -291,9 +293,7 @@ public class PeriodicHistogramMetricImpl extends AbstractMetric implements Confi
     /**
      * Shift buckets to ensure that upper bound of the buckets array is always greater then current timestamp.
      */
-    private synchronized void shiftBuckets() {
-        long curTs = U.currentTimeMillis();
-
+    private synchronized void shiftBuckets(long curTs) {
         long oldLowerBoundTs = lowerBoundTs;
         long oldUpperBoundTs = upperBoundTs;
 
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsSelfTest.java
index 6a95bef8203..6b241b3b1a0 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/MetricsSelfTest.java
@@ -254,6 +254,11 @@ public class MetricsSelfTest extends GridCommonAbstractTest {
 
         int cnt = 10;
 
+        futs.add(runAsync(() -> {
+            for (int i = 0; i < cnt; i++)
+                h.value(-100);
+        }));
+
         futs.add(runAsync(() -> {
             for (int i = 0; i < cnt; i++)
                 h.value(9);
@@ -279,7 +284,7 @@ public class MetricsSelfTest extends GridCommonAbstractTest {
 
         long[] res = h.value();
 
-        assertEquals(cnt, res[0]);
+        assertEquals(cnt * 2, res[0]);
         assertEquals(cnt * 2, res[1]);
         assertEquals(cnt * 3, res[2]);
         assertEquals(cnt * 4, res[3]);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/metric/PeriodicHistogramMetricImplTest.java b/modules/core/src/test/java/org/apache/ignite/internal/metric/PeriodicHistogramMetricImplTest.java
index 8470f7079a4..853aba77563 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/metric/PeriodicHistogramMetricImplTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/metric/PeriodicHistogramMetricImplTest.java
@@ -328,6 +328,16 @@ public class PeriodicHistogramMetricImplTest extends GridCommonAbstractTest {
         assertEquals(6, bucket(0));
     }
 
+    /** Tests that histogram worked properly with timestamps greater than current time. */
+    @Test
+    public void testCurrentTimeDecreasing() {
+        long ts = curTime.get();
+
+        histogram.increment(ts + 1000);
+
+        assertEquals(1, bucket(-1));
+    }
+
     /**
      * Gets bucket values of current histogram.
      */