static Tuple <EntryPartition, EntryPartition> GetRangeForLastMessageBinarySearch(IAzureDiagnosticLogsTable wadTable, DateTime utcNow, CancellationToken cancellation) { EntryPartition initialPartition = new EntryTimestamp(utcNow).Partition; bool thereAreEntriesOlderThanNow = wadTable.GetFirstEntryOlderThan(initialPartition.ToString()) != null; bool searchingForward = thereAreEntriesOlderThanNow; EntryPartition currentPartition = initialPartition; for (long step = searchingForward ? 1 : -1; ; step *= 2) { cancellation.ThrowIfCancellationRequested(); EntryPartition t = initialPartition.Advance(step); if (EntryPartition.Compare(currentPartition, t) == 0) { return(null); } var tmp = wadTable.GetFirstEntryOlderThan(t.ToString()); if (searchingForward) { if (tmp == null) { return(new Tuple <EntryPartition, EntryPartition>(currentPartition.Advance(), t)); } } else { if (tmp != null) { return(new Tuple <EntryPartition, EntryPartition>(new EntryPartition(tmp.EventTickCount), currentPartition.Advance())); } } currentPartition = t; } }
static IndexedAzureDiagnosticLogEntry?FindLowerReversedDateBound( IAzureDiagnosticLogsTable wadTable, DateTime date, EntryPartition searchRangeBegin, CancellationToken cancellationToken) { EntryTimestamp dateTimestamp = new EntryTimestamp(date); var ret = FindLowerReversedDateBoundInPartition(wadTable, dateTimestamp.Partition, dateTimestamp.Ticks, cancellationToken); if (ret.Entry != null) { return(ret); } var rangeForBinarySearch = GetRangeForLowerReversedDateBoundBinarySearch(wadTable, dateTimestamp.Ticks, searchRangeBegin, cancellationToken); if (rangeForBinarySearch == null) { return(null); } EntryPartition begin = rangeForBinarySearch.Item1; EntryPartition end = rangeForBinarySearch.Item2; int searchRangeDuration = (int)EntryPartition.Distance(begin, end); int pos = ListUtils.BinarySearch( new ListUtils.VirtualList <int>(searchRangeDuration, i => i), 0, searchRangeDuration, timeBeingTested => { cancellationToken.ThrowIfCancellationRequested(); var firstEntryFollowingTimeBeingTested = wadTable.GetFirstEntryOlderThan(begin.Advance(timeBeingTested).ToString()); bool lessThanBoundaryBeingSearched; if (firstEntryFollowingTimeBeingTested == null) { lessThanBoundaryBeingSearched = false; } else { lessThanBoundaryBeingSearched = firstEntryFollowingTimeBeingTested.EventTickCount < dateTimestamp.Ticks; } return(lessThanBoundaryBeingSearched); }); if (pos == searchRangeDuration) { return(null); } ret = FindLowerReversedDateBoundInPartition(wadTable, begin.Advance(pos), dateTimestamp.Ticks, cancellationToken); if (ret.Entry != null) { return(ret); } return(null); }
static IndexedAzureDiagnosticLogEntry?FindLowerDateBound( IAzureDiagnosticLogsTable wadTable, DateTime date, EntryPartition searchRangeEnd, CancellationToken cancellation) { var dateTimestamp = new EntryTimestamp(date); var ret = LoadEntriesRange(wadTable, dateTimestamp.Partition, searchRangeEnd, null, cancellation) .FirstOrDefault(e => e.Entry.EventTickCount >= dateTimestamp.Ticks); return(ret.Entry != null ? ret : new IndexedAzureDiagnosticLogEntry?()); }
public EntryPartition(EntryTimestamp timestamp) { partitionKeyTicks = RemoveSeconds(timestamp.Ticks); }