Repository: hbase
Updated Branches:
  refs/heads/branch-1 b0780bdc6 -> 4b8195f22


HBASE-17057 Minor compactions should also drop page cache (Ashu Pachauri)

Signed-off-by: Gary Helmling <ga...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/4b8195f2
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/4b8195f2
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/4b8195f2

Branch: refs/heads/branch-1
Commit: 4b8195f22c1adf414d96f7e9f819c95ea6333479
Parents: b0780bd
Author: Ashu Pachauri <ashu210...@gmail.com>
Authored: Wed Nov 30 15:47:59 2016 -0800
Committer: Gary Helmling <ga...@apache.org>
Committed: Fri Feb 24 15:31:36 2017 -0800

----------------------------------------------------------------------
 .../src/main/resources/hbase-default.xml        | 18 ++++++++++++++
 .../regionserver/compactions/Compactor.java     | 26 ++++++++++++++++----
 2 files changed, 39 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/4b8195f2/hbase-common/src/main/resources/hbase-default.xml
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/resources/hbase-default.xml 
b/hbase-common/src/main/resources/hbase-default.xml
index 147e243..7cd0015 100644
--- a/hbase-common/src/main/resources/hbase-default.xml
+++ b/hbase-common/src/main/resources/hbase-default.xml
@@ -753,6 +753,24 @@ possible configurations would overwhelm and obscure the 
important.
     </description>
   </property>
   <property>
+    <name>hbase.regionserver.majorcompaction.pagecache.drop</name>
+    <value>true</value>
+    <description>Specifies whether to drop pages read/written into the system 
page cache by
+      major compactions. Setting it to true helps prevent major compactions 
from
+      polluting the page cache, which is almost always required, especially 
for clusters
+      with low/moderate memory to storage ratio.</description>
+  </property>
+  <property>
+    <name>hbase.regionserver.minorcompaction.pagecache.drop</name>
+    <value>true</value>
+    <description>Specifies whether to drop pages read/written into the system 
page cache by
+      minor compactions. Setting it to true helps prevent minor compactions 
from
+      polluting the page cache, which is most beneficial on clusters with low
+      memory to storage ratio or very write heavy clusters. You may want to 
set it to
+      false under moderate to low write workload when bulk of the reads are
+      on the most recently written data.</description>
+  </property>
+  <property>
     <name>hbase.storescanner.parallel.seek.enable</name>
     <value>false</value>
     <description>

http://git-wip-us.apache.org/repos/asf/hbase/blob/4b8195f2/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/Compactor.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/Compactor.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/Compactor.java
index d1ab800..af8ffe8 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/Compactor.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/Compactor.java
@@ -77,6 +77,15 @@ public abstract class Compactor<T extends CellSink> {
   /** specify how many days to keep MVCC values during major compaction **/ 
   protected int keepSeqIdPeriod;
 
+  // Configs that drive whether we drop page cache behind compactions
+  protected static final String  MAJOR_COMPACTION_DROP_CACHE =
+      "hbase.regionserver.majorcompaction.pagecache.drop";
+  protected static final String MINOR_COMPACTION_DROP_CACHE =
+      "hbase.regionserver.minorcompaction.pagecache.drop";
+
+  private boolean dropCacheMajor;
+  private boolean dropCacheMinor;
+
   //TODO: depending on Store is not good but, realistically, all compactors 
currently do.
   Compactor(final Configuration conf, final Store store) {
     this.conf = conf;
@@ -87,6 +96,8 @@ public abstract class Compactor<T extends CellSink> {
         Compression.Algorithm.NONE : 
this.store.getFamily().getCompactionCompression();
     this.keepSeqIdPeriod = 
Math.max(this.conf.getInt(HConstants.KEEP_SEQID_PERIOD, 
       HConstants.MIN_KEEP_SEQID_PERIOD), HConstants.MIN_KEEP_SEQID_PERIOD);
+    this.dropCacheMajor = conf.getBoolean(MAJOR_COMPACTION_DROP_CACHE, true);
+    this.dropCacheMinor = conf.getBoolean(MINOR_COMPACTION_DROP_CACHE, true);
   }
 
   public interface CellSink {
@@ -267,6 +278,13 @@ public abstract class Compactor<T extends CellSink> {
     List<StoreFileScanner> scanners;
     Collection<StoreFile> readersToClose;
     T writer = null;
+    boolean dropCache;
+    if (request.isMajor() || request.isAllFiles()) {
+      dropCache = this.dropCacheMajor;
+    } else {
+      dropCache = this.dropCacheMinor;
+    }
+
     if (this.conf.getBoolean("hbase.regionserver.compaction.private.readers", 
true)) {
       // clone all StoreFiles, so we'll do the compaction on a independent 
copy of StoreFiles,
       // HFiles, and their readers
@@ -274,12 +292,10 @@ public abstract class Compactor<T extends CellSink> {
       for (StoreFile f : request.getFiles()) {
         readersToClose.add(f.cloneForReader());
       }
-      scanners = createFileScanners(readersToClose, smallestReadPoint,
-        store.throttleCompaction(request.getSize()));
+      scanners = createFileScanners(readersToClose, smallestReadPoint, 
dropCache);
     } else {
       readersToClose = Collections.emptyList();
-      scanners = createFileScanners(request.getFiles(), smallestReadPoint,
-        store.throttleCompaction(request.getSize()));
+      scanners = createFileScanners(request.getFiles(), smallestReadPoint, 
dropCache);
     }
     InternalScanner scanner = null;
     boolean finished = false;
@@ -301,7 +317,7 @@ public abstract class Compactor<T extends CellSink> {
         smallestReadPoint = Math.min(fd.minSeqIdToKeep, smallestReadPoint);
         cleanSeqId = true;
       }
-      writer = sinkFactory.createWriter(scanner, fd, 
store.throttleCompaction(request.getSize()));
+      writer = sinkFactory.createWriter(scanner, fd, dropCache);
       finished =
           performCompaction(scanner, writer, smallestReadPoint, cleanSeqId, 
throughputController);
       if (!finished) {

Reply via email to