internal static void UpdateSubmissionExceptionStatisticRecords(MessageStatus messageStatus, int lastOccurrencesPerException, int callstacksPerBucket, MailItemSubmitter mailItemSubmitter)
        {
            MapiSubmissionInfo mapiSubmissionInfo = mailItemSubmitter.SubmissionInfo as MapiSubmissionInfo;

            StoreDriverSubmission.SubmissionOccurrenceRecord submissionOccurrenceRecord = new StoreDriverSubmission.SubmissionOccurrenceRecord(DateTime.UtcNow, mailItemSubmitter.StartTime, mailItemSubmitter.SubmissionInfo.MdbGuid, (mapiSubmissionInfo == null) ? Guid.Empty : mapiSubmissionInfo.MailboxGuid, (mapiSubmissionInfo == null) ? null : mapiSubmissionInfo.EntryId, (mapiSubmissionInfo == null) ? null : mapiSubmissionInfo.ParentEntryId, (mapiSubmissionInfo == null) ? 0L : mapiSubmissionInfo.EventCounter, mailItemSubmitter.OrganizationId, mailItemSubmitter.ErrorCode, mailItemSubmitter.SubmissionInfo.MailboxFqdn, mailItemSubmitter.Item.HasMessageItem ? mailItemSubmitter.Item.Item.InternetMessageId : null, mailItemSubmitter.SubmissionConnectionId, mailItemSubmitter.MessageSize, mailItemSubmitter.RecipientCount, mailItemSubmitter.Result.Sender, mailItemSubmitter.Stage);
            if (lastOccurrencesPerException > 0)
            {
                string key = StoreDriverSubmission.GenerateExceptionKey(messageStatus);
                lock (StoreDriverSubmission.submissionExceptionStatisticRecords)
                {
                    StoreDriverSubmission.ExceptionStatisticRecord <StoreDriverSubmission.SubmissionOccurrenceRecord> value;
                    if (!StoreDriverSubmission.submissionExceptionStatisticRecords.TryGetValue(key, out value))
                    {
                        value = default(StoreDriverSubmission.ExceptionStatisticRecord <StoreDriverSubmission.SubmissionOccurrenceRecord>);
                        value.LastOccurrences = new Queue <StoreDriverSubmission.SubmissionOccurrenceRecord>(lastOccurrencesPerException);
                    }
                    if (value.LastOccurrences.Count == lastOccurrencesPerException)
                    {
                        value.LastOccurrences.Dequeue();
                    }
                    value.LastOccurrences.Enqueue(submissionOccurrenceRecord);
                    value.CountSinceServiceStart++;
                    StoreDriverSubmission.submissionExceptionStatisticRecords[key] = value;
                }
            }
            StoreDriverSubmission.UpdateSubmissionExceptionCallstackRecords(messageStatus, callstacksPerBucket, submissionOccurrenceRecord);
        }
Ejemplo n.º 2
0
 public MapiSubmissionItem(MapiSubmissionInfo mapiSubmissionInfo, MailItemSubmitter context, IStoreDriverTracer storeDriverTracer) : base("mapi", context, mapiSubmissionInfo, storeDriverTracer)
 {
     if (mapiSubmissionInfo == null)
     {
         throw new ArgumentNullException("mapiSubmissionInfo");
     }
     this.mapiSubmissionInfo = mapiSubmissionInfo;
 }
        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);
        }
 private string GetSubmissionContext(MapiSubmissionInfo submissionInfo)
 {
     return(string.Format(CultureInfo.InvariantCulture, "MDB:{0}, Mailbox:{1}, Event:{2}, CreationTime:{3}", new object[]
     {
         submissionInfo.MdbGuid,
         submissionInfo.MailboxGuid,
         submissionInfo.EventCounter,
         submissionInfo.OriginalCreateTime.ToString("yyyy-MM-ddTHH\\:mm\\:ss.fffZ", DateTimeFormatInfo.InvariantInfo)
     }));
 }
Ejemplo n.º 5
0
 protected override void Dispose(bool disposing)
 {
     try
     {
         if (disposing)
         {
             base.DisposeMessageItem();
             if (base.Session != null)
             {
                 if (base.Context != null)
                 {
                     LatencyTracker.BeginTrackLatency(LatencyComponent.MailboxTransportSubmissionStoreDriverSubmissionStoreDisposeSession, base.Context.LatencyTracker);
                 }
                 try
                 {
                     base.DisposeStoreSession();
                 }
                 finally
                 {
                     if (base.Context != null)
                     {
                         TimeSpan additionalLatency = LatencyTracker.EndTrackLatency(LatencyComponent.MailboxTransportSubmissionStoreDriverSubmissionStoreDisposeSession, base.Context.LatencyTracker);
                         base.Context.AddRpcLatency(additionalLatency, "Session dispose");
                     }
                 }
             }
             if (base.Context != null)
             {
                 MapiSubmissionInfo mapiSubmissionInfo = (MapiSubmissionInfo)base.Info;
                 base.StoreDriverTracer.MapiStoreDriverSubmissionTracer.TracePass(base.StoreDriverTracer.MessageProbeActivityId, 0L, "Event {0}, Mailbox {1}, Mdb {2}, RPC latency {4}", new object[]
                 {
                     mapiSubmissionInfo.EventCounter,
                     mapiSubmissionInfo.MailboxGuid,
                     mapiSubmissionInfo.MdbGuid,
                     base.Context.RpcLatency
                 });
             }
         }
     }
     finally
     {
         base.Dispose(disposing);
     }
 }
        public MailSubmissionResult SubmitMessage(string serverDN, Guid mailboxGuid, Guid mdbGuid, string databaseName, long eventCounter, byte[] entryId, byte[] parentEntryId, string serverFqdn, IPAddress networkAddressBytes, DateTime originalCreateTime, bool isPublicFolder, TenantPartitionHint tenantHint, string mailboxHopLatency, QuarantineHandler quarantineHandler, SubmissionPoisonHandler submissionPoisonHandler, LatencyTracker latencyTracker)
        {
            ArgumentValidator.ThrowIfNullOrEmpty("serverDN", serverDN);
            ArgumentValidator.ThrowIfEmpty("mailboxGuid", mailboxGuid);
            ArgumentValidator.ThrowIfEmpty("mdbGuid", mdbGuid);
            ArgumentValidator.ThrowIfNullOrEmpty("databaseName", databaseName);
            ArgumentValidator.ThrowIfNull("entryId", entryId);
            ArgumentValidator.ThrowIfInvalidValue <int>("entryId", entryId.Length, (int value) => value > 0);
            ArgumentValidator.ThrowIfNull("parentEntryId", parentEntryId);
            ArgumentValidator.ThrowIfInvalidValue <int>("parentEntryId", parentEntryId.Length, (int value) => value > 0);
            ArgumentValidator.ThrowIfNullOrEmpty("serverFqdn", serverFqdn);
            ArgumentValidator.ThrowIfNull("networkAddressBytes", networkAddressBytes);
            ArgumentValidator.ThrowIfNullOrEmpty("mailboxHopLatency", mailboxHopLatency);
            ArgumentValidator.ThrowIfNull("quarantineHandler", quarantineHandler);
            ArgumentValidator.ThrowIfNull("submissionPoisonHandler", submissionPoisonHandler);
            bool shouldDeprioritize = false;

            if (SubmissionConfiguration.Instance.App.SenderRateDeprioritizationEnabled)
            {
                long num = this.rateTrackerForDeprioritization.IncrementSenderRate(mailboxGuid, originalCreateTime);
                if (num > (long)SubmissionConfiguration.Instance.App.SenderRateDeprioritizationThreshold)
                {
                    shouldDeprioritize = true;
                }
            }
            bool shouldThrottle = false;

            if (SubmissionConfiguration.Instance.App.SenderRateThrottlingEnabled)
            {
                long num2 = this.rateTrackerForThrottling.IncrementSenderRate(mailboxGuid, originalCreateTime);
                if (num2 > (long)SubmissionConfiguration.Instance.App.SenderRateThrottlingThreshold)
                {
                    shouldThrottle = true;
                    this.rateTrackerForThrottling.ResetSenderRate(mailboxGuid, originalCreateTime);
                }
            }
            MapiSubmissionInfo submissionInfo = new MapiSubmissionInfo(serverDN, mailboxGuid, entryId, parentEntryId, eventCounter, serverFqdn, networkAddressBytes, mdbGuid, databaseName, originalCreateTime, isPublicFolder, tenantHint, mailboxHopLatency, latencyTracker, shouldDeprioritize, shouldThrottle, this.storeDriverTracer);

            return(this.SubmitMessageImpl(submissionInfo, submissionPoisonHandler, quarantineHandler));
        }
        private MailSubmissionResult SubmitMessageImpl(MapiSubmissionInfo submissionInfo, SubmissionPoisonHandler submissionPoisonHandler, QuarantineHandler quarantineHandler)
        {
            MailSubmissionResult mailSubmissionResult = new MailSubmissionResult();

            if (this.Retired)
            {
                mailSubmissionResult.ErrorCode = 2214592514U;
                return(mailSubmissionResult);
            }
            string mailboxFqdn = submissionInfo.MailboxFqdn;
            string database    = submissionInfo.MdbGuid.ToString();
            MailSubmissionResult result;

            using (submissionInfo.GetTraceFilter())
            {
                using (SubmissionConnectionWrapper connection = SubmissionConnectionPool.GetConnection(mailboxFqdn, database))
                {
                    using (SubmissionThreadLimiter submissionThreadLimiter = new SubmissionThreadLimiter())
                    {
                        SubmissionPoisonContext submissionPoisonContext = null;
                        try
                        {
                            submissionThreadLimiter.BeginSubmission(connection.Id, mailboxFqdn, database);
                            if (this.Retired)
                            {
                                mailSubmissionResult.ErrorCode = 2214592514U;
                                connection.SubmissionAborted("Retiring.");
                                result = mailSubmissionResult;
                            }
                            else
                            {
                                this.storeDriverTracer.StoreDriverSubmissionTracer.TracePfdPass <int, MapiSubmissionInfo>(this.storeDriverTracer.MessageProbeActivityId, 0L, "PFD ESD {0} Processing SubmitMessage for {1}", 27547, submissionInfo);
                                submissionPoisonContext = submissionInfo.GetPoisonContext();
                                MailItemSubmitter mailItemSubmitter2;
                                MailItemSubmitter mailItemSubmitter = mailItemSubmitter2 = new MailItemSubmitter(connection.Id, submissionInfo, this.sendAsManager, submissionPoisonHandler, submissionPoisonContext, this);
                                try
                                {
                                    QuarantineInfoContext quarantineInfoContext;
                                    TimeSpan timeSpan;
                                    if (SubmissionConfiguration.Instance.App.EnableMailboxQuarantine && quarantineHandler.IsResourceQuarantined(submissionPoisonContext.ResourceGuid, out quarantineInfoContext, out timeSpan))
                                    {
                                        mailSubmissionResult.ErrorCode          = 1140850696U;
                                        mailSubmissionResult.QuarantineTimeSpan = timeSpan;
                                        mailSubmissionResult.DiagnosticInfo     = string.Format("{0}:{1}, QuarantineRemainingTimeSpan:{2}", "QuarantineStart", quarantineInfoContext.QuarantineStartTime, timeSpan);
                                        connection.SubmissionFailed(string.Format("Resource {0} is in quarantined state", submissionPoisonContext.ResourceGuid));
                                        return(mailSubmissionResult);
                                    }
                                    if (this.PoisonMessageDectionEnabled && submissionPoisonHandler.VerifyPoisonMessage(submissionPoisonContext))
                                    {
                                        this.LogPoisonMessageMTL(submissionInfo, submissionPoisonContext);
                                        if (SubmissionConfiguration.Instance.App.EnableSendNdrForPoisonMessage)
                                        {
                                            if (!submissionPoisonHandler.VerifyPoisonNdrSent(submissionPoisonContext))
                                            {
                                                mailItemSubmitter.HandlePoisonMessageNdrSubmission();
                                                mailSubmissionResult.ErrorCode = StoreDriverSubmissionUtils.MapSubmissionStatusErrorCodeToPoisonErrorCode(mailItemSubmitter.Result.ErrorCode);
                                            }
                                        }
                                        else
                                        {
                                            mailSubmissionResult.ErrorCode = 3U;
                                        }
                                        connection.SubmissionAborted(string.Format("Poison Context Info: Resource = {0};EventCounter = {1}.", submissionPoisonContext.ResourceGuid, submissionPoisonContext.MapiEventCounter));
                                        return(mailSubmissionResult);
                                    }
                                    Thread currentThread = Thread.CurrentThread;
                                    try
                                    {
                                        this.SubmissionsInProgress[currentThread] = mailItemSubmitter;
                                        mailItemSubmitter.Submit();
                                        mailSubmissionResult.RemoteHostName = mailItemSubmitter.Result.RemoteHostName;
                                    }
                                    finally
                                    {
                                        this.SubmissionsInProgress.Remove(currentThread);
                                    }
                                }
                                finally
                                {
                                    if (mailItemSubmitter2 != null)
                                    {
                                        ((IDisposable)mailItemSubmitter2).Dispose();
                                    }
                                }
                                if (mailItemSubmitter.Result.ErrorCode == 0U)
                                {
                                    connection.SubmissionSuccessful(mailItemSubmitter.MessageSize, mailItemSubmitter.RecipientCount);
                                }
                                else
                                {
                                    StringBuilder stringBuilder = new StringBuilder();
                                    stringBuilder.Append("HResult: ");
                                    stringBuilder.Append(mailItemSubmitter.Result.ErrorCode.ToString());
                                    stringBuilder.Append("; DiagnosticInfo: ");
                                    stringBuilder.Append(mailItemSubmitter.Result.DiagnosticInfo);
                                    connection.SubmissionFailed(stringBuilder.ToString());
                                }
                                if (mailItemSubmitter.Result.ErrorCode == 3U)
                                {
                                    submissionInfo.LogEvent(SubmissionInfo.Event.StoreDriverSubmissionPoisonMessageInSubmission);
                                }
                                result = mailItemSubmitter.Result;
                            }
                        }
                        catch (ThreadLimitExceededException ex)
                        {
                            connection.SubmissionAborted(ex.Message);
                            mailSubmissionResult.ErrorCode      = 1090519042U;
                            mailSubmissionResult.DiagnosticInfo = ex.Message;
                            result = mailSubmissionResult;
                        }
                        catch (Exception exception)
                        {
                            try
                            {
                                submissionPoisonHandler.SavePoisonContext(submissionPoisonContext);
                                string exceptionDiagnosticInfo = StorageExceptionHandler.GetExceptionDiagnosticInfo(exception);
                                connection.SubmissionFailed("Exception: " + exceptionDiagnosticInfo);
                                submissionInfo.LogEvent(SubmissionInfo.Event.StoreDriverSubmissionPoisonMessage, exception);
                                FailFast.Fail(exception);
                            }
                            catch (Exception ex2)
                            {
                                StoreDriverSubmission.LogEvent(MSExchangeStoreDriverSubmissionEventLogConstants.Tuple_StoreDriverSubmissionFailFastFailure, null, new object[]
                                {
                                    ex2
                                });
                            }
                            result = mailSubmissionResult;
                        }
                    }
                }
            }
            return(result);
        }