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)