Repository: hbase
Updated Branches:
  refs/heads/master 1162cbdf1 -> f5ad73628


HBASE-13561 ITBLL.Verify doesn't actually evaluate counters after job completes 
(Josh Elser)


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/f5ad7362
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/f5ad7362
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/f5ad7362

Branch: refs/heads/master
Commit: f5ad736282c8c9c27b14131919d60b72834ec9e4
Parents: 1162cbd
Author: stack <st...@apache.org>
Authored: Tue Jul 7 13:06:10 2015 -0700
Committer: stack <st...@apache.org>
Committed: Tue Jul 7 13:06:10 2015 -0700

----------------------------------------------------------------------
 .../test/IntegrationTestBigLinkedList.java      | 76 ++++++++++++++++----
 1 file changed, 63 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/f5ad7362/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.java
----------------------------------------------------------------------
diff --git 
a/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.java
 
b/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.java
index 31c5bb5..2c299a9 100644
--- 
a/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.java
+++ 
b/hbase-it/src/test/java/org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.java
@@ -1102,7 +1102,23 @@ public class IntegrationTestBigLinkedList extends 
IntegrationTestBase {
 
       boolean success = job.waitForCompletion(true);
 
-      return success ? 0 : 1;
+      if (success) {
+        Counters counters = job.getCounters();
+        if (null == counters) {
+          LOG.warn("Counters were null, cannot verify Job completion");
+          // We don't have access to the counters to know if we have "bad" 
counts
+          return 0;
+        }
+
+        // If we find no unexpected values, the job didn't outright fail
+        if (verifyUnexpectedValues(counters)) {
+          // We didn't check referenced+unreferenced counts, leave that to 
visual inspection
+          return 0;
+        }
+      }
+
+      // We failed
+      return 1;
     }
 
     public boolean verify(long expectedReferenced) throws Exception {
@@ -1112,14 +1128,34 @@ public class IntegrationTestBigLinkedList extends 
IntegrationTestBase {
 
       Counters counters = job.getCounters();
 
-      Counter referenced = counters.findCounter(Counts.REFERENCED);
-      Counter unreferenced = counters.findCounter(Counts.UNREFERENCED);
-      Counter undefined = counters.findCounter(Counts.UNDEFINED);
-      Counter multiref = counters.findCounter(Counts.EXTRAREFERENCES);
-      Counter lostfamilies = counters.findCounter(Counts.LOST_FAMILIES);
+      // Run through each check, even if we fail one early
+      boolean success = verifyExpectedValues(expectedReferenced, counters);
+
+      if (!verifyUnexpectedValues(counters)) {
+        // We found counter objects which imply failure
+        success = false;
+      }
+
+      if (!success) {
+        handleFailure(counters);
+      }
+      return success;
+    }
 
+    /**
+     * Verify the values in the Counters against the expected number of 
entries written.
+     *
+     * @param expectedReferenced
+     *          Expected number of referenced entrires
+     * @param counters
+     *          The Job's Counters object
+     * @return True if the values match what's expected, false otherwise
+     */
+    protected boolean verifyExpectedValues(long expectedReferenced, Counters 
counters) {
+      final Counter referenced = counters.findCounter(Counts.REFERENCED);
+      final Counter unreferenced = counters.findCounter(Counts.UNREFERENCED);
       boolean success = true;
-      //assert
+
       if (expectedReferenced != referenced.getValue()) {
         LOG.error("Expected referenced count does not match with actual 
referenced count. " +
             "expected referenced=" + expectedReferenced + " ,actual=" + 
referenced.getValue());
@@ -1127,12 +1163,28 @@ public class IntegrationTestBigLinkedList extends 
IntegrationTestBase {
       }
 
       if (unreferenced.getValue() > 0) {
+        final Counter multiref = counters.findCounter(Counts.EXTRAREFERENCES);
         boolean couldBeMultiRef = (multiref.getValue() == 
unreferenced.getValue());
         LOG.error("Unreferenced nodes were not expected. Unreferenced count=" 
+ unreferenced.getValue()
             + (couldBeMultiRef ? "; could be due to duplicate random numbers" 
: ""));
         success = false;
       }
 
+      return success;
+    }
+
+    /**
+     * Verify that the Counters don't contain values which indicate an 
outright failure from the Reducers.
+     *
+     * @param counters
+     *          The Job's counters
+     * @return True if the "bad" counter objects are 0, false otherwise
+     */
+    protected boolean verifyUnexpectedValues(Counters counters) {
+      final Counter undefined = counters.findCounter(Counts.UNDEFINED);
+      final Counter lostfamilies = counters.findCounter(Counts.LOST_FAMILIES);
+      boolean success = true;
+
       if (undefined.getValue() > 0) {
         LOG.error("Found an undefined node. Undefined count=" + 
undefined.getValue());
         success = false;
@@ -1143,9 +1195,6 @@ public class IntegrationTestBigLinkedList extends 
IntegrationTestBase {
         success = false;
       }
 
-      if (!success) {
-        handleFailure(counters);
-      }
       return success;
     }
 
@@ -1545,9 +1594,10 @@ public class IntegrationTestBigLinkedList extends 
IntegrationTestBase {
   private void printCommands() {
     System.err.println("Commands:");
     System.err.println(" generator  Map only job that generates data.");
-    System.err.println(" verify     A map reduce job that looks for holes. 
Look at the counts ");
-    System.err.println("            after running. See REFERENCED and 
UNREFERENCED are ok. Any ");
-    System.err.println("            UNDEFINED counts are bad. Do not run with 
the Generator.");
+    System.err.println(" verify     A map reduce job that looks for holes. 
Check return code and");
+    System.err.println("            look at the counts after running. See 
REFERENCED and");
+    System.err.println("            UNREFERENCED are ok. Any UNDEFINED counts 
are bad. Do not run");
+    System.err.println("            with the Generator.");
     System.err.println(" walker     " +
       "Standalone program that starts following a linked list & emits timing 
info.");
     System.err.println(" print      Standalone program that prints nodes in 
the linked list.");

Reply via email to