You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by el...@apache.org on 2018/11/06 20:43:49 UTC

[1/4] hbase git commit: HBASE-21347 Backport HBASE-21200 "Memstore flush doesn't finish because of seekToPreviousRow() in memstore scanner." to branch-1

Repository: hbase
Updated Branches:
  refs/heads/branch-1 f967bfdca -> 5fcfdcdc5
  refs/heads/branch-1.2 304eac92b -> 56ae22869
  refs/heads/branch-1.3 d71729a7b -> 484b651fc
  refs/heads/branch-1.4 eb63a6447 -> 3f1fb46ca


HBASE-21347 Backport HBASE-21200 "Memstore flush doesn't finish because of seekToPreviousRow() in memstore scanner." to branch-1

Signed-off-by: Josh Elser <el...@apache.org>
Signed-off-by: Ted Yu <te...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/5fcfdcdc
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/5fcfdcdc
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/5fcfdcdc

Branch: refs/heads/branch-1
Commit: 5fcfdcdc518ba33d8cd57f19643e37b8ecae2a4a
Parents: f967bfd
Author: Toshihiro Suzuki <br...@gmail.com>
Authored: Sat Oct 20 13:16:32 2018 +0900
Committer: Josh Elser <el...@apache.org>
Committed: Tue Nov 6 14:00:34 2018 -0500

----------------------------------------------------------------------
 .../hbase/regionserver/DefaultMemStore.java     |  8 ++--
 .../hadoop/hbase/regionserver/TestHRegion.java  | 40 ++++++++++++++++++++
 2 files changed, 45 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/5fcfdcdc/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
index edc6511..299c998 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
@@ -719,6 +719,8 @@ public class DefaultMemStore implements MemStore {
     // A flag represents whether could stop skipping Cells for MVCC
     // if have encountered the next row. Only used for reversed scan
     private boolean stopSkippingCellsIfNextRow = false;
+    // Stop skipping KeyValues for MVCC if finish this row. Only used for reversed scan
+    private Cell stopSkippingKVsRow;
 
     private final long readPoint;
     private final KeyValue.KVComparator comparator;
@@ -765,7 +767,6 @@ public class DefaultMemStore implements MemStore {
      * @return Next Cell
      */
     private Cell getNext(Iterator<Cell> it) {
-      Cell startCell = theNext;
       Cell v = null;
       try {
         while (it.hasNext()) {
@@ -773,8 +774,8 @@ public class DefaultMemStore implements MemStore {
           if (v.getSequenceId() <= this.readPoint) {
             return v;
           }
-          if (stopSkippingCellsIfNextRow && startCell != null
-              && comparator.compareRows(v, startCell) > 0) {
+          if (stopSkippingCellsIfNextRow && stopSkippingKVsRow != null
+              && comparator.compareRows(v, stopSkippingKVsRow) > 0) {
             return null;
           }
         }
@@ -994,6 +995,7 @@ public class DefaultMemStore implements MemStore {
         Cell firstKeyOnPreviousRow = KeyValueUtil.createFirstOnRow(lastCellBeforeRow.getRowArray(),
             lastCellBeforeRow.getRowOffset(), lastCellBeforeRow.getRowLength());
         this.stopSkippingCellsIfNextRow = true;
+        this.stopSkippingKVsRow = firstKeyOnPreviousRow;
         seek(firstKeyOnPreviousRow);
         this.stopSkippingCellsIfNextRow = false;
         if (peek() == null

http://git-wip-us.apache.org/repos/asf/hbase/blob/5fcfdcdc/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
index 48ee825..0d2e35c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
@@ -6538,4 +6538,44 @@ public class TestHRegion {
     assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),
       currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));
   }
+
+  @Test
+  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {
+    byte[] cf1 = Bytes.toBytes("CF1");
+    byte[][] families = { cf1 };
+    byte[] col = Bytes.toBytes("C");
+
+    HBaseConfiguration conf = new HBaseConfiguration();
+    this.region = initHRegion(tableName, method, conf, families);
+
+    Put put = new Put(Bytes.toBytes("199996"));
+    put.addColumn(cf1, col, Bytes.toBytes("val"));
+    region.put(put);
+    Put put2 = new Put(Bytes.toBytes("199995"));
+    put2.addColumn(cf1, col, Bytes.toBytes("val"));
+    region.put(put2);
+
+    // Create a reverse scan
+    Scan scan = new Scan(Bytes.toBytes("199996"));
+    scan.setReversed(true);
+    RegionScanner scanner = region.getScanner(scan);
+
+    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan
+    for (int i = 100000; i < 200000; i++) {
+      Put p = new Put(Bytes.toBytes("" + i));
+      p.addColumn(cf1, col, Bytes.toBytes("" + i));
+      region.put(p);
+    }
+    List<Cell> currRow = new ArrayList<>();
+    boolean hasNext;
+    do {
+      hasNext = scanner.next(currRow);
+    } while (hasNext);
+
+    assertEquals(2, currRow.size());
+    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),
+      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));
+    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),
+      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));
+  }
 }


[2/4] hbase git commit: HBASE-21347 Backport HBASE-21200 "Memstore flush doesn't finish because of seekToPreviousRow() in memstore scanner." to branch-1

Posted by el...@apache.org.
HBASE-21347 Backport HBASE-21200 "Memstore flush doesn't finish because of seekToPreviousRow() in memstore scanner." to branch-1

Signed-off-by: Josh Elser <el...@apache.org>
Signed-off-by: Ted Yu <te...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/3f1fb46c
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/3f1fb46c
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/3f1fb46c

Branch: refs/heads/branch-1.4
Commit: 3f1fb46ca474e82372e874f6328b6745d6dce577
Parents: eb63a64
Author: Toshihiro Suzuki <br...@gmail.com>
Authored: Sat Oct 20 13:16:32 2018 +0900
Committer: Josh Elser <el...@apache.org>
Committed: Tue Nov 6 14:08:37 2018 -0500

----------------------------------------------------------------------
 .../hbase/regionserver/DefaultMemStore.java     |  8 ++--
 .../hadoop/hbase/regionserver/TestHRegion.java  | 40 ++++++++++++++++++++
 2 files changed, 45 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/3f1fb46c/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
index edc6511..299c998 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
@@ -719,6 +719,8 @@ public class DefaultMemStore implements MemStore {
     // A flag represents whether could stop skipping Cells for MVCC
     // if have encountered the next row. Only used for reversed scan
     private boolean stopSkippingCellsIfNextRow = false;
+    // Stop skipping KeyValues for MVCC if finish this row. Only used for reversed scan
+    private Cell stopSkippingKVsRow;
 
     private final long readPoint;
     private final KeyValue.KVComparator comparator;
@@ -765,7 +767,6 @@ public class DefaultMemStore implements MemStore {
      * @return Next Cell
      */
     private Cell getNext(Iterator<Cell> it) {
-      Cell startCell = theNext;
       Cell v = null;
       try {
         while (it.hasNext()) {
@@ -773,8 +774,8 @@ public class DefaultMemStore implements MemStore {
           if (v.getSequenceId() <= this.readPoint) {
             return v;
           }
-          if (stopSkippingCellsIfNextRow && startCell != null
-              && comparator.compareRows(v, startCell) > 0) {
+          if (stopSkippingCellsIfNextRow && stopSkippingKVsRow != null
+              && comparator.compareRows(v, stopSkippingKVsRow) > 0) {
             return null;
           }
         }
@@ -994,6 +995,7 @@ public class DefaultMemStore implements MemStore {
         Cell firstKeyOnPreviousRow = KeyValueUtil.createFirstOnRow(lastCellBeforeRow.getRowArray(),
             lastCellBeforeRow.getRowOffset(), lastCellBeforeRow.getRowLength());
         this.stopSkippingCellsIfNextRow = true;
+        this.stopSkippingKVsRow = firstKeyOnPreviousRow;
         seek(firstKeyOnPreviousRow);
         this.stopSkippingCellsIfNextRow = false;
         if (peek() == null

http://git-wip-us.apache.org/repos/asf/hbase/blob/3f1fb46c/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
index 69f80ab..fdf094c 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
@@ -6538,4 +6538,44 @@ public class TestHRegion {
     assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),
       currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));
   }
+
+  @Test
+  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {
+    byte[] cf1 = Bytes.toBytes("CF1");
+    byte[][] families = { cf1 };
+    byte[] col = Bytes.toBytes("C");
+
+    HBaseConfiguration conf = new HBaseConfiguration();
+    this.region = initHRegion(tableName, method, conf, families);
+
+    Put put = new Put(Bytes.toBytes("199996"));
+    put.addColumn(cf1, col, Bytes.toBytes("val"));
+    region.put(put);
+    Put put2 = new Put(Bytes.toBytes("199995"));
+    put2.addColumn(cf1, col, Bytes.toBytes("val"));
+    region.put(put2);
+
+    // Create a reverse scan
+    Scan scan = new Scan(Bytes.toBytes("199996"));
+    scan.setReversed(true);
+    RegionScanner scanner = region.getScanner(scan);
+
+    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan
+    for (int i = 100000; i < 200000; i++) {
+      Put p = new Put(Bytes.toBytes("" + i));
+      p.addColumn(cf1, col, Bytes.toBytes("" + i));
+      region.put(p);
+    }
+    List<Cell> currRow = new ArrayList<>();
+    boolean hasNext;
+    do {
+      hasNext = scanner.next(currRow);
+    } while (hasNext);
+
+    assertEquals(2, currRow.size());
+    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),
+      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));
+    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),
+      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));
+  }
 }


[3/4] hbase git commit: HBASE-21347 Backport HBASE-21200 "Memstore flush doesn't finish because of seekToPreviousRow() in memstore scanner." to branch-1

Posted by el...@apache.org.
HBASE-21347 Backport HBASE-21200 "Memstore flush doesn't finish because of seekToPreviousRow() in memstore scanner." to branch-1

Signed-off-by: Josh Elser <el...@apache.org>
Signed-off-by: Ted Yu <te...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/484b651f
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/484b651f
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/484b651f

Branch: refs/heads/branch-1.3
Commit: 484b651fce2c36add33668e2fdeeb2b2d8593489
Parents: d71729a
Author: Toshihiro Suzuki <br...@gmail.com>
Authored: Sat Oct 20 13:16:32 2018 +0900
Committer: Josh Elser <el...@apache.org>
Committed: Tue Nov 6 15:33:41 2018 -0500

----------------------------------------------------------------------
 .../hbase/regionserver/DefaultMemStore.java     |  8 ++--
 .../hadoop/hbase/regionserver/TestHRegion.java  | 40 ++++++++++++++++++++
 2 files changed, 45 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/484b651f/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
index 5f17d31..79ec164 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
@@ -709,6 +709,8 @@ public class DefaultMemStore implements MemStore {
     // A flag represents whether could stop skipping Cells for MVCC
     // if have encountered the next row. Only used for reversed scan
     private boolean stopSkippingCellsIfNextRow = false;
+    // Stop skipping KeyValues for MVCC if finish this row. Only used for reversed scan
+    private Cell stopSkippingKVsRow;
 
     private final long readPoint;
     private final KeyValue.KVComparator comparator;
@@ -755,7 +757,6 @@ public class DefaultMemStore implements MemStore {
      * @return Next Cell
      */
     private Cell getNext(Iterator<Cell> it) {
-      Cell startCell = theNext;
       Cell v = null;
       try {
         while (it.hasNext()) {
@@ -763,8 +764,8 @@ public class DefaultMemStore implements MemStore {
           if (v.getSequenceId() <= this.readPoint) {
             return v;
           }
-          if (stopSkippingCellsIfNextRow && startCell != null
-              && comparator.compareRows(v, startCell) > 0) {
+          if (stopSkippingCellsIfNextRow && stopSkippingKVsRow != null
+              && comparator.compareRows(v, stopSkippingKVsRow) > 0) {
             return null;
           }
         }
@@ -983,6 +984,7 @@ public class DefaultMemStore implements MemStore {
         Cell firstKeyOnPreviousRow = KeyValueUtil.createFirstOnRow(lastCellBeforeRow.getRowArray(),
             lastCellBeforeRow.getRowOffset(), lastCellBeforeRow.getRowLength());
         this.stopSkippingCellsIfNextRow = true;
+        this.stopSkippingKVsRow = firstKeyOnPreviousRow;
         seek(firstKeyOnPreviousRow);
         this.stopSkippingCellsIfNextRow = false;
         if (peek() == null

http://git-wip-us.apache.org/repos/asf/hbase/blob/484b651f/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
index 4853177..f766870 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
@@ -6432,4 +6432,44 @@ public class TestHRegion {
     assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),
       currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));
   }
+
+  @Test
+  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {
+    byte[] cf1 = Bytes.toBytes("CF1");
+    byte[][] families = { cf1 };
+    byte[] col = Bytes.toBytes("C");
+
+    HBaseConfiguration conf = new HBaseConfiguration();
+    this.region = initHRegion(tableName, method, conf, families);
+
+    Put put = new Put(Bytes.toBytes("199996"));
+    put.addColumn(cf1, col, Bytes.toBytes("val"));
+    region.put(put);
+    Put put2 = new Put(Bytes.toBytes("199995"));
+    put2.addColumn(cf1, col, Bytes.toBytes("val"));
+    region.put(put2);
+
+    // Create a reverse scan
+    Scan scan = new Scan(Bytes.toBytes("199996"));
+    scan.setReversed(true);
+    RegionScanner scanner = region.getScanner(scan);
+
+    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan
+    for (int i = 100000; i < 200000; i++) {
+      Put p = new Put(Bytes.toBytes("" + i));
+      p.addColumn(cf1, col, Bytes.toBytes("" + i));
+      region.put(p);
+    }
+    List<Cell> currRow = new ArrayList<>();
+    boolean hasNext;
+    do {
+      hasNext = scanner.next(currRow);
+    } while (hasNext);
+
+    assertEquals(2, currRow.size());
+    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),
+      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));
+    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),
+      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));
+  }
 }


[4/4] hbase git commit: HBASE-21347 Backport HBASE-21200 "Memstore flush doesn't finish because of seekToPreviousRow() in memstore scanner." to branch-1

Posted by el...@apache.org.
HBASE-21347 Backport HBASE-21200 "Memstore flush doesn't finish because of seekToPreviousRow() in memstore scanner." to branch-1

Signed-off-by: Josh Elser <el...@apache.org>
Signed-off-by: Ted Yu <te...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/56ae2286
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/56ae2286
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/56ae2286

Branch: refs/heads/branch-1.2
Commit: 56ae228692d99127986408e44db77850d6a43daa
Parents: 304eac9
Author: Toshihiro Suzuki <br...@gmail.com>
Authored: Sat Oct 20 13:16:32 2018 +0900
Committer: Josh Elser <el...@apache.org>
Committed: Tue Nov 6 15:37:59 2018 -0500

----------------------------------------------------------------------
 .../hbase/regionserver/DefaultMemStore.java     |  8 ++--
 .../hadoop/hbase/regionserver/TestHRegion.java  | 40 ++++++++++++++++++++
 2 files changed, 45 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/56ae2286/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
index 3d095cb..fa7f8cd 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java
@@ -742,6 +742,8 @@ public class DefaultMemStore implements MemStore {
     // A flag represents whether could stop skipping Cells for MVCC
     // if have encountered the next row. Only used for reversed scan
     private boolean stopSkippingCellsIfNextRow = false;
+    // Stop skipping KeyValues for MVCC if finish this row. Only used for reversed scan
+    private Cell stopSkippingKVsRow;
 
     private long readPoint;
 
@@ -791,7 +793,6 @@ public class DefaultMemStore implements MemStore {
      * @return Next Cell
      */
     private Cell getNext(Iterator<Cell> it) {
-      Cell startCell = theNext;
       Cell v = null;
       try {
         while (it.hasNext()) {
@@ -799,8 +800,8 @@ public class DefaultMemStore implements MemStore {
           if (v.getSequenceId() <= this.readPoint) {
             return v;
           }
-          if (stopSkippingCellsIfNextRow && startCell != null
-              && comparator.compareRows(v, startCell) > 0) {
+          if (stopSkippingCellsIfNextRow && stopSkippingKVsRow != null
+              && comparator.compareRows(v, stopSkippingKVsRow) > 0) {
             return null;
           }
         }
@@ -1019,6 +1020,7 @@ public class DefaultMemStore implements MemStore {
         Cell firstKeyOnPreviousRow = KeyValueUtil.createFirstOnRow(lastCellBeforeRow.getRowArray(),
             lastCellBeforeRow.getRowOffset(), lastCellBeforeRow.getRowLength());
         this.stopSkippingCellsIfNextRow = true;
+        this.stopSkippingKVsRow = firstKeyOnPreviousRow;
         seek(firstKeyOnPreviousRow);
         this.stopSkippingCellsIfNextRow = false;
         if (peek() == null

http://git-wip-us.apache.org/repos/asf/hbase/blob/56ae2286/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
index d6c2f47..38e668f 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
@@ -6760,4 +6760,44 @@ public class TestHRegion {
       this.region = null;
     }
   }
+
+  @Test
+  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {
+    byte[] cf1 = Bytes.toBytes("CF1");
+    byte[][] families = { cf1 };
+    byte[] col = Bytes.toBytes("C");
+
+    HBaseConfiguration conf = new HBaseConfiguration();
+    this.region = initHRegion(tableName, method, conf, families);
+
+    Put put = new Put(Bytes.toBytes("199996"));
+    put.addColumn(cf1, col, Bytes.toBytes("val"));
+    region.put(put);
+    Put put2 = new Put(Bytes.toBytes("199995"));
+    put2.addColumn(cf1, col, Bytes.toBytes("val"));
+    region.put(put2);
+
+    // Create a reverse scan
+    Scan scan = new Scan(Bytes.toBytes("199996"));
+    scan.setReversed(true);
+    RegionScanner scanner = region.getScanner(scan);
+
+    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan
+    for (int i = 100000; i < 200000; i++) {
+      Put p = new Put(Bytes.toBytes("" + i));
+      p.addColumn(cf1, col, Bytes.toBytes("" + i));
+      region.put(p);
+    }
+    List<Cell> currRow = new ArrayList<>();
+    boolean hasNext;
+    do {
+      hasNext = scanner.next(currRow);
+    } while (hasNext);
+
+    assertEquals(2, currRow.size());
+    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),
+      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));
+    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),
+      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));
+  }
 }