From ad17ae2baad97ff27acae6e50f831e9c0ccd54c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=B0smail=20Ta=C5=9Fdelen?= Date: Fri, 16 Jan 2026 13:06:53 +0300 Subject: [PATCH] master --- .vscode/settings.json | 3 ++ pom.xml | 5 +- .../server/store/MetricAgeOffIterator.java | 7 ++- .../TimeSeriesGroupingIteratorTest.java | 51 +++++++++++-------- 4 files changed, 41 insertions(+), 25 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..9250139a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "java.jdt.ls.vmargs": "-XX:+UseParallelGC -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 -Dsun.zip.disableMemoryMapping=true -Xmx4G -Xms100m -Xlog:disable" +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index c69adb0f..45dbeff4 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,6 @@ 3.4.4 4.0.2 1.0.0 - 3.1.13 1.1.4 23.5.26 33.0.0-jre @@ -931,7 +930,7 @@ maven-failsafe-plugin ${version.maven-failsafe-plugin} - ${failsafeArgLine} -Djava.library.path=${project.build.directory}/native/META-INF/native/libnetty_tcnative_linux_x86_64.so -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Dfile.encoding=UTF8 -Duser.timezone=GMT -Xmx1024m -Dapple.awt.UIElement=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc= -Dzookeeper.sasl.client=false + ${failsafeArgLine} -Djava.library.path=${project.build.directory}/native/META-INF/native/libnetty_tcnative_linux_x86_64.so -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Dfile.encoding=UTF8 -Duser.timezone=GMT -Xmx1024m -Dapple.awt.UIElement=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc= -Dzookeeper.sasl.client=false **/*IT.java @@ -989,7 +988,7 @@ 1 0 0 - ${sureFireArgLine} -Djava.library.path=${project.build.directory}/native/META-INF/native/libnetty_tcnative_linux_x86_64.so -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Dfile.encoding=UTF8 -Duser.timezone=GMT -Xmx1024m -Dapple.awt.UIElement=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc= -Dzookeeper.sasl.client=false + ${sureFireArgLine} -Djava.library.path=${project.build.directory}/native/META-INF/native/libnetty_tcnative_linux_x86_64.so -XX:+TieredCompilation -XX:TieredStopAtLevel=1 -Dfile.encoding=UTF8 -Duser.timezone=GMT -Xmx1024m -Dapple.awt.UIElement=true -Djava.security.krb5.realm= -Djava.security.krb5.kdc= -Dzookeeper.sasl.client=false random timely.test.IntegrationTest true diff --git a/server/src/main/java/timely/server/store/MetricAgeOffIterator.java b/server/src/main/java/timely/server/store/MetricAgeOffIterator.java index f71abbc3..f9df8638 100644 --- a/server/src/main/java/timely/server/store/MetricAgeOffIterator.java +++ b/server/src/main/java/timely/server/store/MetricAgeOffIterator.java @@ -72,7 +72,7 @@ public void init(SortedKeyValueIterator source, Map op } private void seekIfNecessary() { - if (super.hasTop()) { + while (super.hasTop()) { Key top = super.getTopKey(); // If less than any configured ageoff, then we want to return this // K,V @@ -85,7 +85,7 @@ private void seekIfNecessary() { String metricName = MetricAdapter.decodeRowKey(top).getFirst(); handleNewMetricName(metricName); seekPastAgedOffMetricData(top.getRow().getBytes(), metricName, this.maxAgeOff); - return; + continue; } if (isNextMetricTheSame(top.getRow())) { // this metric name is the same as previous @@ -95,6 +95,7 @@ private void seekIfNecessary() { String metricName = new String(prevMetricBytes.copyBytes(), UTF_8); log.trace("Current metric is older than age off for metric {}, seeking to start of valid data", metricName); seekPastAgedOffMetricData(top.getRow().getBytes(), metricName, prevAgeOff); + continue; } } else { // Metric name is different or prev information is not set @@ -103,8 +104,10 @@ private void seekIfNecessary() { if (currentTime - top.getTimestamp() > prevAgeOff) { log.trace("New metric found, but older than age off for metric {}, seeking to start of valid data", metricName); seekPastAgedOffMetricData(top.getRow().getBytes(), metricName, prevAgeOff); + continue; } } + return; } } diff --git a/server/src/test/java/timely/server/sample/iterators/TimeSeriesGroupingIteratorTest.java b/server/src/test/java/timely/server/sample/iterators/TimeSeriesGroupingIteratorTest.java index 21193aad..4b700f16 100644 --- a/server/src/test/java/timely/server/sample/iterators/TimeSeriesGroupingIteratorTest.java +++ b/server/src/test/java/timely/server/sample/iterators/TimeSeriesGroupingIteratorTest.java @@ -26,7 +26,7 @@ public class TimeSeriesGroupingIteratorTest extends IteratorTestBase { private static final Logger log = LoggerFactory.getLogger(TimeSeriesGroupingIteratorTest.class); - private TreeMap table = new TreeMap<>(); + private TreeMap table = new TreeMap<>(); private static final List tags = new ArrayList<>(); static { tags.add(new Tag("rack", "r1")); @@ -35,12 +35,13 @@ public class TimeSeriesGroupingIteratorTest extends IteratorTestBase { @Before public void setup() { table.clear(); - long ts = ((System.currentTimeMillis() / 1000) * 1000); + long ts = 1705400000000L; // Fixed timestamp for reproducibility for (int i = 0; i < 100; i++) { ts += 1000; Metric m = new Metric("sys.cpu.user", ts, i * 1.0D, tags); byte[] row = MetricAdapter.encodeRowKey(m); - Key k = new Key(row, tags.get(0).join().getBytes(StandardCharsets.UTF_8), MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); + Key k = new Key(row, tags.get(0).join().getBytes(StandardCharsets.UTF_8), + MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); Value v = new Value(MetricAdapter.encodeValue(m.getValue().getMeasure())); table.put(k, v); } @@ -56,7 +57,7 @@ public void testMovingAverage() throws Exception { iter.seek(new Range(), EMPTY_COL_FAMS, true); for (int i = 4; i < 100; i++) { - checkNextResult(iter, new double[] {i - 4, i - 3, i - 2, i - 1, i}); + checkNextResult(iter, new double[] { i - 4, i - 3, i - 2, i - 1, i }); } assertFalse(iter.hasTop()); } @@ -89,12 +90,14 @@ public void testMultipleTimeSeriesMovingAverage() throws Exception { ts += 1000; Metric m = new Metric("sys.cpu.user", ts, i * 1.0D, tags1); byte[] row = MetricAdapter.encodeRowKey(m); - Key k = new Key(row, tags1.get(0).join().getBytes(StandardCharsets.UTF_8), MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); + Key k = new Key(row, tags1.get(0).join().getBytes(StandardCharsets.UTF_8), + MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); Value v = new Value(MetricAdapter.encodeValue(m.getValue().getMeasure())); table.put(k, v); Metric m2 = new Metric("sys.cpu.user", ts, i * 2.0D, tags2); byte[] row2 = MetricAdapter.encodeRowKey(m2); - Key k2 = new Key(row2, tags2.get(0).join().getBytes(StandardCharsets.UTF_8), MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); + Key k2 = new Key(row2, tags2.get(0).join().getBytes(StandardCharsets.UTF_8), + MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); Value v2 = new Value(MetricAdapter.encodeValue(m2.getValue().getMeasure())); table.put(k2, v2); } @@ -108,10 +111,10 @@ public void testMultipleTimeSeriesMovingAverage() throws Exception { // this section changed when the key structure changed so that identical // colFam values sorted consecutively within an given time period for (int i = 4; i < 100; i++) { - checkNextResult(iter, new double[] {i - 4, i - 3, i - 2, i - 1, i}); + checkNextResult(iter, new double[] { i - 4, i - 3, i - 2, i - 1, i }); } for (int i = 4; i < 100; i++) { - checkNextResult(iter, new double[] {(i - 4) * 2, (i - 3) * 2, (i - 2) * 2, (i - 1) * 2, i * 2}); + checkNextResult(iter, new double[] { (i - 4) * 2, (i - 3) * 2, (i - 2) * 2, (i - 1) * 2, i * 2 }); } assertFalse(iter.hasTop()); @@ -129,14 +132,16 @@ public void testTimeSeriesDropOff() throws Exception { ts += 1000; Metric m = new Metric("sys.cpu.user", ts, i * 1.0D, tags1); byte[] row = MetricAdapter.encodeRowKey(m); - Key k = new Key(row, tags1.get(0).join().getBytes(StandardCharsets.UTF_8), MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); + Key k = new Key(row, tags1.get(0).join().getBytes(StandardCharsets.UTF_8), + MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); Value v = new Value(MetricAdapter.encodeValue(m.getValue().getMeasure())); table.put(k, v); if (i < 50) { // only populate this series 50 times Metric m2 = new Metric("sys.cpu.user", ts, i * 2.0D, tags2); byte[] row2 = MetricAdapter.encodeRowKey(m2); - Key k2 = new Key(row2, tags2.get(0).join().getBytes(StandardCharsets.UTF_8), MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); + Key k2 = new Key(row2, tags2.get(0).join().getBytes(StandardCharsets.UTF_8), + MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); Value v2 = new Value(MetricAdapter.encodeValue(m2.getValue().getMeasure())); table.put(k2, v2); } @@ -152,10 +157,10 @@ public void testTimeSeriesDropOff() throws Exception { // this section changed when the key structure changed so that identical // colFam values sorted consecutively within a given time period for (int i = 4; i < 100; i++) { - checkNextResult(iter, new double[] {i - 4, i - 3, i - 2, i - 1, i}); + checkNextResult(iter, new double[] { i - 4, i - 3, i - 2, i - 1, i }); } for (int i = 4; i < 50; i++) { - checkNextResult(iter, new double[] {(i - 4) * 2, (i - 3) * 2, (i - 2) * 2, (i - 1) * 2, i * 2}); + checkNextResult(iter, new double[] { (i - 4) * 2, (i - 3) * 2, (i - 2) * 2, (i - 1) * 2, i * 2 }); } assertFalse(iter.hasTop()); } @@ -172,14 +177,16 @@ public void testAdditionalTimeSeries() throws Exception { ts += 1000; Metric m = new Metric("sys.cpu.user", ts, i * 1.0D, tags1); byte[] row = MetricAdapter.encodeRowKey(m); - Key k = new Key(row, tags1.get(0).join().getBytes(StandardCharsets.UTF_8), MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); + Key k = new Key(row, tags1.get(0).join().getBytes(StandardCharsets.UTF_8), + MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); Value v = new Value(MetricAdapter.encodeValue(m.getValue().getMeasure())); table.put(k, v); if (i > 50) { // only populate this series 50 times Metric m2 = new Metric("sys.cpu.user", ts, i * 2.0D, tags2); byte[] row2 = MetricAdapter.encodeRowKey(m2); - Key k2 = new Key(row2, tags2.get(0).join().getBytes(StandardCharsets.UTF_8), MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); + Key k2 = new Key(row2, tags2.get(0).join().getBytes(StandardCharsets.UTF_8), + MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); Value v2 = new Value(MetricAdapter.encodeValue(m2.getValue().getMeasure())); table.put(k2, v2); } @@ -194,10 +201,10 @@ public void testAdditionalTimeSeries() throws Exception { // this section changed when the key structure changed so that identical // colFam values sorted consecutively within an given time period for (int i = 4; i < 100; i++) { - checkNextResult(iter, new double[] {i - 4, i - 3, i - 2, i - 1, i}); + checkNextResult(iter, new double[] { i - 4, i - 3, i - 2, i - 1, i }); } for (int i = 55; i < 100; i++) { - checkNextResult(iter, new double[] {(i - 4) * 2, (i - 3) * 2, (i - 2) * 2, (i - 1) * 2, i * 2}); + checkNextResult(iter, new double[] { (i - 4) * 2, (i - 3) * 2, (i - 2) * 2, (i - 1) * 2, i * 2 }); } assertFalse(iter.hasTop()); @@ -218,18 +225,21 @@ public void testManySparseTimeSeries() throws Exception { ts += 1000; Metric m = new Metric("sys.cpu.user", ts, i * 1.0D, tags1); byte[] row = MetricAdapter.encodeRowKey(m); - Key k = new Key(row, tags1.get(0).join().getBytes(StandardCharsets.UTF_8), MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); + Key k = new Key(row, tags1.get(0).join().getBytes(StandardCharsets.UTF_8), + MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); Value v = new Value(MetricAdapter.encodeValue(m.getValue().getMeasure())); table.put(k, v); // jitter the time on the second time series Metric m2 = new Metric("sys.cpu.user", ts + 50, i * 2.0D, tags2); byte[] row2 = MetricAdapter.encodeRowKey(m2); - Key k2 = new Key(row2, tags2.get(0).join().getBytes(StandardCharsets.UTF_8), MetricAdapter.encodeColQual(ts, ""), new byte[0], ts + 50); + Key k2 = new Key(row2, tags2.get(0).join().getBytes(StandardCharsets.UTF_8), + MetricAdapter.encodeColQual(ts, ""), new byte[0], ts + 50); Value v2 = new Value(MetricAdapter.encodeValue(m2.getValue().getMeasure())); table.put(k2, v2); Metric m3 = new Metric("sys.cpu.user", ts, i * 3.0D, tags3); byte[] row3 = MetricAdapter.encodeRowKey(m3); - Key k3 = new Key(row3, tags3.get(0).join().getBytes(StandardCharsets.UTF_8), MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); + Key k3 = new Key(row3, tags3.get(0).join().getBytes(StandardCharsets.UTF_8), + MetricAdapter.encodeColQual(ts, ""), new byte[0], ts); Value v3 = new Value(MetricAdapter.encodeValue(m3.getValue().getMeasure())); table.put(k3, v3); } @@ -286,7 +296,8 @@ private void checkNextResult(TimeSeriesGroupingIterator iter, double[] expectedV iter.next(); } - private void checkNextResult(TimeSeriesGroupingIterator iter, LinkedList expectedValues) throws IOException { + private void checkNextResult(TimeSeriesGroupingIterator iter, LinkedList expectedValues) + throws IOException { assertTrue(iter.hasTop()); log.trace("Expected: {}", expectedValues); log.trace("Getting value for Key {}", iter.getTopKey());