diff --git a/CHANGES.txt b/CHANGES.txt index e53da0c9111..6144d9ea688 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -151,6 +151,8 @@ Release 0.21.0 - Unreleased HBASE-1943 Remove AgileJSON; unused HBASE-1944 Add a "deferred log flush" attribute to HTD HBASE-1945 Remove META and ROOT memcache size bandaid + HBASE-1947 If HBase starts/stops often in less than 24 hours, + you end up with lots of store files OPTIMIZATIONS HBASE-410 [testing] Speed up the test suite diff --git a/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 1bb88bc65b7..cbb1da2a8b8 100644 --- a/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -2501,6 +2501,20 @@ public class HRegion implements HConstants, HeapSize { // , Writable{ return old; } + /** + * Checks every store to see if one has too many + * store files + * @return true if any store has too many store files + */ + public boolean hasTooManyStoreFiles() { + for(Store store : stores.values()) { + if(store.hasTooManyStoreFiles()) { + return true; + } + } + return false; + } + /** * Facility for dumping and compacting catalog tables. * Only does catalog tables since these are only tables we for sure know diff --git a/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java b/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index 10fcbbf51ae..fc9da0e46b2 100644 --- a/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ b/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -1428,10 +1428,12 @@ public class HRegionServer implements HConstants, HRegionInterface, if (region == null) { try { region = instantiateRegion(regionInfo); - // Startup a compaction early if one is needed, if region has references. - if (region.hasReferences()) { + // Startup a compaction early if one is needed, if region has references + // or if a store has too many store files + if (region.hasReferences() || region.hasTooManyStoreFiles()) { this.compactSplitThread.compactionRequested(region, - "Region has references on open"); + region.hasReferences() ? "Region has references on open" : + "Region has too many store files"); } } catch (Throwable e) { Throwable t = cleanup(e, diff --git a/src/java/org/apache/hadoop/hbase/regionserver/Store.java b/src/java/org/apache/hadoop/hbase/regionserver/Store.java index 11b8d989b7d..117e7dd065f 100644 --- a/src/java/org/apache/hadoop/hbase/regionserver/Store.java +++ b/src/java/org/apache/hadoop/hbase/regionserver/Store.java @@ -1501,6 +1501,15 @@ public class Store implements HConstants, HeapSize { this.lock.readLock().unlock(); } } + + /** + * See if there's too much store files in this store + * @return true if number of store files is greater than + * the number defined in compactionThreshold + */ + public boolean hasTooManyStoreFiles() { + return this.storefiles.size() > this.compactionThreshold; + } public static final long FIXED_OVERHEAD = ClassSize.align( ClassSize.OBJECT + (17 * ClassSize.REFERENCE) +