Author: jgray
Date: Fri Sep 11 22:43:33 2009
New Revision: 814070
URL: http://svn.apache.org/viewvc?rev=814070&view=rev
Log:
HBASE-1823 Ability for Scanners to bypass the block cache
Modified:
hadoop/hbase/trunk/CHANGES.txt
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/Scan.java
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java
hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/TestSerialization.java
Modified: hadoop/hbase/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=814070&r1=814069&r2=814070&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Fri Sep 11 22:43:33 2009
@@ -41,6 +41,7 @@
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
Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/Scan.java
URL:
http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/Scan.java?rev=814070&r1=814069&r2=814070&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/Scan.java
(original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/client/Scan.java Fri
Sep 11 22:43:33 2009
@@ -69,12 +69,16 @@
* {...@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();
@@ -449,6 +453,29 @@
}
/**
+ * 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
*/
@Override
@@ -518,6 +545,7 @@
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 @@
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 {
Modified:
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java
URL:
http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java?rev=814070&r1=814069&r2=814070&view=diff
==============================================================================
---
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java
(original)
+++
hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java
Fri Sep 11 22:43:33 2009
@@ -43,6 +43,7 @@
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 @@
*/
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 @@
*/
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 @@
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 @@
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);
Modified:
hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/TestSerialization.java
URL:
http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/TestSerialization.java?rev=814070&r1=814069&r2=814070&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/TestSerialization.java
(original)
+++ hadoop/hbase/trunk/src/test/org/apache/hadoop/hbase/TestSerialization.java
Fri Sep 11 22:43:33 2009
@@ -359,6 +359,7 @@
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;