From 793b1f787edc723c4b319d4ae5eb027c2ac485e5 Mon Sep 17 00:00:00 2001 From: Abishek_Kumar Date: Mon, 5 Oct 2015 16:26:24 +0530 Subject: [PATCH] HBASE-14525:- Append and increment operation throws NPE on non exist column family. Change-Id: I33c30f04feca4baf27e7673e19c49303b0d2e043 --- .../apache/hadoop/hbase/regionserver/HRegion.java | 14 ++++++++++++ .../hbase/regionserver/TestAtomicOperation.java | 26 ++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 0e2e9a2..8194c8e 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -7017,6 +7017,13 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi long now = EnvironmentEdgeManager.currentTime(); // Process each family for (Map.Entry> family : mutate.getFamilyCellMap().entrySet()) { + // check if table family exists + try { + checkFamily(family.getKey()); + } catch (NoSuchColumnFamilyException e) { + LOG.warn("Unknown column family in append operation", e); + continue; + } Store store = stores.get(family.getKey()); List kvs = new ArrayList(family.getValue().size()); @@ -7261,6 +7268,13 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi long now = EnvironmentEdgeManager.currentTime(); // Process each family for (Map.Entry> family: mutation.getFamilyCellMap().entrySet()) { + // check if table family exists + try { + checkFamily(family.getKey()); + } catch (NoSuchColumnFamilyException e) { + LOG.warn("Unknown column family in increment operation", e); + continue; + } Store store = stores.get(family.getKey()); List kvs = new ArrayList(family.getValue().size()); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.java index 3a77046..e91ab77 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestAtomicOperation.java @@ -134,6 +134,32 @@ public class TestAtomicOperation { assertEquals(0, Bytes.compareTo(Bytes.toBytes(v2+v1), result.getValue(fam1, qual2))); } + @Test + public void testAppendWithNonExistingFamily() throws IOException { + initHRegion(tableName, name.getMethodName(), fam1); + final String v1 = "Value"; + Append a = new Append(row); + a.add(fam1, qual1, Bytes.toBytes(v1)); + a.add(fam2, qual2, Bytes.toBytes(v1)); + final Result result = region.append(a, HConstants.NO_NONCE, HConstants.NO_NONCE); + assertEquals(null, result.getValue(fam2, qual2)); + assertEquals(0, Bytes.compareTo(Bytes.toBytes(v1), result.getValue(fam1, qual1))); + } + + @Test + public void testIncrementWithNonExistingFamily() throws IOException { + initHRegion(tableName, name.getMethodName(), fam1); + Increment inc = new Increment(row); + inc.addColumn(fam1, qual1, 1); + inc.addColumn(fam2, qual2, 1); + inc.setDurability(Durability.ASYNC_WAL); + region.increment(inc, HConstants.NO_NONCE, HConstants.NO_NONCE); + Get g = new Get(row); + Result result = region.get(g); + assertEquals(1, Bytes.toLong(result.getValue(fam1, qual1))); + assertEquals(null, result.getValue(fam2, qual2)); + } + /** * Test multi-threaded increments. */ -- 1.8.4.msysgit.0