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

Sandy Pratt commented on HBASE-5331:
------------------------------------

Woops, looks like this is already fixed on trunk!  Feel free to close this...
                
> Off by one bug in util.HMerge
> -----------------------------
>
>                 Key: HBASE-5331
>                 URL: https://issues.apache.org/jira/browse/HBASE-5331
>             Project: HBase
>          Issue Type: Bug
>          Components: util
>    Affects Versions: 0.90.1
>         Environment: NA
>            Reporter: Sandy Pratt
>             Fix For: 0.94.0
>
>
> It looks like there's an off by one bug in the OfflineMerger constructor in 
> util.HMerge:
>       InternalScanner rootScanner =
>         root.getScanner(scan);
>       try {
>         List<KeyValue> results = new ArrayList<KeyValue>();
>         while(rootScanner.next(results)) {
>           for(KeyValue kv: results) {
>             HRegionInfo info = Writables.getHRegionInfoOrNull(kv.getValue());
>             if (info != null) {
>               metaRegions.add(info);
>             }
>           }
>         }
>       } finally {
>       ...
>       }
> That call to InternalScanner.next() in the while condition returns true if 
> there's another result *after* the one it just loaded into the out param.  
> That is, after it reads the last row into the 'results' collection, it 
> returns false and the loop exits with that last row unread.  It probably 
> wants to be structured more like this:
> final InternalScanner metaScanner = meta.getScanner(scan); List<KeyValue> 
> results = Lists.newArrayList();
> while (true) {
>       boolean hasMore = metaScanner.next(results);
>       for (KeyValue kv : results) {
>               HRegionInfo hri = Writables.getHRegionInfoOrNull(kv.getValue());
>               if (hri != null) {
>                       regionInfo.add(hri);
>               }
>       }
>                                       
>       if (!hasMore) {
>               break;
>       }
> }
> The loop in util.HMerge is scanning ROOT for META regions.  So this bug will 
> only be hit when there is more than one region of META.  Personally, I don't 
> have any installations with more than one META region, and I'm not sure if 
> anyone does, so this might be a moot point.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to