[
https://issues.apache.org/jira/browse/HBASE-6968?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13473027#comment-13473027
]
Lars Hofhansl commented on HBASE-6968:
--------------------------------------
Looks like the first two changes are (in one form or the other) in 0.94+
already.
The 0.94 MemStoreFlusher.reclaimMemStoreMemory looks bad, though. We are taking
a lock and are awaiting a condition *inside* a synchronized method... It seems
we can remove the synchronized there. The code inside the method does not need
it and there are no other synchronized methods (or synchronized(this) blocks)
in the class (which is also why it is not noticeably bad, because nothing is
locked out).
> Several HBase write perf improvement
> ------------------------------------
>
> Key: HBASE-6968
> URL: https://issues.apache.org/jira/browse/HBASE-6968
> Project: HBase
> Issue Type: Improvement
> Reporter: Liyin Tang
>
> Here are 2 hbase write performance improvements recently:
> 1) 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.
> In HLog.java:
> orig:
> {code:title=HLog.java}
> newWriter = createWriter(fs, newPath, HBaseConfiguration.create(conf));
> {code}
> new:
> {code}
> newWriter = createWriter(fs, newPath, conf);
> {code}
> 2) Change 2 hotspot synchronized functions into double locking pattern. So it
> shall remove the synchronization overhead in the normal case.
> orig:
> {code:title=HBaseRpcMetrics.java}
> public synchronized void inc(String name, int amt) {
> MetricsTimeVaryingRate m = get(name);
> if (m == null) {
> m = create(name);
> }
> m.inc(amt);
> }
> {code}
> new:
> {code}
> public void inc(String name, int amt) {
> MetricsTimeVaryingRate m = get(name);
> if (m == null) {
> synchronized (this) {
> if ((m = get(name)) == null) {
> m = create(name);
> }
> }
> }
> m.inc(amt);
> }
> {code}
> =====================
> orig:
> {code:title=MemStoreFlusher.java}
> public synchronized void reclaimMemStoreMemory() {
> if (this.server.getGlobalMemstoreSize().get() >= globalMemStoreLimit) {
> flushSomeRegions();
> }
> }
> {code}
> new:
> {code}
> public void reclaimMemStoreMemory() {
> if (this.server.getGlobalMemstoreSize().get() >= globalMemStoreLimit) {
> flushSomeRegions();
> }
> }
> private synchronized void flushSomeRegions() {
> if (this.server.getGlobalMemstoreSize().get() < globalMemStoreLimit) {
> return; // double check the global memstore size inside of the
> synchronized block.
> }
> ...
> }
> {code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira