Exemple #1
0
        // Token: 0x06000024 RID: 36 RVA: 0x000030E0 File Offset: 0x000012E0
        public void HandleEvent(MapiEvent mapiEvent, MailboxSession itemStore, StoreObject item)
        {
            MailboxTransportSubmissionAssistant.IdentifyProbeMessage(mapiEvent);
            Thread currentThread = Thread.CurrentThread;

            try
            {
                Interlocked.Increment(ref this.concurrentEvents);
                this.SubmissionsInProgress[currentThread] = new SubmissionsInProgress.Entry(ExDateTime.UtcNow, this.databaseInfo.Guid, mapiEvent);
                using (new SenderGuidTraceFilter(this.databaseInfo.Guid, mapiEvent.MailboxGuid))
                {
                    bool flag = true;
                    MailboxTransportSubmissionAssistant.LatencyRecord latencyRecord;
                    LatencyTracker latencyTracker;
                    if (MailboxTransportSubmissionAssistant.eventCounterToLatencyMap.TryGetValue(mapiEvent.EventCounter, out latencyRecord))
                    {
                        MailboxTransportSubmissionAssistant.eventCounterToLatencyMap.Remove(mapiEvent.EventCounter);
                        latencyTracker = latencyRecord.LatencyTracker;
                        LatencyTracker.EndTrackLatency(latencyRecord.LatencyComponent, latencyTracker, true);
                        flag = false;
                    }
                    else
                    {
                        latencyTracker = LatencyTracker.CreateInstance(LatencyComponent.MailboxTransportSubmissionService);
                        LatencyTracker.TrackPreProcessLatency(LatencyComponent.SubmissionAssistant, latencyTracker, mapiEvent.CreateTime);
                    }
                    LatencyTracker.BeginTrackLatency(LatencyComponent.MailboxTransportSubmissionService, latencyTracker);
                    string text = this.FormatMapiEventInfo(mapiEvent);
                    this.LogMapiEventIntoCrimsonChannelPeriodically(text);
                    this.SubmissionsInProgress[Thread.CurrentThread].LatencyTracker = latencyTracker;
                    if (MailboxTransportSubmissionAssistant.ShouldLogNotifyEvents && (flag || MailboxTransportSubmissionAssistant.ShouldLogTemporaryFailures))
                    {
                        LatencyFormatter       latencyFormatter = new LatencyFormatter(latencyTracker, Components.Configuration.LocalServer.TransportServer.Fqdn, mapiEvent.CreateTime, mapiEvent.CreateTime, true, false, false);
                        MsgTrackMapiSubmitInfo msgTrackInfo     = new MsgTrackMapiSubmitInfo(text, null, string.Empty, StoreDriverSubmission.LocalIPAddress, Components.Configuration.LocalServer.TransportServer.Name, string.Empty, string.Empty, MailboxTransportSubmissionAssistant.ItemEntryId(mapiEvent), latencyFormatter.FormatAndUpdatePerfCounters(), null, false, true);
                        MessageTrackingLog.TrackNotify(msgTrackInfo, false);
                    }
                    MSExchangeSubmission.PendingSubmissions.Increment();
                    new HashSet <string>();
                    DateTime createTime = mapiEvent.CreateTime;
                    MailboxTransportSubmissionService.StoreDriverTracer.ServiceTracer.TracePfdPass <int, Guid, long>(MailboxTransportSubmissionService.StoreDriverTracer.MessageProbeActivityId, (long)this.GetHashCode(), "PFD EMS {0} SubmitMail for mailbox {1} at entry {2}", 22427, mapiEvent.MailboxGuid, mapiEvent.EventCounter);
                    LatencyFormatter latencyFormatter2 = new LatencyFormatter(latencyTracker, Components.Configuration.LocalServer.TransportServer.Fqdn, createTime, createTime, false, true, false);
                    bool             isPublicFolder    = mapiEvent.ExtendedEventFlags.HasFlag(MapiExtendedEventFlags.PublicFolderMailbox);
                    LatencyTracker.BeginTrackLatency(LatencyComponent.MailboxTransportSubmissionStoreDriverSubmission, latencyTracker);
                    ISubmissionProvider  submissionProvider   = (ISubmissionProvider)Components.StoreDriverSubmission;
                    MailSubmissionResult mailSubmissionResult = submissionProvider.SubmitMessage(Components.Configuration.LocalServer.TransportServer.ExchangeLegacyDN, mapiEvent.MailboxGuid, this.databaseInfo.Guid, this.databaseInfo.DatabaseName, mapiEvent.EventCounter, mapiEvent.ItemEntryId, mapiEvent.ParentEntryId, Components.Configuration.LocalServer.TransportServer.Fqdn, new IPAddress(StoreDriverSubmission.LocalIPAddress.GetAddressBytes()), mapiEvent.CreateTime, isPublicFolder, (mapiEvent.TenantHint == null) ? null : TenantPartitionHint.FromPersistablePartitionHint(mapiEvent.TenantHint), latencyFormatter2.FormatAndUpdatePerfCounters(), MailboxTransportSubmissionService.QuarantineHandler, MailboxTransportSubmissionService.SubmissionPoisonHandler, latencyTracker);
                    MailSubmissionResult result = mailSubmissionResult;
                    LatencyTracker.EndTrackLatency(LatencyComponent.MailboxTransportSubmissionStoreDriverSubmission, latencyTracker);
                    LatencyTracker.EndTrackLatency(LatencyComponent.MailboxTransportSubmissionService, latencyTracker);
                    this.LogAndUpdateCounters(mapiEvent, latencyTracker, createTime, result);
                    this.HandleEventError(mapiEvent, result, latencyTracker, text);
                }
            }
            finally
            {
                MSExchangeSubmission.PendingSubmissions.Decrement();
                Interlocked.Decrement(ref this.concurrentEvents);
                this.SubmissionsInProgress.Remove(currentThread);
            }
        }
        public XElement GetDiagnosticInfo()
        {
            XElement root = new XElement("CurrentSubmissions");

            this.map.ForEach(null, delegate(Thread thread, MailItemSubmitter mailItemSubmitter)
            {
                SubmissionInfo submissionInfo = mailItemSubmitter.SubmissionInfo;
                string mailboxHopLatency      = submissionInfo.MailboxHopLatency;
                Guid mdbGuid                = submissionInfo.MdbGuid;
                IPAddress networkAddress    = submissionInfo.NetworkAddress;
                DateTime originalCreateTime = submissionInfo.OriginalCreateTime;
                string content              = null;
                string content2             = null;
                long num     = 0L;
                byte[] array = null;
                MapiSubmissionInfo mapiSubmissionInfo = (MapiSubmissionInfo)mailItemSubmitter.SubmissionInfo;
                num      = mapiSubmissionInfo.EventCounter;
                array    = mapiSubmissionInfo.EntryId;
                content  = mailItemSubmitter.Result.MessageId;
                content2 = mailItemSubmitter.Result.Sender;
                thread.Suspend();
                StackTrace content3;
                try
                {
                    content3 = new StackTrace(thread, true);
                }
                finally
                {
                    thread.Resume();
                }
                XElement xelement = new XElement("Submission");
                xelement.Add(new object[]
                {
                    new XElement("ThreadID", thread.ManagedThreadId),
                    new XElement("ConnectionID", mailItemSubmitter.SubmissionConnectionId),
                    new XElement("Duration", (default(DateTime) == mailItemSubmitter.StartTime) ? TimeSpan.Zero : (DateTime.UtcNow - mailItemSubmitter.StartTime)),
                    new XElement("MailboxServer", submissionInfo.MailboxFqdn),
                    new XElement("MailboxServerIP", submissionInfo.NetworkAddress),
                    new XElement("MdbName", submissionInfo.DatabaseName),
                    new XElement("MdbGuid", submissionInfo.MdbGuid),
                    new XElement("OriginalCreationTime", submissionInfo.OriginalCreateTime),
                    new XElement("MessageID", content),
                    new XElement("Sender", content2),
                    new XElement("EventCounter", num),
                    new XElement("EntryID", (array == null) ? null : BitConverter.ToString(array)),
                    new XElement("Stage", mailItemSubmitter.Stage),
                    new XElement("ErrorCode", mailItemSubmitter.ErrorCode),
                    new XElement("MessageSize", mailItemSubmitter.MessageSize),
                    new XElement("RecipientCount", mailItemSubmitter.RecipientCount),
                    new XElement("RpcLatency", mailItemSubmitter.RpcLatency),
                    new XElement("StackTrace", content3),
                    LatencyFormatter.GetDiagnosticInfo(mailItemSubmitter.LatencyTracker)
                });
                root.Add(xelement);
            });
            return(root);
        }
Exemple #3
0
        // Token: 0x06000039 RID: 57 RVA: 0x00003A30 File Offset: 0x00001C30
        private void LogAndUpdateCounters(MapiEvent mapiEvent, LatencyTracker latencyTracker, DateTime arrivalTime, MailSubmissionResult result)
        {
            LatencyFormatter latencyFormatter = new LatencyFormatter(latencyTracker, Components.Configuration.LocalServer.TransportServer.Fqdn, arrivalTime, arrivalTime, true, false, true);
            string           text             = latencyFormatter.FormatAndUpdatePerfCounters();

            this.LogMessageTrackingInfo(result.RemoteHostName, StoreDriverSubmission.LocalIPAddress, Components.Configuration.LocalServer.TransportServer.Name, mapiEvent, result, text);
            if (result.ErrorCode == 0U)
            {
                MailboxTransportSubmissionAssistant.IncrementSuccessfulSubmissionPerfmon();
                if (MailboxTransportSubmissionService.StoreDriverTracer.IsMessageAMapiSubmitLAMProbe)
                {
                    MailItemSubmitter.WriteLamNotificationEvent("EventHandled", text, result.MessageId, mapiEvent.MailboxGuid, MailboxTransportSubmissionService.StoreDriverTracer.MessageProbeLamNotificationIdParts);
                }
            }
        }
        // Token: 0x0600005D RID: 93 RVA: 0x000049A4 File Offset: 0x00002BA4
        public XElement GetDiagnosticInfo()
        {
            XElement root = new XElement("CurrentSubmissions");

            this.map.ForEach(null, delegate(Thread thread, SubmissionsInProgress.Entry entry)
            {
                thread.Suspend();
                StackTrace content;
                try
                {
                    content = new StackTrace(thread, true);
                }
                finally
                {
                    thread.Resume();
                }
                XElement xelement = new XElement("Submission");
                xelement.Add(new object[]
                {
                    new XElement("ThreadID", thread.ManagedThreadId),
                    new XElement("Duration", (default(ExDateTime) == entry.StartTime) ? TimeSpan.Zero : (ExDateTime.UtcNow - entry.StartTime)),
                    new XElement("EventCounter", entry.EventCounter),
                    new XElement("EntryID", (entry.EntryID == null) ? null : BitConverter.ToString(entry.EntryID)),
                    new XElement("DatabaseWatermark", new object[]
                    {
                        new XElement("EventCounter", (entry.DatabaseWatermark == null) ? 0L : entry.DatabaseWatermark.EventCounter),
                        new XElement("MailboxGuid", (entry.DatabaseWatermark == null) ? Guid.Empty : entry.DatabaseWatermark.MailboxGuid)
                    }),
                    new XElement("MailboxGuid", entry.MailboxGuid),
                    new XElement("ObjectClass", entry.ObjectClass),
                    new XElement("ClientType", entry.ClientType),
                    new XElement("CreateTime", entry.CreateTime),
                    new XElement("DocumentID", entry.DocumentID),
                    new XElement("EventFlags", entry.EventFlags),
                    new XElement("EventMask", entry.EventMask),
                    new XElement("ExtendedEventFlags", entry.ExtendedEventFlags),
                    new XElement("SecurityID", entry.SecurityID),
                    new XElement("Sender", entry.Sender),
                    new XElement("MdbGuid", entry.MdbGuid),
                    new XElement("StackTrace", content),
                    (entry.LatencyTracker == null) ? null : LatencyFormatter.GetDiagnosticInfo(entry.LatencyTracker)
                });
                root.Add(xelement);
            });
            return(root);
        }
        public XElement GetDiagnosticInfo()
        {
            XElement root = new XElement("CurrentDeliveries");

            this.map.ForEach(null, delegate(ulong sessionID, MailItemDeliver mailItemDeliver)
            {
                mailItemDeliver.Thread.Suspend();
                StackTrace content;
                try
                {
                    content = new StackTrace(mailItemDeliver.Thread, true);
                }
                finally
                {
                    mailItemDeliver.Thread.Resume();
                }
                XElement xelement = new XElement("Delivery");
                xelement.Add(new object[]
                {
                    new XElement("ThreadID", mailItemDeliver.Thread.ManagedThreadId),
                    new XElement("SessionID", sessionID),
                    new XElement("CurrentRecipientDuration", (default(ExDateTime) == mailItemDeliver.RecipientStartTime) ? TimeSpan.Zero : (ExDateTime.UtcNow - mailItemDeliver.RecipientStartTime)),
                    new XElement("MessageID", mailItemDeliver.MbxTransportMailItem.InternetMessageId),
                    new XElement("Recipient", (mailItemDeliver.Recipient == null) ? null : mailItemDeliver.Recipient.Email.ToString()),
                    new XElement("MDB", mailItemDeliver.MbxTransportMailItem.DatabaseName),
                    new XElement("MailboxServer", StoreDriverDelivery.MailboxServerFqdn),
                    new XElement("MessageSize", mailItemDeliver.MbxTransportMailItem.MimeSize),
                    new XElement("RecipientCount", mailItemDeliver.MbxTransportMailItem.Recipients.Count),
                    new XElement("TMIRecipientCount", mailItemDeliver.MbxTransportMailItem.MailItemRecipientCount),
                    new XElement("Sender", mailItemDeliver.MbxTransportMailItem.MimeSender),
                    new XElement("StackTrace", content),
                    LatencyFormatter.GetDiagnosticInfo(mailItemDeliver.MbxTransportMailItem.LatencyTracker)
                });
                root.Add(xelement);
            });
            return(root);
        }