Skip to content
Permalink
Browse files
HBASE-26901 delete with null columnQualifier occurs NullPointerExcept…
…ion when NewVersionBehavior is on (#4295)

Signed-off-by: Duo Zhang <zhangduo@apache.org>
  • Loading branch information
eomiks committed Apr 12, 2022
1 parent 1d8a5bf commit 7ac9e0be27afe312116943842855fdb776dce958
Showing 2 changed files with 22 additions and 5 deletions.
@@ -165,18 +165,15 @@ protected DeleteVersionsNode getDeepCopy() {
* 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();
for (Map.Entry<Long, DeleteVersionsNode> e : delFamMap.entrySet()) {
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 @@ protected long prepare(Cell cell) {
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) {
@@ -19,6 +19,7 @@

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 void testRawScanAndMajorCompaction() throws IOException {
}
}

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

0 comments on commit 7ac9e0b

Please sign in to comment.