You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2018/08/16 22:20:14 UTC

[8/8] hbase git commit: HBASE-21047 Object creation of StoreFileScanner thru constructor and close may leave refCount to -1 (Vishal Khandelwal)

HBASE-21047 Object creation of StoreFileScanner thru constructor and close may leave refCount to -1 (Vishal Khandelwal)

Conflicts:
	hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java
	hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java
	hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java


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

Branch: refs/heads/branch-1.3
Commit: efafa4108f75819c27e999a6b9e00fe9a37879ee
Parents: fe55991
Author: Andrew Purtell <ap...@apache.org>
Authored: Thu Aug 16 11:42:15 2018 -0700
Committer: Andrew Purtell <ap...@apache.org>
Committed: Thu Aug 16 12:32:08 2018 -0700

----------------------------------------------------------------------
 .../hadoop/hbase/regionserver/StoreFile.java    | 18 +++++++++-------
 .../hbase/regionserver/StoreFileScanner.java    |  1 +
 .../hbase/regionserver/TestStoreFile.java       | 22 ++++++++++++++++++++
 3 files changed, 34 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/efafa410/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java
index 7a9dbe1..013573d 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java
@@ -1213,14 +1213,18 @@ public class StoreFile {
      * @param isCompaction is scanner being used for compaction?
      * @return a scanner
      */
-    public StoreFileScanner getStoreFileScanner(boolean cacheBlocks,
-                                               boolean pread,
-                                               boolean isCompaction, long readPt) {
-      // Increment the ref count
+    public StoreFileScanner getStoreFileScanner(boolean cacheBlocks, boolean pread,
+        boolean isCompaction, long readPt) {
+      return new StoreFileScanner(this, getScanner(cacheBlocks, pread, isCompaction),
+        !isCompaction, reader.hasMVCCInfo(), readPt);
+    }
+
+    /**
+     * Increment the ref count associated with the reader when ever a scanner associated with the
+     * reader is opened
+     */
+    void incrementRefCount() {
       refCount.incrementAndGet();
-      return new StoreFileScanner(this,
-                                 getScanner(cacheBlocks, pread, isCompaction),
-                                 !isCompaction, reader.hasMVCCInfo(), readPt);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/hbase/blob/efafa410/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java
index 3a50ea9..d94e1d5 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFileScanner.java
@@ -80,6 +80,7 @@ public class StoreFileScanner implements KeyValueScanner {
     this.hfs = hfs;
     this.enforceMVCC = useMVCC;
     this.hasMVCCInfo = hasMVCC;
+    this.reader.incrementRefCount();
   }
 
   boolean isPrimaryReplica() {

http://git-wip-us.apache.org/repos/asf/hbase/blob/efafa410/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java
index da4593b..467f4d4 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestStoreFile.java
@@ -233,6 +233,28 @@ public class TestStoreFile extends HBaseTestCase {
     assertEquals((LAST_CHAR - FIRST_CHAR + 1) * (LAST_CHAR - FIRST_CHAR + 1), count);
   }
 
+  public void testStoreFileReference() throws Exception {
+    Path f = new Path(ROOT_DIR, getName());
+    HFileContext meta = new HFileContextBuilder().withBlockSize(8 * 1024).build();
+    // Make a store file and write data to it.
+    StoreFile.Writer writer = new StoreFile.WriterBuilder(conf, cacheConf, this.fs).withFilePath(f)
+        .withFileContext(meta).build();
+
+    writeStoreFile(writer);
+    writer.close();
+
+    // Creates a reader for StoreFile
+    StoreFile.Reader reader = new StoreFile.Reader(this.fs, f, cacheConf, conf);
+    StoreFileScanner scanner =
+        new StoreFileScanner(reader, mock(HFileScanner.class), false, false, 0);
+
+    // Verify after instantiating scanner refCount is increased
+    assertTrue(scanner.getReader().isReferencedInReads());
+    scanner.close();
+    // Verify after closing scanner refCount is decreased
+    assertFalse(scanner.getReader().isReferencedInReads());
+  }
+
   public void testEmptyStoreFileRestrictKeyRanges() throws Exception {
     StoreFile.Reader reader = mock(StoreFile.Reader.class);
     Store store = mock(Store.class);