This is an automated email from the ASF dual-hosted git repository.

vjasani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/master by this push:
     new 390abb5  HBASE-25299 Deprecate Scan#setRowPrefixFilter because of an 
unexpected behavior
390abb5 is described below

commit 390abb520cb0b599b7ba8a1adb7f6a2ba6ab0366
Author: tianhang <tangtianhang...@gmail.com>
AuthorDate: Tue Nov 24 19:31:03 2020 +0530

    HBASE-25299 Deprecate Scan#setRowPrefixFilter because of an unexpected 
behavior
    
    Closes #2674
    
    Signed-off-by: Guanghao Zhang <zg...@apache.org>
    Signed-off-by: huaxiangsun <huaxiang...@apache.org>
    Signed-off-by: Viraj Jasani <vjas...@apache.org>
---
 .../java/org/apache/hadoop/hbase/client/Scan.java  |  9 +++++
 .../hadoop/hbase/filter/TestScanRowPrefix.java     | 39 ++++++++++++++++++++++
 2 files changed, 48 insertions(+)

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 36b116b..708d6c7 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
@@ -383,6 +383,9 @@ public class Scan extends Query {
    * <p>
    * If the specified row does not exist, or the {@code inclusive} is {@code 
false}, the Scanner
    * will start from the next closest row after the specified row.
+   * <p>
+   * <b>Note:</b> When use {@link #setRowPrefixFilter(byte[])}, the result 
might be unexpected.
+   * </p>
    * @param startRow row to start scanner at or after
    * @param inclusive whether we should include the start row when scan
    * @return this
@@ -447,7 +450,13 @@ public class Scan extends Query {
    * after this method will yield undefined results.</b></p>
    * @param rowPrefix the prefix all rows must start with. (Set <i>null</i> to 
remove the filter.)
    * @return this
+   * @deprecated since 3.0.0. The scan result might be unexpected in some 
cases.
+   *   e.g. startRow : "112" and rowPrefixFilter : "11"
+   *   The Result of this scan might contains : "111"
+   *   This method implements the filter by setting startRow and stopRow,
+   *   but does not take care of the scenario where startRow has been set.
    */
+  @Deprecated
   public Scan setRowPrefixFilter(byte[] rowPrefix) {
     if (rowPrefix == null) {
       withStartRow(HConstants.EMPTY_START_ROW);
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestScanRowPrefix.java
 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestScanRowPrefix.java
index f531954..dcf7b00 100644
--- 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestScanRowPrefix.java
+++ 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/filter/TestScanRowPrefix.java
@@ -206,6 +206,45 @@ public class TestScanRowPrefix extends 
FilterTestingCluster {
     verifyScanResult(table, scan, expected0, "Scan after prefix reset failed");
   }
 
+  @Test
+  public void testRowPrefixFilterAndStartRow() throws IOException {
+    final TableName tableName = TableName.valueOf(name.getMethodName());
+    createTable(tableName,"F");
+    Table table = openTable(tableName);
+
+    final byte[][] rowkeys = {Bytes.toBytes("111"), Bytes.toBytes("112")};
+    final byte[] prefixFilter = Bytes.toBytes("11");
+    for (byte[] rowkey: rowkeys) {
+      Put p = new Put(rowkey);
+      p.addColumn(Bytes.toBytes("F"), Bytes.toBytes("f"), Bytes.toBytes("test 
value"));
+      table.put(p);
+    }
+
+    List<byte[]> expected0 = new ArrayList<>();
+    expected0.add(rowkeys[0]);
+    expected0.add(rowkeys[1]);
+
+    List<byte[]> expected1 = new ArrayList<>();
+    expected1.add(rowkeys[1]);
+
+    // ========
+    // First scan
+    // Set startRow before setRowPrefixFilter
+    Scan scan = new Scan();
+    scan.withStartRow(rowkeys[1]);
+    scan.setRowPrefixFilter(prefixFilter);
+    verifyScanResult(table, scan, expected0, "Set startRow before 
setRowPrefixFilter unexpected");
+
+    // ========
+    // Second scan
+    // Set startRow after setRowPrefixFilter
+    // The result is different from first scan
+    scan = new Scan();
+    scan.setRowPrefixFilter(prefixFilter);
+    scan.withStartRow(rowkeys[1]);
+    verifyScanResult(table, scan, expected1, "Set startRow after 
setRowPrefixFilter unexpected");
+  }
+
   private void verifyScanResult(Table table, Scan scan, List<byte[]> 
expectedKeys, String message) {
     List<byte[]> actualKeys = new ArrayList<>();
     try {

Reply via email to