Hi Ted, Thanks for your patch. 

I am not familiar with SoftValueSortedMap. 
Please check this function.

  void deleteCachedLocation(final byte [] tableName, final byte [] row) {
      synchronized (this.cachedRegionLocations) {
        SoftValueSortedMap<byte [], HRegionLocation> tableLocations =
            getTableLocations(tableName);
        // start to examine the cache. we can only do cache actions
        // if there's something in the cache for this table.
        if (!tableLocations.isEmpty()) {
          HRegionLocation rl = getCachedLocation(tableName, row);
          if (rl != null) {
            tableLocations.remove(rl.getRegionInfo().getStartKey());
            if (LOG.isDebugEnabled()) {
              LOG.debug("Removed " +
                rl.getRegionInfo().getRegionNameAsString() +
                " for tableName=" + Bytes.toString(tableName) +
                " from cache " + "because of " + Bytes.toStringBinary(row));
            }
          }
        }
      }
    }


-----邮件原件-----
发件人: Ted Yu (JIRA) [mailto:j...@apache.org] 
发送时间: 2011年5月12日 22:44
收件人: Gaojinchao
主题: [jira] [Updated] (HBASE-3878) Hbase client throws NoSuchElementException


     [ 
https://issues.apache.org/jira/browse/HBASE-3878?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Ted Yu updated HBASE-3878:
--------------------------

    Attachment: 3878.patch

Added try/catch block to guard against NoSuchElementException.

We already check possibleRegion not being null.

> Hbase client throws NoSuchElementException
> ------------------------------------------
>
>                 Key: HBASE-3878
>                 URL: https://issues.apache.org/jira/browse/HBASE-3878
>             Project: HBase
>          Issue Type: Bug
>          Components: client
>    Affects Versions: 0.90.2
>            Reporter: gaojinchao
>             Fix For: 0.90.4
>
>         Attachments: 3878.patch
>
>
> Soft reference objects, which are cleared at the discretion of the 
> garbage collector in response to memory demand. 
> I used ycsb to put data and threw exception.
> >>>> 
> >>>>  Hbase Code:
> >>>>     // 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 =
> >>>>         matchingRegions.get(matchingRegions.lastKey());
> >>>> 
> >>>>   ycsb client log:
> >>>> 
> >>>>   [java] begin StatusThread run
> >>>>    [java] java.util.NoSuchElementException
> >>>>    [java]     at java.util.TreeMap.key(TreeMap.java:1206)
> >>>>    [java]     at
> >> java.util.TreeMap$NavigableSubMap.lastKey(TreeMap.java:1435)
> >>>>    [java]     at
> >> org.apache.hadoop.hbase.util.SoftValueSortedMap.lastKey(SoftValueSort
> >> edMap.java:131)
> >>>>    [java]     at
> >> org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplemen
> >> tation.getCachedLocation(HConnectionManager.java:841)
> >>>>    [java]     at
> >> org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplemen
> >> tation.locateRegionInMeta(HConnectionManager.java:664)
> >>>>    [java]     at
> >> org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplemen
> >> tation.locateRegion(HConnectionManager.java:590)
> >>>>    [java]     at
> >> org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplemen
> >> tation.processBatch(HConnectionManager.java:1114)
> >>>>    [java]     at
> >> org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplemen
> >> tation.processBatchOfPuts(HConnectionManager.java:1234)
> >>>>    [java]     at
> >> org.apache.hadoop.hbase.client.HTable.flushCommits(HTable.java:819)
> >>>>    [java]     at
> >> org.apache.hadoop.hbase.client.HTable.doPut(HTable.java:675)
> >>>>    [java]     at
> >> org.apache.hadoop.hbase.client.HTable.put(HTable.java:665)
> >>>>    [java]     at com.yahoo.ycsb.db.HBaseClient.update(Unknown Source)
> >>>>    [java]     at com.yahoo.ycsb.db.HBaseClient.insert(Unknown Source)
> >>>>    [java]     at com.yahoo.ycsb.DBWrapper.insert(Unknown Source)
> >>>>    [java]     at com.yahoo.ycsb.workloads.MyWorkload.doInsert(Unknown
> >> Source)
> >>>>    [java]     at com.yahoo.ycsb.ClientThread.run(Unknown Source)

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to