You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2021/12/05 14:41:57 UTC

[hbase] branch branch-2 updated: HBASE-26533 KeyValueScanner might not be properly closed when using InternalScan.checkOnlyMemStore() (#3917)

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

zhangduo pushed a commit to branch branch-2
in repository https://gitbox.apache.org/repos/asf/hbase.git


The following commit(s) were added to refs/heads/branch-2 by this push:
     new 074456e  HBASE-26533 KeyValueScanner might not be properly closed when using InternalScan.checkOnlyMemStore() (#3917)
074456e is described below

commit 074456e190f2db06b656ce3f3c5e02da4d6a3050
Author: RamanChodzka <ww...@gmail.com>
AuthorDate: Sun Dec 5 17:34:30 2021 +0300

    HBASE-26533 KeyValueScanner might not be properly closed when using InternalScan.checkOnlyMemStore() (#3917)
    
    Signed-off-by: Duo Zhang <zh...@apache.org>
---
 .../hadoop/hbase/regionserver/StoreScanner.java    |  1 +
 .../hbase/regionserver/TestStoreScanner.java       | 44 ++++++++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java
index e6495ec..72bd419 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java
@@ -465,6 +465,7 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner
     for (KeyValueScanner kvs : allScanners) {
       boolean isFile = kvs.isFileScanner();
       if ((!isFile && filesOnly) || (isFile && memOnly)) {
+        kvs.close();
         continue;
       }
 
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java
index e7ec300..c7ed4e8 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreScanner.java
@@ -23,6 +23,7 @@ import static org.apache.hadoop.hbase.regionserver.KeyValueScanFixture.scanFixtu
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
@@ -55,6 +56,7 @@ import org.apache.hadoop.hbase.filter.QualifierFilter;
 import org.apache.hadoop.hbase.testclassification.RegionServerTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.CollectionBackedScanner;
 import org.apache.hadoop.hbase.util.EnvironmentEdge;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;
@@ -1026,4 +1028,46 @@ public class TestStoreScanner {
       assertEquals(2, results.size());
     }
   }
+
+  @Test
+  public void testScannersClosedWhenCheckingOnlyMemStore() throws IOException {
+    class MyCollectionBackedScanner extends CollectionBackedScanner {
+      final boolean fileScanner;
+      boolean closed;
+
+      MyCollectionBackedScanner(boolean fileScanner) {
+        super(Collections.emptySortedSet());
+        this.fileScanner = fileScanner;
+      }
+
+      @Override
+      public boolean isFileScanner() {
+        return fileScanner;
+      }
+
+      @Override
+      public void close() {
+        super.close();
+        closed = true;
+      }
+    }
+
+    ScanInfo scanInfo = new ScanInfo(CONF, CF, 0, 1, Long.MAX_VALUE,
+      KeepDeletedCells.FALSE, HConstants.DEFAULT_BLOCKSIZE, 0
+      , CellComparator.getInstance(), false);
+    InternalScan scan = new InternalScan(new Scan());
+    scan.checkOnlyMemStore();
+    MyCollectionBackedScanner fileScanner = new MyCollectionBackedScanner(true);
+    MyCollectionBackedScanner memStoreScanner = new MyCollectionBackedScanner(false);
+    List<? extends KeyValueScanner> allScanners = Arrays.asList(fileScanner, memStoreScanner);
+
+    try (StoreScanner scanner = new StoreScanner(scan, scanInfo, null, allScanners)) {
+      List<KeyValueScanner> remaining = scanner.selectScannersFrom(null, allScanners);
+
+      assertEquals(1, remaining.size());
+      assertSame(memStoreScanner, remaining.get(0));
+      assertTrue(fileScanner.closed);
+      assertFalse(memStoreScanner.closed);
+    }
+  }
 }