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]); }
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); }
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]); }
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(); }
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); }
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); }
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); }
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)); }
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)); }