From eebfea8b93a45c16434c31cde93d1af380be8e7d Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Date: Thu, 25 Aug 2016 10:33:38 +0800 Subject: [PATCH] HBASE-16498, NPE when Scan's stopRow is set NULL --- .../java/org/apache/hadoop/hbase/client/Scan.java | 4 +- .../org/apache/hadoop/hbase/client/TestAdmin2.java | 67 ++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java index ee3ed43..eb715ad 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java @@ -602,14 +602,14 @@ public class Scan extends Query { * @return the startrow */ public byte [] getStartRow() { - return this.startRow; + return this.startRow != null ? this.startRow : HConstants.EMPTY_START_ROW; } /** * @return the stoprow */ public byte [] getStopRow() { - return this.stopRow; + return this.stopRow != null ? this.stopRow : HConstants.EMPTY_END_ROW; } /** diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java index 126eaa9..76a9193 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestAdmin2.java @@ -24,6 +24,7 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.atomic.AtomicInteger; @@ -60,6 +61,7 @@ import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.wal.AbstractFSWALProvider; import org.junit.After; import org.junit.AfterClass; +import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; @@ -758,4 +760,69 @@ public class TestAdmin2 { ProcedureInfo[] procList = admin.listProcedures(); assertTrue(procList.length >= 0); } + + @Test + public void testScanWithSplitKeysAndNullStartEndRow() throws IOException { + byte[][] splitKeys = { Bytes.toBytes("1"), Bytes.toBytes("2"), Bytes.toBytes("3"), + Bytes.toBytes("4"), Bytes.toBytes("5") }; + Table table = null; + ResultScanner rs = null; + TableName tableName = TableName.valueOf("testScanWithSplitKeysAndNullStartEndRow"); + HTableDescriptor desc = new HTableDescriptor(tableName); + byte[] family = Bytes.toBytes("cf"); + byte[] qual = Bytes.toBytes("q"); + HColumnDescriptor hcd = new HColumnDescriptor(family); + desc.addFamily(hcd); + try (Connection c = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration())) { + TEST_UTIL.createTable(desc, splitKeys); + + List puts = new ArrayList<>(); + for (int i = 1; i <= 10; i++) { + byte[] row = Bytes.toBytes(String.valueOf(i)); + Put p = new Put(row); + p.addColumn(family, qual, row); + puts.add(p); + } + table = c.getTable(tableName); + table.put(puts); + + Scan scan = new Scan(); + scan.setStartRow(Bytes.toBytes("5")); + scan.setStopRow(null); + rs = table.getScanner(scan); + Result[] result = rs.next(15); + Assert.assertNotNull(result); + assertEquals(5, result.length); + + scan = new Scan(); + scan.setStartRow(Bytes.toBytes("1")); + scan.setStopRow(null); + rs = table.getScanner(scan); + result = rs.next(15); + Assert.assertNotNull(result); + assertEquals(10, result.length); + + scan = new Scan(); + scan.setStartRow(null); + scan.setStopRow(null); + rs = table.getScanner(scan); + result = rs.next(15); + Assert.assertNotNull(result); + assertEquals(10, result.length); + + scan = new Scan(); + scan.setStartRow(Bytes.toBytes("1")); + rs = table.getScanner(scan); + result = rs.next(15); + Assert.assertNotNull(result); + assertEquals(10, result.length); + } finally { + if (rs != null) { + rs.close(); + } + if (table != null) { + TEST_UTIL.deleteTable(tableName); + } + } + } } -- 2.7.2.windows.1