You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mb...@apache.org on 2012/10/10 14:51:27 UTC

svn commit: r1396576 - in /hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase: ipc/HBaseRpcMetrics.java regionserver/MemStoreFlusher.java regionserver/wal/HLog.java

Author: mbautin
Date: Wed Oct 10 12:51:26 2012
New Revision: 1396576

URL: http://svn.apache.org/viewvc?rev=1396576&view=rev
Log:
[HBASE-6968] HBase write perf improvement I

Author: liyintang

Summary:
There are two improvements in this diff:
1) Change 2 hotspot synchronized functions into double locking pattern. So it shall remove the synchronization overhead in the normal case.

2) Avoid creating HBaseConfiguraiton object for each HLog. Every time when creating a HBaseConfiguraiton object, it would parse the xml configuration files from disk, which is not cheap operation.

Test Plan: will run all the unit tests

Reviewers: kannan, kranganathan

Reviewed By: kannan

CC: hbase-eng@

Differential Revision: https://phabricator.fb.com/D594979

Modified:
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/ipc/HBaseRpcMetrics.java
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java
    hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/ipc/HBaseRpcMetrics.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/ipc/HBaseRpcMetrics.java?rev=1396576&r1=1396575&r2=1396576&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/ipc/HBaseRpcMetrics.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/ipc/HBaseRpcMetrics.java Wed Oct 10 12:51:26 2012
@@ -81,10 +81,14 @@ public class HBaseRpcMetrics implements 
     return new MetricsTimeVaryingRate(key, this.registry);
   }
 
-  public synchronized void inc(String name, int amt) {
+  public void inc(String name, int amt) {
     MetricsTimeVaryingRate m = get(name);
     if (m == null) {
-      m = create(name);
+      synchronized (this) {
+        if ((m = get(name)) == null) {
+          m = create(name);
+        }
+      }
     }
     m.inc(amt);
   }

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java?rev=1396576&r1=1396575&r2=1396576&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java Wed Oct 10 12:51:26 2012
@@ -287,8 +287,8 @@ class MemStoreFlusher extends HasThread 
    * to the lower limit. This method blocks callers until we're down to a safe
    * amount of memstore consumption.
    */
-  public synchronized void reclaimMemStoreMemory() {
-    if ( this.server.getGlobalMemstoreSize().get() >= globalMemStoreLimit) {
+  public void reclaimMemStoreMemory() {
+    if (this.server.getGlobalMemstoreSize().get() >= globalMemStoreLimit) {
       flushSomeRegions();
     }
   }
@@ -297,6 +297,10 @@ class MemStoreFlusher extends HasThread 
    * Emergency!  Need to flush memory.
    */
   private synchronized void flushSomeRegions() {
+    if (this.server.getGlobalMemstoreSize().get() < globalMemStoreLimit) {
+      return; // double check the global memstore size inside of the synchronized block.
+    }
+    
     // keep flushing until we hit the low water mark
     long globalMemStoreSize = -1;
     ArrayList<HRegion> regionsToCompact = new ArrayList<HRegion>();

Modified: hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java?rev=1396576&r1=1396575&r2=1396576&view=diff
==============================================================================
--- hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java (original)
+++ hbase/branches/0.89-fb/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java Wed Oct 10 12:51:26 2012
@@ -516,7 +516,7 @@ public class HLog implements Syncable {
       int newFileReplication;
       OutputStream newOutStream = null;
       try {
-        newWriter = createWriter(fs, newPath, HBaseConfiguration.create(conf));
+        newWriter = createWriter(fs, newPath, conf);
         newFileReplication = fs.getFileStatus(newPath).getReplication();
         if (newWriter instanceof SequenceFileLogWriter) {
           newOutStream = ((SequenceFileLogWriter) newWriter)