private bool TryGetLargestEntry(ulong stream, int startNumber, int endNumber, out IndexEntry entry)
{
Ensure.Nonnegative(startNumber, "startNumber");
Ensure.Nonnegative(endNumber, "endNumber");
entry = TableIndex.InvalidIndexEntry;
var startKey = BuildKey(stream, startNumber);
var endKey = BuildKey(stream, endNumber);
if (startKey.GreaterThan(_maxEntry) || endKey.SmallerThan(_minEntry))
return false;
var workItem = GetWorkItem();
try
{
var recordRange = LocateRecordRange(endKey);
long low = recordRange.Lower;
long high = recordRange.Upper;
while (low < high)
{
var mid = low + (high - low) / 2;
IndexEntry midpoint = ReadEntry(_indexEntrySize, mid, workItem, _version);
var midpointKey = new IndexEntryKey(midpoint.Stream, midpoint.Version);
if (midpointKey.GreaterThan(endKey))
low = mid + 1;
else
high = mid;
}
var candEntry = ReadEntry(_indexEntrySize, high, workItem, _version);
var candKey = new IndexEntryKey(candEntry.Stream, candEntry.Version);
if (candKey.GreaterThan(endKey))
throw new Exception(string.Format("candEntry ({0}@{1}) > startKey {2}, stream {3}, startNum {4}, endNum {5}, PTable: {6}.", candEntry.Stream, candEntry.Version, startKey, stream, startNumber, endNumber, Filename));
if (candKey.SmallerThan(startKey))
return false;
entry = candEntry;
return true;
}
finally
{
ReturnWorkItem(workItem);
}
}