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 <apurt...@apache.org> Authored: Thu Aug 16 11:42:15 2018 -0700 Committer: Andrew Purtell <apurt...@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);