[
https://issues.apache.org/jira/browse/HBASE-7295?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13526052#comment-13526052
]
Varun Sharma commented on HBASE-7295:
-------------------------------------
I dont know if we can use putIfAbsent() without doing a createPool since thats
the value we would want to put. Also I thought that get() and put() combination
would do worse than putIfAbsent() in ConcurrentHashMap and would also be less
atomic.
We can fix the bug by making the "put" synchronized so that it updates size and
adds at the same time. The get() operation would still not be synchronized and
we probably wouldn't want to synchronize that since we will hit that much more
often. The put() will be hit only when we create connections initially or
recreate connections.
> Contention in HBaseClient.getConnection
> ---------------------------------------
>
> Key: HBASE-7295
> URL: https://issues.apache.org/jira/browse/HBASE-7295
> Project: HBase
> Issue Type: Improvement
> Affects Versions: 0.94.3
> Reporter: Varun Sharma
> Assignee: Varun Sharma
> Fix For: 0.94.3
>
> Attachments: 7295-0.94.txt
>
>
> HBaseClient.getConnection() synchronizes on the connections object. We found
> severe contention on a thrift gateway which was fanning out roughly 3000+
> calls per second to hbase region servers. The thrift gateway had 2000+
> threads for handling incoming connections. Threads were blocked on the
> syncrhonized block - we set ipc.pool.size to 200. Since we are using
> RoundRobin/ThreadLocal pool only - its not necessary to synchronize on
> connections - it might lead to cases where we might go slightly over the
> ipc.max.pool.size() but the additional connections would timeout after
> maxIdleTime - underlying PoolMap connections object is thread safe.
--
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