示例#1
0
        public static IEnumerable <IndexedAzureDiagnosticLogEntry> LoadEntriesRange(
            IAzureDiagnosticLogsTable wadTable,
            EntryPartition beginPartition,
            EntryPartition endPartition,
            int?entriesLimit,
            CancellationToken cancellationToken)
        {
            string currentPartitionKey     = null;
            var    currentPartitionEntries = new List <AzureDiagnosticLogEntry>();
            Comparison <AzureDiagnosticLogEntry> compareEntries = (e1, e2) => Math.Sign(e1.EventTickCount - e2.EventTickCount);

            foreach (var entry in wadTable.GetEntriesInRange(beginPartition.ToString(), endPartition.ToString(), entriesLimit))
            {
                cancellationToken.ThrowIfCancellationRequested();
                if (entry.PartitionKey != currentPartitionKey)
                {
                    currentPartitionEntries.Sort(compareEntries);
                    for (var i = 0; i < currentPartitionEntries.Count; ++i)
                    {
                        yield return(new IndexedAzureDiagnosticLogEntry(currentPartitionEntries[i], i));
                    }
                    currentPartitionEntries.Clear();
                    currentPartitionKey = entry.PartitionKey;
                }
                currentPartitionEntries.Add(entry);
            }
            currentPartitionEntries.Sort(compareEntries);
            for (var i = 0; i < currentPartitionEntries.Count; ++i)
            {
                yield return(new IndexedAzureDiagnosticLogEntry(currentPartitionEntries[i], i));
            }
        }
示例#2
0
        static Tuple <EntryPartition, EntryPartition> GetRangeForLowerReversedDateBoundBinarySearch(
            IAzureDiagnosticLogsTable wadTable,
            long dateTicks,
            EntryPartition searchRangeBegin,
            CancellationToken cancellationToken)
        {
            EntryPartition datePartition     = new EntryPartition(new EntryTimestamp(dateTicks));
            EntryPartition lastStepPartition = datePartition;

            for (int step = 1; ; step *= 2)
            {
                EntryPartition p = EntryPartition.Max(searchRangeBegin, datePartition.Advance(step));
                if (EntryPartition.Compare(p, lastStepPartition) == 0)
                {
                    return(null);
                }
                var tmp = wadTable.GetFirstEntryOlderThan(p.ToString());
                if (tmp != null && tmp.EventTickCount < dateTicks)
                {
                    return(new Tuple <EntryPartition, EntryPartition>(
                               new EntryPartition(tmp.PartitionKey),
                               lastStepPartition.Advance()));
                }
                lastStepPartition = p;
                cancellationToken.ThrowIfCancellationRequested();
            }
        }
示例#3
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;
            }
        }