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

reidchan pushed a commit to branch branch-1
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-1 by this push:
     new 93b76fd  HBASE-25025 [Flaky Test][branch-1] 
TestFromClientSide#testCheckAndDeleteWithCompareOp (#2396)
93b76fd is described below

commit 93b76fdb322130b474a122494a3844893e628443
Author: Reid Chan <[email protected]>
AuthorDate: Tue Sep 29 14:38:22 2020 +0800

    HBASE-25025 [Flaky Test][branch-1] 
TestFromClientSide#testCheckAndDeleteWithCompareOp (#2396)
    
    Signed-off-by: Viraj Jasani <[email protected]>
---
 .../hadoop/hbase/client/TestFromClientSide.java    | 92 +++++++++++++---------
 1 file changed, 55 insertions(+), 37 deletions(-)

diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
index 0e715a9..4c2ec1f 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestFromClientSide.java
@@ -5067,73 +5067,91 @@ public class TestFromClientSide {
         FAMILY);
     
TEST_UTIL.waitTableAvailable(TableName.valueOf("testCheckAndDeleteWithCompareOp"),
 10000);
 
-    Put put2 = new Put(ROW);
-    put2.add(FAMILY, QUALIFIER, value2);
-    table.put(put2);
+    Put bbbb = new Put(ROW);
+    bbbb.add(FAMILY, QUALIFIER, value2);
 
-    Put put3 = new Put(ROW);
-    put3.add(FAMILY, QUALIFIER, value3);
+    Put cccc = new Put(ROW);
+    cccc.add(FAMILY, QUALIFIER, value3);
 
     Delete delete = new Delete(ROW);
     delete.deleteColumns(FAMILY, QUALIFIER);
 
     // cell = "bbbb", using "aaaa" to compare only LESS/LESS_OR_EQUAL/NOT_EQUAL
     // turns out "match"
+    table.put(bbbb);
+    assertTrue(verifyPut(table, bbbb, value2));
     boolean ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, 
CompareOp.GREATER, value1, delete);
-    assertEquals(ok, false);
+    // aaaa is less than bbbb, > || >= should be false
+    assertFalse(ok);
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value1, 
delete);
-    assertEquals(ok, false);
+    assertFalse(ok);
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, 
CompareOp.GREATER_OR_EQUAL, value1, delete);
-    assertEquals(ok, false);
+    assertFalse(ok);
+    // aaaa is less than bbbb, < || <= should be true
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value1, 
delete);
-    assertEquals(ok, true);
-    table.put(put2);
+    assertTrue(ok);
+    table.put(bbbb);
+    assertTrue(verifyPut(table, bbbb, value2));
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, 
value1, delete);
-    assertEquals(ok, true);
-    table.put(put2);
-
-    assertEquals(ok, true);
+    assertTrue(ok);
 
     // cell = "cccc", using "dddd" to compare only 
LARGER/LARGER_OR_EQUAL/NOT_EQUAL
     // turns out "match"
-    table.put(put3);
+    table.put(cccc);
+    assertTrue(verifyPut(table, cccc, value3));
+    // dddd is larger than cccc,  < || <= shoule be false
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value4, 
delete);
-
-    assertEquals(ok, false);
+    assertFalse(ok);
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, 
value4, delete);
-
-    assertEquals(ok, false);
+    assertFalse(ok);
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value4, 
delete);
-
-    assertEquals(ok, false);
+    assertFalse(ok);
+    // dddd is larger than cccc, (> || >= || !=) shoule be true
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, 
value4, delete);
-
-    assertEquals(ok, true);
-    table.put(put3);
+    assertTrue(ok);
+    table.put(cccc);
+    assertTrue(verifyPut(table, cccc, value3));
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, 
CompareOp.GREATER_OR_EQUAL, value4, delete);
-    assertEquals(ok, true);
-    table.put(put3);
+    assertTrue(ok);
+    table.put(cccc);
+    assertTrue(verifyPut(table, cccc, value3));
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, 
value4, delete);
-
-    assertEquals(ok, true);
+    assertTrue(ok);
 
     // cell = "bbbb", using "bbbb" to compare only 
GREATER_OR_EQUAL/LESS_OR_EQUAL/EQUAL
     // turns out "match"
-    table.put(put2);
+    // bbbb equals to bbbb, != shoule be all false
+    table.put(bbbb);
+    assertTrue(verifyPut(table, bbbb, value2));
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, 
value2, delete);
-    assertEquals(ok, false);
+    assertFalse(ok);
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, 
value2, delete);
-    assertEquals(ok, false);
+    assertFalse(ok);
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value2, 
delete);
-    assertEquals(ok, false);
+    assertFalse(ok);
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, 
CompareOp.GREATER_OR_EQUAL, value2, delete);
-    assertEquals(ok, true);
-    table.put(put2);
+    assertTrue(ok);
+    table.put(bbbb);
+    assertTrue(verifyPut(table, bbbb, value2));
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, 
value2, delete);
-    assertEquals(ok, true);
-    table.put(put2);
+    assertTrue(ok);
+    table.put(bbbb);
+    assertTrue(verifyPut(table, bbbb, value2));
     ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value2, 
delete);
-    assertEquals(ok, true);
+    assertTrue(ok);
+  }
+
+  /**
+   * testCheckAndDeleteWithCompareOp will occasionally fail without this 
method.
+   * Somehow checkAndDelete is executed faster than put, so it leads to 
assertion failure.
+   * With this verification, we can make sure checkAndDelete is executed after 
put.
+   */
+  private boolean verifyPut(Table table, Put put, byte[] value) throws 
IOException {
+    table.put(put);
+    Get get = new Get(ROW);
+    get.addColumn(FAMILY, QUALIFIER);
+    Result result = table.get(get);
+    return Bytes.equals(value, result.value());
   }
 
   /**

Reply via email to