Sorry, something important I missed in my last email.
SoftValueSortedMap uses TreeMap. It has some synchronized methods to edit the 
data from this map. If we use these methods, it’s ok. But in 
HConnectionManager#getCachedLocation:

      // Cut the cache so that we only get the part that could contain
      // regions that match our key
      SoftValueSortedMap<byte[], HRegionLocation> matchingRegions =
        tableLocations.headMap(row);

      // if that portion of the map is empty, then we're done. otherwise,
      // we need to examine the cached location to verify that it is
      // a match by end key as well.
      if (!matchingRegions.isEmpty()) {
        HRegionLocation possibleRegion = null;
        try {
          possibleRegion = matchingRegions.get(matchingRegions.lastKey());
        } catch (NoSuchElementException nsee) {
          LOG.warn("checkReferences() might have removed the key", nsee);
        }
SoftValueSortedMap#get:
  public synchronized V get(Object key) {

      checkReferences();
    SoftValue<K,V> value = this.internalMap.get(key);
    if (value == null) {
      return null;
    }
    if (value.get() == null) {
      this.internalMap.remove(key);
      return null;
    }
    return value.get();
  }

In this method, it can remove the element from internalMap which is a heapMap 
from the backed TreeMap. A concurrency issue may happen from here.
Correct me if am wrong.
Thank you.

Jieshan.

发件人: bijieshan
发送时间: 2011年12月21日 18:48
收件人: [email protected]; [email protected]
抄送: wenzaohua; Chenjian
主题: A concurrency issue on SoftValueSortedMap?

Hi all,

We use thousand of threads doing the scan operations. One thread got blocked at 
the position of “java.util.TreeMap.fixAfterDeletion”. It can’t come out of the 
loop of “TreeMap.fixAfterDeletion”:

So I think it maybe a concurrency issue. Has someone encountered this?
Thank you.

Jieshan.

Here’s the thread dump:

"Thread-923" prio=10 tid=0x00007f3d40553000 nid=0x3ed6 runnable 
[0x00007f3d05c1b000]
   java.lang.Thread.State: RUNNABLE
                at java.util.TreeMap.fixAfterDeletion(TreeMap.java:2176)
                at java.util.TreeMap.deleteEntry(TreeMap.java:2151)
                at java.util.TreeMap.remove(TreeMap.java:585)
                at java.util.TreeMap$NavigableSubMap.remove(TreeMap.java:1395)
                at 
org.apache.hadoop.hbase.util.SoftValueSortedMap.get(SoftValueSortedMap.java:101)
                - locked <0x00007f3d92937748> (a 
org.apache.hadoop.hbase.util.SoftValueSortedMap)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getCachedLocation(HConnectionManager.java:846)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegionInMeta(HConnectionManager.java:668)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:594)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:559)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionLocation(HConnectionManager.java:416)
                at 
org.apache.hadoop.hbase.client.ServerCallable.instantiateServer(ServerCallable.java:57)
                at 
org.apache.hadoop.hbase.client.ScannerCallable.instantiateServer(ScannerCallable.java:63)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1018)
                at 
org.apache.hadoop.hbase.client.HTable$ClientScanner.nextScanner(HTable.java:1104)
                at 
org.apache.hadoop.hbase.client.HTable$ClientScanner.initialize(HTable.java:1027)
                at 
org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:535)
                at 
com.huawei.icbc.query.SingleTabQuery.querybatch(SingleTabQuery.java:197)
                at 
com.huawei.icbc.benchmark.SingleTabQueryAction.query(SingleTabQueryAction.java:181)
                at framework.QueryThread.run(QueryThread.java:47)

"Thread-923" prio=10 tid=0x00007f3d40553000 nid=0x3ed6 runnable 
[0x00007f3d05c1a000]
   java.lang.Thread.State: RUNNABLE
                at java.util.TreeMap.fixAfterDeletion(TreeMap.java:2193)
                at java.util.TreeMap.deleteEntry(TreeMap.java:2151)
                at java.util.TreeMap.remove(TreeMap.java:585)
                at java.util.TreeMap$NavigableSubMap.remove(TreeMap.java:1395)
                at 
org.apache.hadoop.hbase.util.SoftValueSortedMap.get(SoftValueSortedMap.java:101)
                - locked <0x00007f3d94f24f70> (a 
org.apache.hadoop.hbase.util.SoftValueSortedMap)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getCachedLocation(HConnectionManager.java:846)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegionInMeta(HConnectionManager.java:668)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:594)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.locateRegion(HConnectionManager.java:559)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionLocation(HConnectionManager.java:416)
                at 
org.apache.hadoop.hbase.client.ServerCallable.instantiateServer(ServerCallable.java:57)
                at 
org.apache.hadoop.hbase.client.ScannerCallable.instantiateServer(ScannerCallable.java:63)
                at 
org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1018)
                at 
org.apache.hadoop.hbase.client.HTable$ClientScanner.nextScanner(HTable.java:1104)
                at 
org.apache.hadoop.hbase.client.HTable$ClientScanner.initialize(HTable.java:1027)
                at 
org.apache.hadoop.hbase.client.HTable.getScanner(HTable.java:535)
                at 
com.huawei.icbc.query.SingleTabQuery.querybatch(SingleTabQuery.java:197)
                at 
com.huawei.icbc.benchmark.SingleTabQueryAction.query(SingleTabQueryAction.java:181)
                at framework.QueryThread.run(QueryThread.java:47)


Reply via email to