[ 
https://issues.apache.org/jira/browse/HBASE-6651?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13458584#comment-13458584
 ] 

Hiroshi Ikeda commented on HBASE-6651:
--------------------------------------

On #2, RoundRobinPool simply gives the next pooled resource for the next 
caller, and after taking a round it gives the pooled resource again, but the 
resource might be yet used. RoundRobinPool has the following code:

{code}
class RoundRobinPool<R> extends CopyOnWriteArrayList<R> implements Pool<R> {
...
@Override
public R get() {
  if (size() < maxSize) {
    return null;
  }
  nextResource %= size();
  R resource = get(nextResource++);
  return resource;
}
{code}

On #3, in general concurrent collections have the advantage of peformance in 
multi-threads because they are not blocked and don't cause context switches, 
which have large overhead. But in other word you cannot use concurrent 
collections to block other threads in order to make critical sections where 
only one thread may run. There are some tips to create unblocking codes with 
using concurrent utilities, but in general it is difficult for complex logics.

On #1, I'm not sure what to say, but ThreadLocal might bind tasks to specific 
threads, which is hard to use and is appropriate only for some restricted cases.
                
> Thread safety of HTablePool is doubtful
> ---------------------------------------
>
>                 Key: HBASE-6651
>                 URL: https://issues.apache.org/jira/browse/HBASE-6651
>             Project: HBase
>          Issue Type: Bug
>          Components: client
>    Affects Versions: 0.94.1
>            Reporter: Hiroshi Ikeda
>            Priority: Minor
>         Attachments: sample.zip
>
>
> There are some operations in HTablePool to access to PoolMap in multiple 
> times without any explict synchronization. 
> For example HTablePool.closeTablePool() calles PoolMap.values(), and calles 
> PoolMap.remove(). If other threads add new instances to the pool in the 
> middle of the calls, the new added instances might be dropped. 
> (HTablePool.closeTablePool() also has another problem that calling it by 
> multple threads causes accessing HTable by multiple threads.)
> Moreover, PoolMap is not thread safe for the same reason.
> For example PoolMap.put() calles ConcurrentMap.get() and calles 
> ConcurrentMap.put(). If other threads add a new instance to the concurent map 
> in the middle of the calls, the new instance might be dropped.
> And also implementations of Pool have the same problems.

--
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

Reply via email to