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