You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@accumulo.apache.org by ct...@apache.org on 2020/11/26 19:15:28 UTC

[accumulo] 02/02: Backport some GcMetricsIT test stability to 1.10

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

ctubbsii pushed a commit to branch 1.10
in repository https://gitbox.apache.org/repos/asf/accumulo.git

commit 7e2e09e0656d40adce178420be8e66cffee0a4f2
Author: Christopher Tubbs <ct...@apache.org>
AuthorDate: Thu Nov 26 13:04:01 2020 -0500

    Backport some GcMetricsIT test stability to 1.10
    
    Backport some test stability fixes to GcMetricsIT implemented in #1745
    to Accumulo 1.10.1
---
 .../accumulo/test/functional/GcMetricsIT.java      | 45 +++++++++++++++++-----
 1 file changed, 35 insertions(+), 10 deletions(-)

diff --git a/test/src/main/java/org/apache/accumulo/test/functional/GcMetricsIT.java b/test/src/main/java/org/apache/accumulo/test/functional/GcMetricsIT.java
index 04100a1..51a4136 100644
--- a/test/src/main/java/org/apache/accumulo/test/functional/GcMetricsIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/functional/GcMetricsIT.java
@@ -20,8 +20,11 @@ import static org.junit.Assert.assertTrue;
 
 import java.util.Collections;
 import java.util.Map;
+import java.util.Objects;
 import java.util.TreeMap;
 import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.accumulo.core.conf.Property;
 import org.apache.accumulo.gc.metrics.GcMetrics;
@@ -85,12 +88,10 @@ public class GcMetricsIT extends AccumuloClusterHarness {
 
     try {
 
-      long testStart = System.currentTimeMillis();
+      long updateTimestamp = System.currentTimeMillis();
 
-      // Read two updates, throw away the first snapshot - it could have been from a previous run
-      // or another test (the file appends.)
-      LineUpdate firstUpdate = waitForUpdate(-1, gcTail);
-      firstUpdate = waitForUpdate(firstUpdate.getLastUpdate(), gcTail);
+      // Get next update after current time
+      LineUpdate firstUpdate = waitForUpdate(updateTimestamp, gcTail);
 
       Map<String,Long> firstSeenMap = parseLine(firstUpdate.getLine());
 
@@ -98,9 +99,11 @@ public class GcMetricsIT extends AccumuloClusterHarness {
       log.trace("M:{}", firstSeenMap);
 
       assertTrue(lookForExpectedKeys(firstSeenMap));
-      sanity(testStart, firstSeenMap);
+      sanity(updateTimestamp, firstSeenMap);
 
-      LineUpdate nextUpdate = waitForUpdate(firstUpdate.getLastUpdate(), gcTail);
+      // Get next update after the first one
+      updateTimestamp = firstUpdate.getLastUpdate();
+      LineUpdate nextUpdate = waitForUpdate(updateTimestamp, gcTail);
 
       Map<String,Long> updateSeenMap = parseLine(nextUpdate.getLine());
 
@@ -108,7 +111,7 @@ public class GcMetricsIT extends AccumuloClusterHarness {
       log.trace("Mapped values:{}", updateSeenMap);
 
       assertTrue(lookForExpectedKeys(updateSeenMap));
-      sanity(testStart, updateSeenMap);
+      sanity(updateTimestamp, updateSeenMap);
 
       validate(firstSeenMap, updateSeenMap);
 
@@ -150,7 +153,7 @@ public class GcMetricsIT extends AccumuloClusterHarness {
     start = values.get("AccGcWalStarted");
     finished = values.get("AccGcWalFinished");
 
-    log.debug("test start: {}, gc start: {}, gc finished: {}", testStart, start, finished);
+    log.debug("test start: {}, walgc start: {}, walgc finished: {}", testStart, start, finished);
 
     assertTrue(start >= testStart);
     assertTrue(finished >= start);
@@ -236,7 +239,7 @@ public class GcMetricsIT extends AccumuloClusterHarness {
       String line = tail.getLast();
       long currUpdate = tail.getLastUpdate();
 
-      if (line != null && (currUpdate != prevUpdate)) {
+      if (line != null && (currUpdate != prevUpdate) && isValidTimestamp(line, prevUpdate)) {
         return new LineUpdate(tail.getLastUpdate(), line);
       }
 
@@ -253,6 +256,28 @@ public class GcMetricsIT extends AccumuloClusterHarness {
             TimeUnit.MILLISECONDS.toSeconds(TAIL_DELAY * NUM_TAIL_ATTEMPTS)));
   }
 
+  private static final Pattern timestampPattern = Pattern.compile("^\\s*(?<timestamp>\\d+).*");
+
+  private boolean isValidTimestamp(final String line, final long prevTimestamp) {
+
+    if (Objects.isNull(line)) {
+      return false;
+    }
+
+    Matcher m = timestampPattern.matcher(line);
+
+    if (m.matches()) {
+      try {
+        long timestamp = Long.parseLong(m.group("timestamp"));
+        return timestamp > prevTimestamp;
+      } catch (NumberFormatException ex) {
+        log.trace("Could not parse timestamp from line '{}", line);
+        return false;
+      }
+    }
+    return false;
+  }
+
   private boolean lookForExpectedKeys(final Map<String,Long> received) {
 
     for (String e : EXPECTED_METRIC_KEYS) {