HBASE-26533 KeyValueScanner might not be properly closed when using InternalScan.checkOnlyMemStore() (#3917)
Signed-off-by: Duo Zhang <zhangduo@apache.org>
This commit is contained in:
parent
b5b286d793
commit
554580f966
|
@ -464,6 +464,7 @@ public class StoreScanner extends NonReversedNonLazyKeyValueScanner
|
||||||
for (KeyValueScanner kvs : allScanners) {
|
for (KeyValueScanner kvs : allScanners) {
|
||||||
boolean isFile = kvs.isFileScanner();
|
boolean isFile = kvs.isFileScanner();
|
||||||
if ((!isFile && filesOnly) || (isFile && memOnly)) {
|
if ((!isFile && filesOnly) || (isFile && memOnly)) {
|
||||||
|
kvs.close();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@ import static org.apache.hadoop.hbase.regionserver.KeyValueScanFixture.scanFixtu
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNull;
|
import static org.junit.Assert.assertNull;
|
||||||
|
import static org.junit.Assert.assertSame;
|
||||||
import static org.junit.Assert.assertTrue;
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -56,6 +57,7 @@ import org.apache.hadoop.hbase.filter.QualifierFilter;
|
||||||
import org.apache.hadoop.hbase.testclassification.RegionServerTests;
|
import org.apache.hadoop.hbase.testclassification.RegionServerTests;
|
||||||
import org.apache.hadoop.hbase.testclassification.SmallTests;
|
import org.apache.hadoop.hbase.testclassification.SmallTests;
|
||||||
import org.apache.hadoop.hbase.util.Bytes;
|
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.EnvironmentEdge;
|
||||||
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
|
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
|
||||||
import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;
|
import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;
|
||||||
|
@ -1080,4 +1082,46 @@ public class TestStoreScanner {
|
||||||
assertEquals(2, results.size());
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue