コード例 #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);
            }
        }
コード例 #2
0
        // Token: 0x0600003D RID: 61 RVA: 0x00003D68 File Offset: 0x00001F68
        private void HandleEventError(MapiEvent mapiEvent, MailSubmissionResult result, LatencyTracker latencyTracker, string eventContext)
        {
            uint errorCode = result.ErrorCode;

            if (errorCode == 22U)
            {
                MailboxTransportSubmissionAssistant.IncrementSuccessfulPoisonNdrSubmissionPerfmon();
            }
            else if (errorCode == 23U)
            {
                MailboxTransportSubmissionAssistant.IncrementPermanentFailedPoisonNdrSubmissionPerfmon();
            }
            else if (HResult.IsHandled(errorCode))
            {
                if (HResult.IsNonActionable(errorCode))
                {
                    MailboxTransportSubmissionAssistant.IncrementNonActionableFailedSubmissionPerfmon();
                }
                else if (!HResult.IsMessageSubmittedOrHasNoRcpts(errorCode))
                {
                    MailboxTransportSubmissionAssistant.IncrementFailedSubmissionPerfmon();
                }
            }
            else if (HResult.IsRetryableAtCurrentHub(errorCode))
            {
                MailboxTransportSubmissionAssistant.IncrementTemporarySubmissionFailuresPerfmon();
            }
            MailboxTransportSubmissionAssistant.ComputePercentSubmissionsPerfmon(false);
            if (11U == errorCode)
            {
                MailboxTransportSubmissionService.StoreDriverTracer.ServiceTracer.TraceFail <string>(MailboxTransportSubmissionService.StoreDriverTracer.MessageProbeActivityId, (long)this.GetHashCode(), "Submission for message {0} was throttled, retry happens in 1 minute.", mapiEvent.ItemEntryIdString);
                MailboxTransportSubmissionAssistant.BeginTrackLatency(mapiEvent, latencyTracker, LatencyComponent.SubmissionAssistantThrottling);
                throw new TransientMailboxException(MailboxTransportSubmissionAssistant.RetryScheduleMessageThrottling);
            }
            if (errorCode == 1140850696U)
            {
                MailboxTransportSubmissionService.StoreDriverTracer.ServiceTracer.TraceFail <uint, string>(MailboxTransportSubmissionService.StoreDriverTracer.MessageProbeActivityId, (long)this.GetHashCode(), "Resource is in Quarantined State. Error Code: {0}; Event Context: {1}", errorCode, eventContext);
                throw new TransientMailboxException(new RetrySchedule(FinalAction.RetryForever, TimeSpan.MaxValue, new TimeSpan[]
                {
                    result.QuarantineTimeSpan
                }));
            }
            if (24U == errorCode)
            {
                MailboxTransportSubmissionService.StoreDriverTracer.ServiceTracer.TraceFail <uint, string>(MailboxTransportSubmissionService.StoreDriverTracer.MessageProbeActivityId, (long)this.GetHashCode(), "NDR for Poison Message was not successful. Retry. Error Code: {0}, Event context: {1}.", errorCode, eventContext);
                MailboxTransportSubmissionAssistant.IncrementTemporaryPoisonNdrSubmissionFailuresPerfmon();
                throw new TransientServerException(MailboxTransportSubmissionAssistant.RetrySchedulePoisonNdr);
            }
            if (HResult.IsHandled(errorCode))
            {
                MailboxTransportSubmissionService.StoreDriverTracer.ServiceTracer.TraceFail <uint, string>(MailboxTransportSubmissionService.StoreDriverTracer.MessageProbeActivityId, (long)this.GetHashCode(), "Submission was handled.  Error code {0}, event context {1}.", errorCode, eventContext);
                return;
            }
            if (2684354560U == errorCode)
            {
                MailboxTransportSubmissionService.StoreDriverTracer.ServiceTracer.TraceFail <string>(MailboxTransportSubmissionService.StoreDriverTracer.MessageProbeActivityId, (long)this.GetHashCode(), "Submission for message {0} was throttled at smtp, retry happens in 1 minute.", mapiEvent.ItemEntryIdString);
                throw new TransientMailboxException(MailboxTransportSubmissionAssistant.RetryScheduleGeneric);
            }
            if (HResult.IsRetryableAtCurrentHub(errorCode))
            {
                MailboxTransportSubmissionService.StoreDriverTracer.ServiceTracer.TraceFail <uint, string>(MailboxTransportSubmissionService.StoreDriverTracer.MessageProbeActivityId, (long)this.GetHashCode(), "Submission was not successful. Retry at current hub error code {0}, event context {1}.", errorCode, eventContext);
                if (HResult.IsRetryMailbox(errorCode))
                {
                    throw new TransientMailboxException(MailboxTransportSubmissionAssistant.RetryScheduleGeneric);
                }
                if (HResult.IsRetryMailboxDatabase(errorCode))
                {
                    throw new TransientDatabaseException(MailboxTransportSubmissionAssistant.RetryScheduleGeneric);
                }
                if (HResult.IsRetryMailboxServer(errorCode))
                {
                    throw new TransientServerException(MailboxTransportSubmissionAssistant.RetryScheduleGeneric);
                }
                return;
            }
            else
            {
                if (HResult.IsRetryableAtOtherHub(errorCode))
                {
                    MailboxTransportSubmissionService.StoreDriverTracer.ServiceTracer.TraceFail <uint, string>(MailboxTransportSubmissionService.StoreDriverTracer.MessageProbeActivityId, (long)this.GetHashCode(), "Submission was not successful. Retry other hub error code {0}, event context {1}.", errorCode, eventContext);
                    throw new TransientServerException(MailboxTransportSubmissionAssistant.RetryScheduleGeneric);
                }
                throw new InvalidOperationException("Internal error. ErrorCode is: " + errorCode);
            }
        }
コード例 #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);
                }
            }
        }
コード例 #4
0
        // Token: 0x0600003A RID: 58 RVA: 0x00003ACC File Offset: 0x00001CCC
        private void LogMessageTrackingInfo(string remoteHostName, IPAddress localIP, string localServerName, MapiEvent mapiEvent, MailSubmissionResult result, string latencyString)
        {
            SubmissionRecord.Drop(this.successHistory, this.failureHistory, mapiEvent, result);
            string text = this.FormatMapiEventInfo(mapiEvent);
            MsgTrackMapiSubmitInfo msgTrackInfo;

            if (result.ErrorCode == 0U)
            {
                MailboxTransportSubmissionService.StoreDriverTracer.ServiceTracer.TracePass <string>(MailboxTransportSubmissionService.StoreDriverTracer.MessageProbeActivityId, (long)this.GetHashCode(), "Submission succeeded for {0}", text);
                msgTrackInfo = new MsgTrackMapiSubmitInfo(text, null, remoteHostName, localIP, localServerName, result.Sender, result.From, result.MessageId, MailboxTransportSubmissionAssistant.ItemEntryId(mapiEvent), Components.Configuration.LocalServer.TransportServer.MessageTrackingLogSubjectLoggingEnabled ? result.Subject : "[Undisclosed]", latencyString, result.DiagnosticInfo, null != mapiEvent, result.ExternalOrganizationId, result.OrganizationId, result.RecipientAddresses, MailDirectionality.Originating, result.NetworkMessageId, result.OriginalClientIPAddress);
            }
            else
            {
                string text2 = HResult.GetStringForErrorCode(result.ErrorCode);
                if (!string.IsNullOrEmpty(result.DiagnosticInfo))
                {
                    text2 = "Error: " + text2 + ", Diagnostic Information: " + result.DiagnosticInfo;
                }
                MailboxTransportSubmissionService.StoreDriverTracer.ServiceTracer.TracePass <string, string>(MailboxTransportSubmissionService.StoreDriverTracer.MessageProbeActivityId, (long)this.GetHashCode(), "Submission failed for {0}, error: {1}", text, text2);
                if (!HResult.IsHandled(result.ErrorCode) && !MailboxTransportSubmissionAssistant.ShouldLogTemporaryFailures)
                {
                    return;
                }
                msgTrackInfo = new MsgTrackMapiSubmitInfo(text, null, remoteHostName, localIP, localServerName, result.Sender, result.MessageId, MailboxTransportSubmissionAssistant.ItemEntryId(mapiEvent), latencyString, text2, HResult.IsHandled(result.ErrorCode), null != mapiEvent, result.ExternalOrganizationId, result.OrganizationId, result.RecipientAddresses, MailDirectionality.Originating, result.NetworkMessageId);
            }
            if (11U == result.ErrorCode)
            {
                MessageTrackingLog.TrackThrottle(MessageTrackingSource.STOREDRIVER, msgTrackInfo, result.Sender, result.MessageId, MailDirectionality.Originating);
                return;
            }
            MessageTrackingLog.TrackMapiSubmit(msgTrackInfo);
        }
コード例 #5
0
 // Token: 0x0600004F RID: 79 RVA: 0x0000422C File Offset: 0x0000242C
 public static void Drop(Breadcrumbs <SubmissionRecord.Success> successHistory, Breadcrumbs <SubmissionRecord.Failure> failureHistory, object submissionData, MailSubmissionResult result)
 {
     if (result.ErrorCode == 0U)
     {
         successHistory.Drop(new SubmissionRecord.Success(submissionData, result.Sender, result.MessageId, result.Subject));
         return;
     }
     failureHistory.Drop(new SubmissionRecord.Failure(submissionData, HResult.GetStringForErrorCode(result.ErrorCode), result.DiagnosticInfo));
 }