コード例 #1
0
 public LogDataAnalyzer(TrackingContext context)
 {
     this.context           = context;
     this.startingServer    = Fqdn.Parse(this.context.StartingEventId.Server);
     this.cache             = context.Cache;
     this.remainingTrackers = new Queue <MailItemTracker>();
 }
コード例 #2
0
        private static void CreateAndEnqueueTracker(TrackingContext context, Queue <MailItemTracker> remainingTrackers, ILogReader reader, TrackingLogPrefix prefix, string messageId, long mailItemId)
        {
            List <MessageTrackingLogEntry> messageLog = context.Cache.GetMessageLog(RpcReason.None, reader, prefix, messageId, mailItemId);
            MailItemTracker item = new MailItemTracker(messageLog, context.Tree);

            remainingTrackers.Enqueue(item);
        }
コード例 #3
0
        private static bool TryEnqueueNextHopAfterTransfer(MessageTrackingLogEntry transferEvent, TrackingContext context, Queue <MailItemTracker> remainingTrackers)
        {
            ServerInfo server = ServerCache.Instance.FindMailboxOrHubServer(transferEvent.Server, 32UL);

            if (LogDataAnalyzer.ShouldSkipTracker(server, transferEvent, context))
            {
                return(false);
            }
            ILogReader logReader = RpcLogReader.GetLogReader(transferEvent.Server, context.DirectoryContext);

            if (logReader == null)
            {
                return(false);
            }
            List <MessageTrackingLogEntry> messageLog = context.Cache.GetMessageLog(RpcReason.None, logReader, TrackingLogPrefix.MSGTRK, transferEvent.MessageId, transferEvent.InternalMessageId);

            if (messageLog.Count == 0)
            {
                TraceWrapper.SearchLibraryTracer.TraceError <string, long>(0, "Could not find any events matching MessageId={0}, and InternalId={1}.", transferEvent.MessageId, transferEvent.ServerLogKeyMailItemId);
                return(false);
            }
            MailItemTracker item = new MailItemTracker(messageLog, context.Tree);

            remainingTrackers.Enqueue(item);
            return(true);
        }
コード例 #4
0
        private static long GetCheckReceiveEventAfterModerationApproval(List <MessageTrackingLogEntry> possibleReceiveMatches, TrackingContext context, ILogReader reader)
        {
            MessageTrackingLogEntry messageTrackingLogEntry = possibleReceiveMatches[possibleReceiveMatches.Count - 1];

            foreach (MessageTrackingLogEntry messageTrackingLogEntry2 in possibleReceiveMatches)
            {
                if (messageTrackingLogEntry2.ProcessedBy == null)
                {
                    messageTrackingLogEntry = messageTrackingLogEntry2;
                    break;
                }
            }
            long serverLogKeyMailItemId = messageTrackingLogEntry.ServerLogKeyMailItemId;
            List <MessageTrackingLogEntry> messageLog = context.Cache.GetMessageLog(RpcReason.None, reader, TrackingLogPrefix.MSGTRK, messageTrackingLogEntry.MessageId, serverLogKeyMailItemId);

            if (messageLog.Count != 0)
            {
                if (!messageLog.TrueForAll((MessageTrackingLogEntry receiveEntry) => receiveEntry.Source != MessageTrackingSource.APPROVAL))
                {
                    TraceWrapper.SearchLibraryTracer.TraceDebug <string, long>(0, "Last Receive event for message {0} InternalMessageId {1} doesn't indicate resubmission after approval because contains APPROVAL event in the path.", messageTrackingLogEntry.MessageId, serverLogKeyMailItemId);
                    return(0L);
                }
            }
            return(serverLogKeyMailItemId);
        }
コード例 #5
0
 private static bool ShouldSkipTracker(ServerInfo server, MessageTrackingLogEntry logEntry, TrackingContext context)
 {
     if (!server.IsSearchable || logEntry.IsNextHopCrossSite(context.DirectoryContext))
     {
         TraceWrapper.SearchLibraryTracer.TraceDebug <string, string>(0, "Skipping search logs on {0}: {1}", logEntry.NextHopFqdnOrName, server.IsSearchable ? "Server is in remote site" : "Server is not searchable");
         return(true);
     }
     return(false);
 }
コード例 #6
0
        private static MessageTrackingLogEntry LocateModeratorResponse(MessageTrackingLogEntry initMessageEvent, TrackingContext context, out ILogReader reader)
        {
            ServerInfo serverInfo = LogDataAnalyzer.IdentifyArbitrationMailboxServer(initMessageEvent.ArbitrationMailboxAddress, context.DirectoryContext);

            if (serverInfo.ServerSiteId.Equals(ServerCache.Instance.GetLocalServerSiteId(context.DirectoryContext)))
            {
                reader = null;
                return(null);
            }
            if (serverInfo.AdminDisplayVersion.ToInt() > Constants.E14SP1ModerationReferralSupportVersion)
            {
                IEnumerable <ServerInfo> casServers = ServerCache.Instance.GetCasServers(serverInfo.ServerSiteId);
                foreach (ServerInfo serverInfo2 in casServers)
                {
                    if (serverInfo2.AdminDisplayVersion.ToInt() > Constants.E14SP1ModerationReferralSupportVersion)
                    {
                        TraceWrapper.SearchLibraryTracer.TraceError <ADObjectId>(0, "Cas in site {0} can handle x-site moderation init message referral. Init message will be handled as a referral later.", serverInfo.ServerSiteId);
                        reader = null;
                        return(null);
                    }
                }
            }
            if (!serverInfo.IsSearchable)
            {
                TraceWrapper.SearchLibraryTracer.TraceError <string, ServerStatus>(0, "Could not search mailbox server for arbitration mailbox {0}: {1}.", serverInfo.Key, serverInfo.Status);
                reader = null;
                return(null);
            }
            reader = RpcLogReader.GetLogReader(serverInfo.Key, context.DirectoryContext);
            if (reader == null)
            {
                return(null);
            }
            List <MessageTrackingLogEntry> messageLog = context.Cache.GetMessageLog(RpcReason.None, reader, TrackingLogPrefix.MSGTRK, initMessageEvent.InitMessageId, null, LogDataAnalyzer.validModeratorResponseTypes);

            if (messageLog.Count == 0)
            {
                TraceWrapper.SearchLibraryTracer.TraceError <string, string>(0, "No moderator responses found for Initiation Message {0} on {1}", initMessageEvent.InitMessageId, serverInfo.Key);
                return(null);
            }
            return(messageLog[0]);
        }
コード例 #7
0
        private static bool TryEnqueueNextHopAfterHAResubmit(MessageTrackingLogEntry haResubmitEvent, TrackingContext context, Queue <MailItemTracker> remainingTrackers)
        {
            if (haResubmitEvent.Source != MessageTrackingSource.REDUNDANCY)
            {
                return(false);
            }
            ServerInfo server = ServerCache.Instance.FindMailboxOrHubServer(haResubmitEvent.Server, 32UL);

            if (LogDataAnalyzer.ShouldSkipTracker(server, haResubmitEvent, context))
            {
                return(false);
            }
            ILogReader logReader = RpcLogReader.GetLogReader(haResubmitEvent.Server, context.DirectoryContext);

            if (logReader == null)
            {
                return(false);
            }
            List <MessageTrackingLogEntry> messageLog = context.Cache.GetMessageLog(RpcReason.None, logReader, TrackingLogPrefix.MSGTRK, haResubmitEvent.MessageId, haResubmitEvent.InternalMessageId);
            List <MessageTrackingLogEntry> list       = messageLog.FindAll((MessageTrackingLogEntry entry) => entry.Source != MessageTrackingSource.REDUNDANCY);

            if (list.Count == 0)
            {
                TraceWrapper.SearchLibraryTracer.TraceError <string, long>(0, "Could not find any events following resubmission matching MessageId={0}, and InternalId={1}.", haResubmitEvent.MessageId, haResubmitEvent.InternalMessageId);
                return(false);
            }
            MailItemTracker item = new MailItemTracker(list, context.Tree);

            remainingTrackers.Enqueue(item);
            return(true);
        }
コード例 #8
0
        private static bool TryEnqueueNextHopAfterHARedirect(MessageTrackingLogEntry haRedirectEvent, TrackingContext context, Queue <MailItemTracker> remainingTrackers)
        {
            ServerInfo nextHopServer = haRedirectEvent.GetNextHopServer();

            if (LogDataAnalyzer.ShouldSkipTracker(nextHopServer, haRedirectEvent, context))
            {
                return(false);
            }
            ILogReader logReader = RpcLogReader.GetLogReader(haRedirectEvent.NextHopFqdnOrName, context.DirectoryContext);

            if (logReader == null)
            {
                return(false);
            }
            List <MessageTrackingLogEntry> messageLog = context.Cache.GetMessageLog(RpcReason.None, logReader, TrackingLogPrefix.MSGTRK, haRedirectEvent.MessageId, null, SearchMessageTrackingReportImpl.HAReceiveOrResubmitEventsFilterSet);

            if (messageLog.Count == 0)
            {
                TraceWrapper.SearchLibraryTracer.TraceError <MessageTrackingLogEntry, string>(0, "Could not find any HA receive events to match {0} on {1}.", haRedirectEvent, haRedirectEvent.NextHopFqdnOrName);
                return(false);
            }
            MailItemTracker item = new MailItemTracker(messageLog, context.Tree);

            remainingTrackers.Enqueue(item);
            return(true);
        }
コード例 #9
0
        private static bool TryEnqueueNextHopAfterSubmitInternal(MessageTrackingLogEntry submitEvent, TrackingContext context, Queue <MailItemTracker> remainingTrackers, bool searchAfterModerationApproval)
        {
            ServerInfo nextHopServer = submitEvent.GetNextHopServer();

            if (LogDataAnalyzer.ShouldSkipTracker(nextHopServer, submitEvent, context))
            {
                return(false);
            }
            ILogReader logReader = RpcLogReader.GetLogReader(submitEvent.NextHopFqdnOrName, context.DirectoryContext);

            if (logReader == null)
            {
                return(false);
            }
            List <MessageTrackingLogEntry> messageLog = context.Cache.GetMessageLog(RpcReason.None, logReader, TrackingLogPrefix.MSGTRK, submitEvent.MessageId, new MessageTrackingSource?((logReader.MtrSchemaVersion >= MtrSchemaVersion.E15RTM) ? MessageTrackingSource.SMTP : MessageTrackingSource.STOREDRIVER), SearchMessageTrackingReportImpl.ReceiveEventFilterSet);

            if (messageLog.Count == 0)
            {
                TraceWrapper.SearchLibraryTracer.TraceDebug <string, string, MessageTrackingLogEntry>(0, "No {0} Receive event found on {1} to match {2}.", (logReader.MtrSchemaVersion >= MtrSchemaVersion.E15RTM) ? "SMTP" : "StoreDriver", submitEvent.NextHopFqdnOrName, submitEvent);
                return(false);
            }
            long num;

            if (!searchAfterModerationApproval)
            {
                num = messageLog[0].ServerLogKeyMailItemId;
            }
            else
            {
                num = LogDataAnalyzer.GetCheckReceiveEventAfterModerationApproval(messageLog, context, logReader);
                if (num == 0L)
                {
                    return(false);
                }
            }
            foreach (MessageTrackingLogEntry messageTrackingLogEntry in messageLog)
            {
                LogDataAnalyzer.CreateAndEnqueueTracker(context, remainingTrackers, logReader, TrackingLogPrefix.MSGTRK, messageTrackingLogEntry.MessageId, num);
            }
            return(true);
        }
コード例 #10
0
 private static bool TryEnqueueNextHopAfterSubmit(MessageTrackingLogEntry submitEvent, TrackingContext context, Queue <MailItemTracker> remainingTrackers)
 {
     return(LogDataAnalyzer.TryEnqueueNextHopAfterSubmitInternal(submitEvent, context, remainingTrackers, false));
 }
コード例 #11
0
        private static bool TryEnqueueNextHopAfterModeratorApprove(MessageTrackingLogEntry approvalEvent, TrackingContext context, Queue <MailItemTracker> remainingTrackers)
        {
            ILogReader logReader = RpcLogReader.GetLogReader(approvalEvent.Server, context.DirectoryContext);

            if (logReader == null)
            {
                return(false);
            }
            List <MessageTrackingLogEntry> messageLog = context.Cache.GetMessageLog(RpcReason.None, logReader, TrackingLogPrefix.MSGTRK, approvalEvent.MessageId, new MessageTrackingSource?(MessageTrackingSource.STOREDRIVER), SearchMessageTrackingReportImpl.SubmitEventFilterSet);

            if (messageLog.Count == 0)
            {
                TraceWrapper.SearchLibraryTracer.TraceError <string>(0, "Moderator approval event found, but no matching submission of the message back into transport was found on mailbox server {0}.", approvalEvent.Server);
                return(false);
            }
            MessageTrackingLogEntry messageTrackingLogEntry = null;

            foreach (MessageTrackingLogEntry messageTrackingLogEntry2 in messageLog)
            {
                if (!LogDataAnalyzer.IsEntryProcessed(messageTrackingLogEntry2, context.Tree))
                {
                    messageTrackingLogEntry             = messageTrackingLogEntry2;
                    messageTrackingLogEntry.ProcessedBy = context.Tree;
                    break;
                }
            }
            if (messageTrackingLogEntry == null)
            {
                TraceWrapper.SearchLibraryTracer.TraceError(0, "All submission events found after processing moderator approval had already been processed.", new object[0]);
                return(false);
            }
            ILogReader logReader2 = RpcLogReader.GetLogReader(messageTrackingLogEntry.NextHopFqdnOrName, context.DirectoryContext);

            if (logReader2 == null)
            {
                return(false);
            }
            List <MessageTrackingLogEntry> messageLog2 = context.Cache.GetMessageLog(RpcReason.None, logReader2, TrackingLogPrefix.MSGTRK, approvalEvent.OrigMessageId, new MessageTrackingSource?(MessageTrackingSource.APPROVAL), SearchMessageTrackingReportImpl.ReceiveEventFilterSet);

            if (messageLog2.Count == 0)
            {
                TraceWrapper.SearchLibraryTracer.TraceError(0, "No Approval Received events found", new object[0]);
                return(false);
            }
            foreach (MessageTrackingLogEntry messageTrackingLogEntry3 in messageLog2)
            {
                if (!LogDataAnalyzer.IsEntryProcessed(messageTrackingLogEntry3, context.Tree) && approvalEvent.MessageId.Equals(messageTrackingLogEntry3.InitMessageId, StringComparison.Ordinal))
                {
                    if (logReader.MtrSchemaVersion >= MtrSchemaVersion.E15RTM)
                    {
                        if (!LogDataAnalyzer.TryEnqueueNextHopAfterSubmitInternal(messageTrackingLogEntry3, context, remainingTrackers, true))
                        {
                            continue;
                        }
                    }
                    else
                    {
                        List <MessageTrackingLogEntry> messageLog3 = context.Cache.GetMessageLog(RpcReason.None, logReader2, TrackingLogPrefix.MSGTRK, approvalEvent.OrigMessageId, messageTrackingLogEntry3.ServerLogKeyMailItemId);
                        if (messageLog3.Count == 0)
                        {
                            continue;
                        }
                        MailItemTracker item = new MailItemTracker(messageLog3, context.Tree);
                        remainingTrackers.Enqueue(item);
                    }
                    return(true);
                }
            }
            TraceWrapper.SearchLibraryTracer.TraceError(0, "No unprocessed Approval Received events found", new object[0]);
            return(false);
        }
コード例 #12
0
        private static bool TryEnqueueNextHopAfterInitMessage(MessageTrackingLogEntry initMessageEvent, TrackingContext context, Queue <MailItemTracker> remainingTrackers)
        {
            ILogReader logReader;
            MessageTrackingLogEntry messageTrackingLogEntry = LogDataAnalyzer.LocateModeratorResponse(initMessageEvent, context, out logReader);

            if (messageTrackingLogEntry == null)
            {
                return(false);
            }
            if (messageTrackingLogEntry.RecipientAddresses == null)
            {
                messageTrackingLogEntry.RecipientAddresses = initMessageEvent.RecipientAddresses;
            }
            MailItemTracker item = new MailItemTracker(new List <MessageTrackingLogEntry>(1)
            {
                messageTrackingLogEntry
            }, context.Tree);

            remainingTrackers.Enqueue(item);
            return(true);
        }
コード例 #13
0
        private static bool TryEnqueueNextHopAfterSend(MessageTrackingLogEntry sendEvent, TrackingContext context, Queue <MailItemTracker> remainingTrackers)
        {
            ServerInfo nextHopServer = sendEvent.GetNextHopServer();

            if (LogDataAnalyzer.ShouldSkipTracker(nextHopServer, sendEvent, context))
            {
                return(false);
            }
            ILogReader logReader = RpcLogReader.GetLogReader(sendEvent.NextHopFqdnOrName, context.DirectoryContext);

            if (logReader == null)
            {
                return(false);
            }
            MessageTrackingSource?         sourceFilter     = null;
            HashSet <MessageTrackingEvent> eventIdFilterSet = SearchMessageTrackingReportImpl.ReceiveOrDeliverEventsFilterSet;

            if (logReader.MtrSchemaVersion < MtrSchemaVersion.E15RTM)
            {
                sourceFilter     = new MessageTrackingSource?(MessageTrackingSource.SMTP);
                eventIdFilterSet = SearchMessageTrackingReportImpl.ReceiveEventFilterSet;
            }
            List <MessageTrackingLogEntry> messageLog = context.Cache.GetMessageLog(RpcReason.None, logReader, TrackingLogPrefix.MSGTRK, sendEvent.MessageId, sourceFilter, eventIdFilterSet);

            if (messageLog.Count == 0)
            {
                return(false);
            }
            foreach (MessageTrackingLogEntry messageTrackingLogEntry in messageLog)
            {
                if (LogDataAnalyzer.CheckRecipientListEquality(sendEvent, messageTrackingLogEntry))
                {
                    LogDataAnalyzer.CreateAndEnqueueTracker(context, remainingTrackers, logReader, TrackingLogPrefix.MSGTRK, messageTrackingLogEntry.MessageId, messageTrackingLogEntry.ServerLogKeyMailItemId);
                    return(true);
                }
            }
            TraceWrapper.SearchLibraryTracer.TraceError <MessageTrackingLogEntry, string>(0, "Could not find any receive events to match {0} on {1}.", sendEvent, sendEvent.NextHopFqdnOrName);
            return(false);
        }