Add Thread-Local Behavior To HTable Pool
----------------------------------------

                 Key: HBASE-2938
                 URL: https://issues.apache.org/jira/browse/HBASE-2938
             Project: HBase
          Issue Type: Improvement
          Components: client
    Affects Versions: 0.89.20100621
            Reporter: Karthick Sankarachary
         Attachments: HBASE-2938.patch

  It is a well-documented fact that the HBase table client (viz., HTable) is 
not thread-safe. Hence, the recommendation has been to use a HTablePool or a 
ThreadLocal to manage access to tables. The downside of the latter is that it 
(a) requires the user to reinvent the wheel in terms of mapping table names to 
tables and (b) forces the user to maintain the thread-local objects. Ideally, 
it would be nice if we could make the HTablePool handle thread-local objects as 
well. That way, it not only becomes the "one stop shop" for all client-side 
tables, but also insulates the user from the ThreadLocal object.
  
  Here, we propose a way to generalize the HTablePool so that the underlying 
pool type is either "reusable" or "thread-local". To make this possible, we 
introdudce the concept of a SharedMap, which essentially, maps a key to a 
collection of values, the elements of which are managed by a pool. In effect, 
that collection acts as a shared pool of resources, access to which is closely 
controlled as dictated by the particular semantics of the pool.

 Furthermore, to simplify the construction of HTablePools, we added a couple of 
parameters (viz. "hbase.client.htable.pool.type" and 
"hbase.client.hbase.pool.size") to control the default behavior of a HTablePool.
  
  In case the size of the pool is set to a non-zero positive number, that is 
used to cap the number of resources that a pool may contain for any given key. 
A size of Integer#MAX_VALUE is interpreted to mean an unbounded pool.
   
   Currently, the SharedMap supports the following types of pools:
   * A ThreadLocalPool, which represents a pool that builds on the ThreadLocal 
class. It essentially binds the resource to the thread from which it is 
accessed.
   * A ReusablePool, which represents a pool that builds on the LinkedList 
class. It essentially allows resources to be checked out, at which point it is 
(temporarily) removed from the pool. When the resource is no longer required, 
it should be returned to the pool in order to be reused.
   * A RoundRobinPool, which represents a pool that stores its resources in an 
ArrayList. It load-balances access to its resources by returning a different 
resource every time a given key is looked up.
  

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to