コード例 #1
0
        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;
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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?());
        }
コード例 #4
0
 public EntryPartition(EntryTimestamp timestamp)
 {
     partitionKeyTicks = RemoveSeconds(timestamp.Ticks);
 }