You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2010/04/15 06:10:33 UTC

svn commit: r934283 - in /hadoop/hbase/branches/0.20_pre_durability: CHANGES.txt conf/hbase-default.xml src/java/org/apache/hadoop/hbase/regionserver/HRegion.java

Author: stack
Date: Thu Apr 15 04:10:32 2010
New Revision: 934283

URL: http://svn.apache.org/viewvc?rev=934283&view=rev
Log:
HBASE-1892 [performance] make hbase splits run faster

Modified:
    hadoop/hbase/branches/0.20_pre_durability/CHANGES.txt
    hadoop/hbase/branches/0.20_pre_durability/conf/hbase-default.xml
    hadoop/hbase/branches/0.20_pre_durability/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java

Modified: hadoop/hbase/branches/0.20_pre_durability/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20_pre_durability/CHANGES.txt?rev=934283&r1=934282&r2=934283&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20_pre_durability/CHANGES.txt (original)
+++ hadoop/hbase/branches/0.20_pre_durability/CHANGES.txt Thu Apr 15 04:10:32 2010
@@ -75,6 +75,7 @@ Release 0.20.4 - Unreleased
    HBASE-2412  [stargate] PerformanceEvaluation
    HBASE-2440  Master UI should check against known bad JDK versions and warn
                the use (Todd Lipcon via Stack)
+   HBASE-1892  [performance] make hbase splits run faster
 
   NEW FEATURES
    HBASE-2257  [stargate] multiuser mode

Modified: hadoop/hbase/branches/0.20_pre_durability/conf/hbase-default.xml
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20_pre_durability/conf/hbase-default.xml?rev=934283&r1=934282&r2=934283&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20_pre_durability/conf/hbase-default.xml (original)
+++ hadoop/hbase/branches/0.20_pre_durability/conf/hbase-default.xml Thu Apr 15 04:10:32 2010
@@ -293,6 +293,21 @@
     </description>
   </property>
   <property>
+    <name>hbase.hregion.preclose.flush.size</name>
+    <value>5242880</value>
+    <description>
+      If the memstores in a region are this size or larger when we go
+      to close, run a "pre-flush" to clear out memstores before we put up
+      the region closed flag and take the region offline.  On close,
+      a flush is run under the close flag up to empty memory.  During
+      this time the region is offline and we are not taking on any writes.
+      If the memstore content large, this flush could take a long time to
+      complete.  The preflush is meant to clean out the bulk of the memstore
+      before putting up the close flag and taking the region offline so the
+      flush that runs under the close flag has little to do.
+    </description>
+  </property>
+  <property>
     <name>hbase.hregion.memstore.block.multiplier</name>
     <value>2</value>
     <description>

Modified: hadoop/hbase/branches/0.20_pre_durability/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20_pre_durability/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=934283&r1=934282&r2=934283&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20_pre_durability/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hadoop/hbase/branches/0.20_pre_durability/src/java/org/apache/hadoop/hbase/regionserver/HRegion.java Thu Apr 15 04:10:32 2010
@@ -475,13 +475,14 @@ public class HRegion implements HConstan
       LOG.warn("region " + this + " already closed");
       return null;
     }
-    this.closing.set(true);
     synchronized (splitLock) {
+      boolean wasFlushing = false;
       synchronized (writestate) {
         // Disable compacting and flushing by background threads for this
         // region.
         writestate.writesEnabled = false;
-        LOG.debug("Closing " + this + ": compactions & flushes disabled ");
+        wasFlushing = writestate.flushing;
+        LOG.debug("Closing " + this + ": disabling compactions & flushes");
         while (writestate.compacting || writestate.flushing) {
           LOG.debug("waiting for" +
               (writestate.compacting ? " compaction" : "") +
@@ -495,7 +496,15 @@ public class HRegion implements HConstan
           }
         }
       }
+      // If we were not just flushing, is it worth doing a preflush...one
+      // that will clear out of the bulk of the memstore before we put up
+      // the close flag?
+      if (!abort && !wasFlushing && worthPreFlushing()) {
+        LOG.info("Running close preflush of " + this.getRegionNameAsString());
+        internalFlushcache();
+      }
       newScannerLock.writeLock().lock();
+      this.closing.set(true);
       try {
         splitsAndClosesLock.writeLock().lock();
         LOG.debug("Updates disabled for region, no outstanding scanners on " +
@@ -528,6 +537,14 @@ public class HRegion implements HConstan
     }
   }
 
+   /**
+    * @return True if its worth doing a flush before we put up the close flag.
+    */
+  private boolean worthPreFlushing() {
+    return this.memstoreSize.get() >
+      this.conf.getLong("hbase.hregion.preclose.flush.size", 1024 * 1024 * 5);
+  }
+
   //////////////////////////////////////////////////////////////////////////////
   // HRegion accessors
   //////////////////////////////////////////////////////////////////////////////