From 312885db3f68b91c5b2184201ee34f4214f229fc Mon Sep 17 00:00:00 2001 From: Ashu Pachauri Date: Wed, 30 Nov 2016 15:47:59 -0800 Subject: [PATCH] HBASE-17057: Minor compactions should also drop page cache --- .../hbase/regionserver/compactions/Compactor.java | 28 ++++++++++++++++++---- 1 file changed, 23 insertions(+), 5 deletions(-) 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 8c66990..c419372 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 @@ -79,6 +79,15 @@ public abstract class Compactor { /** 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; @@ -89,8 +98,12 @@ public abstract class Compactor { Compression.Algorithm.NONE : this.store.getFamily().getCompactionCompressionType(); 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); } + + protected interface CellSinkFactory { S createWriter(InternalScanner scanner, FileDetails fd, boolean shouldDropBehind) throws IOException; @@ -271,6 +284,13 @@ public abstract class Compactor { List scanners; Collection 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 @@ -282,12 +302,10 @@ public abstract class Compactor { clonedStoreFile.createReader(); readersToClose.add(clonedStoreFile); } - 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; @@ -309,7 +327,7 @@ public abstract class Compactor { 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(fd, scanner, writer, smallestReadPoint, cleanSeqId, throughputController, request.isAllFiles(), request.getFiles().size()); if (!finished) { -- 2.8.0-rc2