Index: src/java/org/apache/hadoop/hbase/regionserver/MemcacheFlusher.java =================================================================== --- src/java/org/apache/hadoop/hbase/regionserver/MemcacheFlusher.java (revision 764255) +++ src/java/org/apache/hadoop/hbase/regionserver/MemcacheFlusher.java (working copy) @@ -68,7 +68,8 @@ "hbase.regionserver.globalMemcache.upperLimit"; public static final String LOWER_KEY = "hbase.regionserver.globalMemcache.lowerLimit"; - + private final long blockingStoreFilesNumber; + /** * @param conf * @param server @@ -89,6 +90,8 @@ "because supplied " + LOWER_KEY + " was > " + UPPER_KEY); } this.globalMemcacheLimitLowMark = lower; + this.blockingStoreFilesNumber = + conf.getInt("hbase.hstore.compactionThreshold", 3); LOG.info("globalMemcacheLimit=" + StringUtils.humanReadableInt(this.globalMemcacheLimit) + ", globalMemcacheLimitLowMark=" + @@ -223,6 +226,23 @@ lock.lock(); } try { + // Wait until it is safe to flush + for (Store hstore: region.stores.values()) { + boolean triggered = false; + while(hstore.getStorefilesCount() > this.blockingStoreFilesNumber) { + try { + LOG.debug("Waiting 500ms for number of store files to get smaller, "+ + " currently it is " + hstore.getStorefilesCount()); + if (!triggered) { + server.compactSplitThread.compactionRequested(region, getName()); + triggered = true; + } + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } // See comment above for removeFromQueue on why we do not // compact if removeFromQueue is true. Note that region.flushCache() // only returns true if a flush is done and if a compaction is needed.