You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2022/04/12 12:43:45 UTC
[hbase] branch branch-2.4 updated: HBASE-26901 delete with null columnQualifier occurs NullPointerException when NewVersionBehavior is on (#4295)
This is an automated email from the ASF dual-hosted git repository.
zhangduo pushed a commit to branch branch-2.4
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.4 by this push:
new df01fd4c25e HBASE-26901 delete with null columnQualifier occurs NullPointerException when NewVersionBehavior is on (#4295)
df01fd4c25e is described below
commit df01fd4c25e3cc493b2d52bb04493cdfe5f701ae
Author: eomiks <je...@navercorp.com>
AuthorDate: Tue Apr 12 21:26:36 2022 +0900
HBASE-26901 delete with null columnQualifier occurs NullPointerException when NewVersionBehavior is on (#4295)
Signed-off-by: Duo Zhang <zh...@apache.org>
(cherry picked from commit 7ac9e0be27afe312116943842855fdb776dce958)
---
.../querymatcher/NewVersionBehaviorTracker.java | 16 +++++++++++-----
.../TestNewVersionBehaviorFromClientSide.java | 11 +++++++++++
2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/querymatcher/NewVersionBehaviorTracker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/querymatcher/NewVersionBehaviorTracker.java
index 3c9a541d0b3..d62e2aa1f5b 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/querymatcher/NewVersionBehaviorTracker.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/querymatcher/NewVersionBehaviorTracker.java
@@ -165,9 +165,7 @@ public class NewVersionBehaviorTracker implements ColumnTracker, DeleteTracker {
* Else return MAX_VALUE.
*/
protected long prepare(Cell cell) {
- boolean matchCq =
- PrivateCellUtil.matchingQualifier(cell, lastCqArray, lastCqOffset, lastCqLength);
- if (!matchCq) {
+ if (isColumnQualifierChanged(cell)) {
// The last cell is family-level delete and this is not, or the cq is changed,
// we should construct delColMap as a deep copy of delFamMap.
delColMap.clear();
@@ -175,8 +173,7 @@ public class NewVersionBehaviorTracker implements ColumnTracker, DeleteTracker {
delColMap.put(e.getKey(), e.getValue().getDeepCopy());
}
countCurrentCol = 0;
- }
- if (matchCq && !PrivateCellUtil.isDelete(lastCqType) && lastCqType == cell.getTypeByte()
+ } else if (!PrivateCellUtil.isDelete(lastCqType) && lastCqType == cell.getTypeByte()
&& lastCqTs == cell.getTimestamp()) {
// Put with duplicate timestamp, ignore.
return lastCqMvcc;
@@ -190,6 +187,15 @@ public class NewVersionBehaviorTracker implements ColumnTracker, DeleteTracker {
return Long.MAX_VALUE;
}
+ private boolean isColumnQualifierChanged(Cell cell) {
+ if (delColMap.isEmpty() && lastCqArray == null && cell.getQualifierLength() == 0
+ && (PrivateCellUtil.isDeleteColumns(cell) || PrivateCellUtil.isDeleteColumnVersion(cell))) {
+ // for null columnQualifier
+ return true;
+ }
+ return !PrivateCellUtil.matchingQualifier(cell, lastCqArray, lastCqOffset, lastCqLength);
+ }
+
// DeleteTracker
@Override
public void add(Cell cell) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestNewVersionBehaviorFromClientSide.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestNewVersionBehaviorFromClientSide.java
index 897fc3c00d5..7fdc10d18ee 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestNewVersionBehaviorFromClientSide.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestNewVersionBehaviorFromClientSide.java
@@ -19,6 +19,7 @@ package org.apache.hadoop.hbase.regionserver;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
import java.io.IOException;
import org.apache.hadoop.hbase.HBaseClassTestRule;
@@ -358,4 +359,14 @@ public class TestNewVersionBehaviorFromClientSide {
}
}
+ @Test
+ public void testNullColumnQualifier() throws IOException {
+ try (Table t = createTable()) {
+ Delete del = new Delete(ROW);
+ del.addColumn(FAMILY, null);
+ t.delete(del);
+ Result r = t.get(new Get(ROW)); //NPE
+ assertTrue(r.isEmpty());
+ }
+ }
}