From f51878ba516d4803fcd9103f186fdc3afa383791 Mon Sep 17 00:00:00 2001 From: Pankaj Kumar Date: Thu, 25 Aug 2016 17:25:49 +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 | 52 ++++++++++++++++++++++ 2 files changed, 54 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..01377bd 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,54 @@ public class TestAdmin2 { ProcedureInfo[] procList = admin.listProcedures(); assertTrue(procList.length >= 0); } + + @Test + public void testScanWithSplitKeysAndNullStartEndRow() throws IOException { + TableName tableName = TableName.valueOf("testScanWithSplitKeysAndNullStartEndRow"); + Table table = null; + + try (Connection conn = ConnectionFactory.createConnection(TEST_UTIL.getConfiguration())) { + HTableDescriptor desc = new HTableDescriptor(tableName); + byte[] family = Bytes.toBytes("cf"); + byte[] qual = Bytes.toBytes("q"); + HColumnDescriptor hcd = new HColumnDescriptor(family); + desc.addFamily(hcd); + byte[][] splitKeys = { Bytes.toBytes("1"), Bytes.toBytes("2"), Bytes.toBytes("3"), + Bytes.toBytes("4"), Bytes.toBytes("5") }; + 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 = conn.getTable(tableName); + table.put(puts); + + // set start/end row null randomly + setScanAndAssertResult(table, Bytes.toBytes("5"), null, 5); + setScanAndAssertResult(table, Bytes.toBytes("1"), null, 10); + setScanAndAssertResult(table, null, null, 10); + setScanAndAssertResult(table, Bytes.toBytes("1"), HConstants.EMPTY_END_ROW, 10); + } finally { + if (table != null) { + TEST_UTIL.deleteTable(tableName); + } + } + } + + private void setScanAndAssertResult(Table table, byte[] startRow, byte[] endRow, + int expectedResultCount) throws IOException { + Scan scan = new Scan(); + scan.setStartRow(startRow); + scan.setStopRow(endRow); + + try (ResultScanner rs = table.getScanner(scan)) { + Result[] result = rs.next(15); + Assert.assertNotNull(result); + assertEquals(expectedResultCount, result.length); + } + } } -- 2.7.2.windows.1