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 <[email protected]>
Authored: Thu Aug 16 11:42:15 2018 -0700
Committer: Andrew Purtell <[email protected]>
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);