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.
*/