HBASE-1823 Ability for Scanners to bypass the block cache

git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@814070 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jonathan Gray 2009-09-11 22:43:33 +00:00
parent e91bb84c8a
commit 69bd17fe1b
4 changed files with 36 additions and 1 deletions

View File

@ -41,6 +41,7 @@ Release 0.21.0 - Unreleased
HBASE-1820 Update jruby from 1.2 to 1.3.1
HBASE-1687 bin/hbase script doesn't allow for different memory settings for
each daemon type
HBASE-1823 Ability for Scanners to bypass the block cache
OPTIMIZATIONS

View File

@ -69,12 +69,16 @@ import org.apache.hadoop.io.WritableFactories;
* {@link #setMaxVersions(int) setMaxVersions}.
* <p>
* To add a filter, execute {@link #setFilter(org.apache.hadoop.hbase.filter.Filter) setFilter}.
* <p>
* Expert: To explicitly disable server-side block caching for this scan,
* execute {@link #setCacheBlocks(boolean)}.
*/
public class Scan implements Writable {
private byte [] startRow = HConstants.EMPTY_START_ROW;
private byte [] stopRow = HConstants.EMPTY_END_ROW;
private int maxVersions = 1;
private int caching = -1;
private boolean cacheBlocks = true;
private Filter filter = null;
private RowFilterInterface oldFilter = null;
private TimeRange tr = new TimeRange();
@ -448,6 +452,29 @@ public class Scan implements Writable {
return filter != null || oldFilter != null;
}
/**
* Set whether blocks should be cached for this Scan.
* <p>
* This is true by default. When true, default settings of the table and
* family are used (this will never override caching blocks if the block
* cache is disabled for that family or entirely).
*
* @param cacheBlocks if false, default settings are overridden and blocks
* will not be cached
*/
public void setCacheBlocks(boolean cacheBlocks) {
this.cacheBlocks = cacheBlocks;
}
/**
* Get whether blocks should be cached for this Scan.
* @return true if default caching should be used, false if blocks should not
* be cached
*/
public boolean getCacheBlocks() {
return cacheBlocks;
}
/**
* @return String
*/
@ -518,6 +545,7 @@ public class Scan implements Writable {
this.stopRow = Bytes.readByteArray(in);
this.maxVersions = in.readInt();
this.caching = in.readInt();
this.cacheBlocks = in.readBoolean();
if(in.readBoolean()) {
this.filter = (Filter)createForName(Bytes.toString(Bytes.readByteArray(in)));
this.filter.readFields(in);
@ -550,6 +578,7 @@ public class Scan implements Writable {
Bytes.writeByteArray(out, this.stopRow);
out.writeInt(this.maxVersions);
out.writeInt(this.caching);
out.writeBoolean(this.cacheBlocks);
if(this.filter == null) {
out.writeBoolean(false);
} else {

View File

@ -43,6 +43,7 @@ class StoreScanner implements KeyValueScanner, InternalScanner, ChangedReadersOb
private Store store;
private ScanQueryMatcher matcher;
private KeyValueHeap heap;
private boolean cacheBlocks;
// Used to indicate that the scanner has closed (see HBASE-1107)
private final AtomicBoolean closing = new AtomicBoolean(false);
@ -52,6 +53,7 @@ class StoreScanner implements KeyValueScanner, InternalScanner, ChangedReadersOb
*/
StoreScanner(Store store, Scan scan, final NavigableSet<byte[]> columns) {
this.store = store;
this.cacheBlocks = scan.getCacheBlocks();
matcher = new ScanQueryMatcher(scan, store.getFamily().getName(),
columns, store.ttl, store.comparator.getRawComparator(),
store.versionsToReturn(scan.getMaxVersions()));
@ -77,6 +79,7 @@ class StoreScanner implements KeyValueScanner, InternalScanner, ChangedReadersOb
*/
StoreScanner(Store store, Scan scan, KeyValueScanner [] scanners) {
this.store = store;
this.cacheBlocks = false;
matcher = new ScanQueryMatcher(scan, store.getFamily().getName(),
null, store.ttl, store.comparator.getRawComparator(),
store.versionsToReturn(scan.getMaxVersions()));
@ -96,6 +99,7 @@ class StoreScanner implements KeyValueScanner, InternalScanner, ChangedReadersOb
final NavigableSet<byte[]> columns,
final KeyValueScanner [] scanners) {
this.store = null;
this.cacheBlocks = scan.getCacheBlocks();
this.matcher = new ScanQueryMatcher(scan, colFamily, columns, ttl,
comparator.getRawComparator(), scan.getMaxVersions());
@ -215,7 +219,7 @@ class StoreScanner implements KeyValueScanner, InternalScanner, ChangedReadersOb
LOG.warn("StoreFile " + sf + " has null Reader");
continue;
}
s.add(r.getScanner());
s.add(r.getScanner(cacheBlocks));
}
List<KeyValueScanner> scanners =
new ArrayList<KeyValueScanner>(s.size()+1);

View File

@ -359,6 +359,7 @@ public class TestSerialization extends HBaseTestCase {
assertTrue(Bytes.equals(scan.getStartRow(), desScan.getStartRow()));
assertTrue(Bytes.equals(scan.getStopRow(), desScan.getStopRow()));
assertEquals(scan.getCacheBlocks(), desScan.getCacheBlocks());
Set<byte[]> set = null;
Set<byte[]> desSet = null;