Exemplo n.º 1
0
        private List <MessageTrackingLogEntry> GetMessageLog(RpcReason rpcReason, ILogReader logReader, TrackingLogPrefix logPrefix, string messageId)
        {
            Fqdn key = Fqdn.Parse(logReader.Server);
            Dictionary <string, List <MessageTrackingLogEntry>[]> dictionary = null;

            List <MessageTrackingLogEntry>[] array = null;
            if (!this.cache.TryGetValue(key, out dictionary))
            {
                dictionary = new Dictionary <string, List <MessageTrackingLogEntry>[]>();
                this.cache.Add(key, dictionary);
            }
            if (!dictionary.TryGetValue(messageId, out array))
            {
                array = new List <MessageTrackingLogEntry> [LogCache.prefixValues.Length];
                for (int i = 0; i < LogCache.prefixValues.Length; i++)
                {
                    List <MessageTrackingLogEntry> list = logReader.ReadLogs(rpcReason, LogCache.prefixValues[i], messageId, this.startTime, this.endTime, this.eventBudget);
                    if (logReader.MtrSchemaVersion >= MtrSchemaVersion.E15RTM)
                    {
                        list.RemoveAll((MessageTrackingLogEntry entry) => entry.EventId == MessageTrackingEvent.RECEIVE && entry.Source == MessageTrackingSource.STOREDRIVER);
                        list.RemoveAll((MessageTrackingLogEntry entry) => entry.EventId == MessageTrackingEvent.HADISCARD && entry.Source == MessageTrackingSource.SMTP);
                        list.RemoveAll((MessageTrackingLogEntry entry) => entry.EventId == MessageTrackingEvent.AGENTINFO && entry.Source == MessageTrackingSource.AGENT);
                    }
                    array[i] = list;
                }
                dictionary.Add(messageId, array);
            }
            return(array[(int)logPrefix]);
        }
Exemplo n.º 2
0
        private List <MessageTrackingLogEntry> ReadLogs(RpcReason rpcReason, string logFilePrefix, ProxyAddressCollection senderProxyAddresses, string messageId, DateTime startTime, DateTime endTime, TrackingEventBudget eventBudget)
        {
            Exception ex  = null;
            int       num = 0;
            List <MessageTrackingLogEntry> list = null;
            bool flag  = !string.IsNullOrEmpty(messageId);
            bool flag2 = senderProxyAddresses != null;

            if (flag && flag2)
            {
                throw new InvalidOperationException("Cannot get logs with both message id and sender address criteria");
            }
            if (rpcReason == RpcReason.None)
            {
                InfoWorkerMessageTrackingPerformanceCounters.GetMessageTrackingReportQueries.Increment();
            }
            else
            {
                InfoWorkerMessageTrackingPerformanceCounters.SearchMessageTrackingReportQueries.Increment();
            }
            try
            {
                this.context.DiagnosticsContext.LogRpcStart(this.server, rpcReason);
                using (LogSearchCursor cursor = TrackingSearch.GetCursor(this.server, this.version, logFilePrefix, messageId, senderProxyAddresses, startTime, endTime))
                {
                    list = this.ReadLogsFromCursor(cursor, eventBudget);
                }
            }
            catch (LogSearchException ex2)
            {
                ex  = ex2;
                num = ex2.ErrorCode;
            }
            catch (RpcException ex3)
            {
                ex  = ex3;
                num = ex3.ErrorCode;
            }
            finally
            {
                this.context.DiagnosticsContext.LogRpcEnd(ex, (list == null) ? 0 : list.Count);
            }
            if (ex != null)
            {
                TraceWrapper.SearchLibraryTracer.TraceError(this.GetHashCode(), "Error reading from log-search RPC server for {0}: {1}, ErrorCode: {2}, Exception: {3}", new object[]
                {
                    flag ? "message id" : "sender",
                    flag ? messageId : senderProxyAddresses[0].ToString(),
                    num,
                    ex
                });
                TrackingTransientException.AddAndRaiseETX(this.context.Errors, ErrorCode.LogSearchConnection, this.server, ex.ToString());
            }
            return(list);
        }
Exemplo n.º 3
0
        private List <MessageTrackingLogEntry> GetMessageLog(RpcReason rpcReason, ILogReader logReader, TrackingLogPrefix logPrefix, ProxyAddressCollection senderAddresses)
        {
            Fqdn key = Fqdn.Parse(logReader.Server);
            Dictionary <ProxyAddressCollection, List <MessageTrackingLogEntry>[]> dictionary = null;

            List <MessageTrackingLogEntry>[] array = null;
            if (!this.cacheBySender.TryGetValue(key, out dictionary))
            {
                dictionary = new Dictionary <ProxyAddressCollection, List <MessageTrackingLogEntry>[]>(1, LogCache.proxyAddressCollectionComparer);
                this.cacheBySender.Add(key, dictionary);
            }
            if (!dictionary.TryGetValue(senderAddresses, out array))
            {
                array = new List <MessageTrackingLogEntry> [LogCache.prefixValues.Length];
                for (int i = 0; i < LogCache.prefixValues.Length; i++)
                {
                    List <MessageTrackingLogEntry> list = logReader.ReadLogs(rpcReason, LogCache.prefixValues[i], senderAddresses, this.startTime, this.endTime, this.eventBudget);
                    array[i] = list;
                    Dictionary <string, List <MessageTrackingLogEntry>[]> dictionary2 = null;
                    bool             flag    = !this.cache.TryGetValue(key, out dictionary2);
                    HashSet <string> hashSet = new HashSet <string>();
                    foreach (MessageTrackingLogEntry messageTrackingLogEntry in list)
                    {
                        if (!flag && !dictionary2.ContainsKey(messageTrackingLogEntry.MessageId) && !hashSet.Contains(messageTrackingLogEntry.MessageId))
                        {
                            hashSet.Add(messageTrackingLogEntry.MessageId);
                        }
                    }
                    if (flag)
                    {
                        dictionary2 = new Dictionary <string, List <MessageTrackingLogEntry>[]>(hashSet.Count);
                        this.cache.Add(key, dictionary2);
                    }
                    foreach (MessageTrackingLogEntry messageTrackingLogEntry2 in list)
                    {
                        if (hashSet.Contains(messageTrackingLogEntry2.MessageId))
                        {
                            List <MessageTrackingLogEntry>[] array2;
                            if (!dictionary2.TryGetValue(messageTrackingLogEntry2.MessageId, out array2))
                            {
                                array2 = new List <MessageTrackingLogEntry> [LogCache.prefixValues.Length];
                                dictionary2.Add(messageTrackingLogEntry2.MessageId, array2);
                            }
                            if (array2[i] == null)
                            {
                                array2[i] = new List <MessageTrackingLogEntry>();
                            }
                            array2[i].Add(messageTrackingLogEntry2);
                        }
                    }
                }
                dictionary.Add(senderAddresses, array);
            }
            return(array[(int)logPrefix]);
        }
Exemplo n.º 4
0
 public void LogRpcStart(string server, RpcReason rpcReason)
 {
     this.AddProperty(DiagnosticProperty.Op, Names <Operations> .Map[0]);
     this.AddProperty(DiagnosticProperty.OpType, Names <OpType> .Map[0]);
     this.AddProperty(DiagnosticProperty.Svr, server);
     if (rpcReason != RpcReason.None)
     {
         this.AddProperty(DiagnosticProperty.Data1, Names <RpcReason> .Map[(int)rpcReason]);
     }
     this.WriteEvent();
 }
Exemplo n.º 5
0
        public List <MessageTrackingLogEntry> GetMessageLog(RpcReason rpcReason, ILogReader reader, TrackingLogPrefix logPrefix, string messageId, MessageTrackingSource?sourceFilter, HashSet <MessageTrackingEvent> eventIdFilterSet)
        {
            List <MessageTrackingLogEntry> messageLog = this.GetMessageLog(rpcReason, reader, logPrefix, messageId);
            List <MessageTrackingLogEntry> list       = new List <MessageTrackingLogEntry>();

            if (messageLog == null)
            {
                return(list);
            }
            foreach (MessageTrackingLogEntry messageTrackingLogEntry in messageLog)
            {
                if ((sourceFilter == null || !(messageTrackingLogEntry.Source != sourceFilter)) && eventIdFilterSet.Contains(messageTrackingLogEntry.EventId))
                {
                    list.Add(messageTrackingLogEntry);
                }
            }
            return(list);
        }
Exemplo n.º 6
0
        public List <MessageTrackingLogEntry> GetMessageLog(RpcReason rpcReason, ILogReader reader, TrackingLogPrefix logPrefix, string messageId, long mailItemId)
        {
            List <MessageTrackingLogEntry> messageLog = this.GetMessageLog(rpcReason, reader, logPrefix, messageId);
            List <MessageTrackingLogEntry> list       = new List <MessageTrackingLogEntry>();

            if (messageLog == null)
            {
                return(list);
            }
            foreach (MessageTrackingLogEntry messageTrackingLogEntry in messageLog)
            {
                if (mailItemId == messageTrackingLogEntry.ServerLogKeyMailItemId)
                {
                    list.Add(messageTrackingLogEntry);
                }
            }
            return(list);
        }
Exemplo n.º 7
0
        public List <MessageTrackingLogEntry> GetMessageLog(RpcReason rpcReason, ILogReader reader, TrackingLogPrefix logPrefix, ProxyAddressCollection senderAddresses, MessageTrackingSource eventSource, HashSet <MessageTrackingEvent> eventIdFilterSet, ProxyAddressCollection[] recipientAddresses, string messageId)
        {
            List <MessageTrackingLogEntry> list = new List <MessageTrackingLogEntry>();
            string text = null;
            bool   flag = false;

            if (senderAddresses == null && string.IsNullOrEmpty(messageId))
            {
                throw new ArgumentException("Either senderAddresses or messageId must be specified to use log cache");
            }
            if (!string.IsNullOrEmpty(messageId))
            {
                text = TrackingSearch.RemoveAngleBracketsIfNeeded(messageId);
            }
            List <MessageTrackingLogEntry> messageLog;

            if (!string.IsNullOrEmpty(text))
            {
                messageLog = this.GetMessageLog(rpcReason, reader, logPrefix, text);
                flag       = true;
            }
            else
            {
                messageLog = this.GetMessageLog(rpcReason, reader, logPrefix, senderAddresses);
            }
            foreach (MessageTrackingLogEntry messageTrackingLogEntry in messageLog)
            {
                if (messageTrackingLogEntry.Source == eventSource && (eventIdFilterSet == null || eventIdFilterSet.Contains(messageTrackingLogEntry.EventId)) && (!flag || senderAddresses == null || LogCache.AtLeastOneAddressFoundInProxy(new string[]
                {
                    messageTrackingLogEntry.SenderAddress
                }, senderAddresses)) && (recipientAddresses == null || LogCache.AtLeastOneAddressFoundInProxies(messageTrackingLogEntry.RecipientAddresses, recipientAddresses)))
                {
                    list.Add(messageTrackingLogEntry);
                }
            }
            return(list);
        }
Exemplo n.º 8
0
 public List <MessageTrackingLogEntry> ReadLogs(RpcReason rpcReason, string logFilePrefix, ProxyAddressCollection senderProxyAddresses, DateTime startTime, DateTime endTime, TrackingEventBudget eventBudget)
 {
     return(this.ReadLogs(rpcReason, logFilePrefix, senderProxyAddresses, null, startTime, endTime, eventBudget));
 }
Exemplo n.º 9
0
 public List <MessageTrackingLogEntry> ReadLogs(RpcReason rpcReason, string logFilePrefix, string messageId, DateTime startTime, DateTime endTime, TrackingEventBudget eventBudget)
 {
     return(this.ReadLogs(rpcReason, logFilePrefix, null, messageId, startTime, endTime, eventBudget));
 }