From 69bd17fe1b79fe96f9d954b603d6ac4d26a7d1e9 Mon Sep 17 00:00:00 2001 From: Jonathan Gray Date: Fri, 11 Sep 2009 22:43:33 +0000 Subject: [PATCH] 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 --- CHANGES.txt | 1 + .../org/apache/hadoop/hbase/client/Scan.java | 29 +++++++++++++++++++ .../hbase/regionserver/StoreScanner.java | 6 +++- .../hadoop/hbase/TestSerialization.java | 1 + 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/CHANGES.txt b/CHANGES.txt index 50095ae2ba9..7afd596cde5 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -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 diff --git a/src/java/org/apache/hadoop/hbase/client/Scan.java b/src/java/org/apache/hadoop/hbase/client/Scan.java index f264e857a2a..3fb3e820d4e 100644 --- a/src/java/org/apache/hadoop/hbase/client/Scan.java +++ b/src/java/org/apache/hadoop/hbase/client/Scan.java @@ -69,12 +69,16 @@ import org.apache.hadoop.io.WritableFactories; * {@link #setMaxVersions(int) setMaxVersions}. *

* To add a filter, execute {@link #setFilter(org.apache.hadoop.hbase.filter.Filter) setFilter}. + *

+ * 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. + *

+ * 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 { diff --git a/src/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java b/src/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java index e9a32bc1842..b3ea47c30f7 100644 --- a/src/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java +++ b/src/java/org/apache/hadoop/hbase/regionserver/StoreScanner.java @@ -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 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 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 scanners = new ArrayList(s.size()+1); diff --git a/src/test/org/apache/hadoop/hbase/TestSerialization.java b/src/test/org/apache/hadoop/hbase/TestSerialization.java index 00b1f67a939..a32263ff604 100644 --- a/src/test/org/apache/hadoop/hbase/TestSerialization.java +++ b/src/test/org/apache/hadoop/hbase/TestSerialization.java @@ -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 set = null; Set desSet = null;