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