HBASE-716 TestGet2.testGetClosestBefore fails with hadoop-0.17.1

git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@672456 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jim Kellerman 2008-06-28 02:32:28 +00:00
parent acac3a8a95
commit 1901b25365
2 changed files with 62 additions and 42 deletions

View File

@ -72,6 +72,7 @@ Hbase Change Log
before rather than after its parent in .META. before rather than after its parent in .META.
HBASE-714 Showing bytes in log when should be string (2) HBASE-714 Showing bytes in log when should be string (2)
HBASE-627 Disable table doesn't work reliably HBASE-627 Disable table doesn't work reliably
HBASE-716 TestGet2.testGetClosestBefore fails with hadoop-0.17.1
IMPROVEMENTS IMPROVEMENTS

View File

@ -1544,7 +1544,6 @@ public class HStore implements HConstants {
private void rowAtOrBeforeFromMapFile(MapFile.Reader map, final byte [] row, private void rowAtOrBeforeFromMapFile(MapFile.Reader map, final byte [] row,
SortedMap<HStoreKey, Long> candidateKeys) SortedMap<HStoreKey, Long> candidateKeys)
throws IOException { throws IOException {
HStoreKey searchKey = null;
ImmutableBytesWritable readval = new ImmutableBytesWritable(); ImmutableBytesWritable readval = new ImmutableBytesWritable();
HStoreKey readkey = new HStoreKey(); HStoreKey readkey = new HStoreKey();
@ -1585,52 +1584,72 @@ public class HStore implements HConstants {
return; return;
} }
// seek to the exact row, or the one that would be immediately before it HStoreKey deletedOrExpiredRow = null;
readkey = (HStoreKey)map.getClosest(searchKey, readval, true); boolean foundCandidate = false;
while (!foundCandidate) {
if (readkey == null) { // seek to the exact row, or the one that would be immediately before it
// didn't find anything that would match, so return readkey = (HStoreKey)map.getClosest(searchKey, readval, true);
return;
} if (readkey == null) {
// didn't find anything that would match, so return
do {
// if we have an exact match on row, and it's not a delete, save this
// as a candidate key
if (Bytes.equals(readkey.getRow(), row)) {
if (!HLogEdit.isDeleted(readval.get())) {
if (ttl == HConstants.FOREVER ||
now < readkey.getTimestamp() + ttl) {
candidateKeys.put(stripTimestamp(readkey),
new Long(readkey.getTimestamp()));
} else {
if (LOG.isDebugEnabled()) {
LOG.debug("rowAtOrBeforeFromMapFile:" + readkey +
": expired, skipped");
}
}
}
} else if (Bytes.compareTo(readkey.getRow(), row) > 0 ) {
// if the row key we just read is beyond the key we're searching for,
// then we're done. return.
return; return;
} else { }
// so, the row key doesn't match, but we haven't gone past the row
// we're seeking yet, so this row is a candidate for closest do {
// (assuming that it isn't a delete). // if we have an exact match on row, and it's not a delete, save this
if (!HLogEdit.isDeleted(readval.get())) { // as a candidate key
if (ttl == HConstants.FOREVER || if (Bytes.equals(readkey.getRow(), row)) {
now < readkey.getTimestamp() + ttl) { if (!HLogEdit.isDeleted(readval.get())) {
candidateKeys.put(stripTimestamp(readkey), if (ttl == HConstants.FOREVER ||
new Long(readkey.getTimestamp())); now < readkey.getTimestamp() + ttl) {
} else { candidateKeys.put(stripTimestamp(readkey),
new Long(readkey.getTimestamp()));
foundCandidate = true;
continue;
}
if (LOG.isDebugEnabled()) { if (LOG.isDebugEnabled()) {
LOG.debug("rowAtOrBeforeFromMapFile:" + readkey + LOG.debug("rowAtOrBeforeFromMapFile:" + readkey +
": expired, skipped"); ": expired, skipped");
} }
} }
} deletedOrExpiredRow = stripTimestamp(readkey);
} } else if (Bytes.compareTo(readkey.getRow(), row) > 0 ) {
} while(map.next(readkey, readval)); // if the row key we just read is beyond the key we're searching for,
// then we're done. return.
break;
} else {
// so, the row key doesn't match, but we haven't gone past the row
// we're seeking yet, so this row is a candidate for closest
// (assuming that it isn't a delete).
if (!HLogEdit.isDeleted(readval.get())) {
if (ttl == HConstants.FOREVER ||
now < readkey.getTimestamp() + ttl) {
candidateKeys.put(stripTimestamp(readkey),
new Long(readkey.getTimestamp()));
foundCandidate = true;
continue;
}
if (LOG.isDebugEnabled()) {
LOG.debug("rowAtOrBeforeFromMapFile:" + readkey +
": expired, skipped");
}
}
deletedOrExpiredRow = stripTimestamp(readkey);
}
} while(map.next(readkey, readval));
// If we get here and have no candidates but we did find a deleted or
// expired candidate, we need to look at the key before that
if (!foundCandidate && deletedOrExpiredRow != null) {
searchKey = deletedOrExpiredRow;
deletedOrExpiredRow = null;
} else {
// No candidates and no deleted or expired candidates. Give up.
break;
}
}
// arriving here just means that we consumed the whole rest of the map // arriving here just means that we consumed the whole rest of the map
// without going "past" the key we're searching for. we can just fall // without going "past" the key we're searching for. we can just fall