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());
}
/**