Repository: hbase Updated Branches: refs/heads/branch-2 8e5d88366 -> 9cd7619b5
HBASE-18921 Fix Result.current ArrayIndexOutOfBoundsException Patch ArrayIndexOutOfBoundsException when current() is called after advance() has already returned false Signed-off-by: Chia-Ping Tsai <[email protected]> Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/9cd7619b Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/9cd7619b Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/9cd7619b Branch: refs/heads/branch-2 Commit: 9cd7619b5c858130e92806c40747148a89a02940 Parents: 8e5d883 Author: Maytee Chinavanichkit <[email protected]> Authored: Mon Oct 2 15:19:25 2017 +0900 Committer: Chia-Ping Tsai <[email protected]> Committed: Sun Oct 8 02:51:02 2017 +0800 ---------------------------------------------------------------------- .../org/apache/hadoop/hbase/client/Result.java | 16 +++++++++++++--- .../apache/hadoop/hbase/client/TestResult.java | 18 ++++++++++++++++++ 2 files changed, 31 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/9cd7619b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java ---------------------------------------------------------------------- diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java index 1871d17..906caac 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java @@ -30,6 +30,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.NavigableMap; +import java.util.NoSuchElementException; import java.util.TreeMap; import org.apache.hadoop.hbase.Cell; @@ -883,14 +884,23 @@ public class Result implements CellScannable, CellScanner { @Override public Cell current() { - if (cells == null) return null; - return (cellScannerIndex < 0)? null: this.cells[cellScannerIndex]; + if (cells == null + || cellScannerIndex == INITIAL_CELLSCANNER_INDEX + || cellScannerIndex >= cells.length) + return null; + return this.cells[cellScannerIndex]; } @Override public boolean advance() { if (cells == null) return false; - return ++cellScannerIndex < this.cells.length; + cellScannerIndex++; + if (cellScannerIndex < this.cells.length) { + return true; + } else if (cellScannerIndex == this.cells.length) { + return false; + } + throw new NoSuchElementException("Cannot advance beyond the last cell"); } public Boolean getExists() { http://git-wip-us.apache.org/repos/asf/hbase/blob/9cd7619b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResult.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResult.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResult.java index 0e93ee0..bf9a69a 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResult.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResult.java @@ -25,6 +25,7 @@ import java.io.IOException; import java.nio.ByteBuffer; import java.util.Arrays; import java.util.List; +import java.util.NoSuchElementException; import junit.framework.TestCase; @@ -106,6 +107,23 @@ public class TestResult extends TestCase { } } + public void testCurrentOnEmptyCell() throws IOException { + Result r = Result.create(new Cell[0]); + assertFalse(r.advance()); + assertNull(r.current()); + } + + public void testAdvanceTwiceOnEmptyCell() throws IOException { + Result r = Result.create(new Cell[0]); + assertFalse(r.advance()); + try { + r.advance(); + fail("NoSuchElementException should have been thrown!"); + } catch (NoSuchElementException ex) { + LOG.debug("As expected: " + ex.getMessage()); + } + } + public void testMultiVersionGetColumn() throws Exception { KeyValue [] kvs1 = genKVs(row, family, value, 1, 100); KeyValue [] kvs2 = genKVs(row, family, value, 200, 100);
