int keyOffset,
int keyLength,
long blockId)
throws IOException, SQLException, InterruptedException
{
Block block;
if (blockId == _rootBlockId) {
block = _rootBlock;
block.allocate();
}
else
block = _store.loadBlock(blockId);
try {
Lock blockLock = block.getReadLock();
blockLock.tryLock(_timeout, TimeUnit.MILLISECONDS);
try {
validateIndex(block);
block.read();
byte []buffer = block.getBuffer();
boolean isLeaf = isLeaf(buffer, block);
long value = lookupTuple(blockId, buffer,
keyBuffer, keyOffset, keyLength,
isLeaf);
if (isLeaf || value == FAIL)
return value;
else
return lookup(keyBuffer, keyOffset, keyLength, value);
} finally {
blockLock.unlock();
}
} finally {
block.free();
}
}