internal static void UpdateDeliveryExceptionStatisticRecords(MessageStatus messageStatus, int lastOccurrencesPerException, int callstacksPerBucket, MailItemDeliver mailItemDeliver)
 {
     StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord deliveryOccurrenceRecord = new StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord(DateTime.UtcNow, mailItemDeliver.MbxTransportMailItem.DatabaseName, StoreDriverDelivery.MailboxServerFqdn, mailItemDeliver.MbxTransportMailItem.InternetMessageId, mailItemDeliver.Recipient.Email, mailItemDeliver.RecipientStartTime, mailItemDeliver.SessionId, mailItemDeliver.MbxTransportMailItem.MimeSize, mailItemDeliver.MbxTransportMailItem.MailItemRecipientCount, mailItemDeliver.MbxTransportMailItem.MimeSender, mailItemDeliver.MbxTransportMailItem.RoutingTimeStamp, mailItemDeliver.Stage);
     if (lastOccurrencesPerException > 0)
     {
         string key = StoreDriverDeliveryDiagnostics.GenerateExceptionKey(messageStatus);
         lock (StoreDriverDeliveryDiagnostics.deliveryExceptionStatisticRecords)
         {
             StoreDriverDeliveryDiagnostics.ExceptionStatisticRecord <StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord> value;
             if (!StoreDriverDeliveryDiagnostics.deliveryExceptionStatisticRecords.TryGetValue(key, out value))
             {
                 value = default(StoreDriverDeliveryDiagnostics.ExceptionStatisticRecord <StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord>);
                 value.LastOccurrences = new Queue <StoreDriverDeliveryDiagnostics.DeliveryOccurrenceRecord>(lastOccurrencesPerException);
             }
             if (value.LastOccurrences.Count == lastOccurrencesPerException)
             {
                 value.LastOccurrences.Dequeue();
             }
             value.LastOccurrences.Enqueue(deliveryOccurrenceRecord);
             value.CountSinceServiceStart++;
             StoreDriverDeliveryDiagnostics.deliveryExceptionStatisticRecords[key] = value;
         }
     }
     StoreDriverDeliveryDiagnostics.UpdateDeliveryExceptionCallstackRecords(messageStatus, callstacksPerBucket, deliveryOccurrenceRecord);
 }
        public static bool DetectDeliveryHang(out string hangBreadcrumb)
        {
            if (StoreDriverDeliveryDiagnostics.HangDetector == null)
            {
                StoreDriverDeliveryDiagnostics.Diag.TraceDebug(0L, "Store driver component is being initialized and HangDetector hasn't been created yet, we are not hanging.");
                hangBreadcrumb = null;
                return(false);
            }
            ulong           num;
            MailItemDeliver mailItemDeliver;

            if (StoreDriverDeliveryDiagnostics.HangDetector.DetectHang(Components.Configuration.AppConfig.RemoteDelivery.StoreDriverRecipientDeliveryHangThreshold, out num, out mailItemDeliver))
            {
                hangBreadcrumb = mailItemDeliver.DeliveryBreadcrumb.ToString();
                string[] messageArgs = new string[]
                {
                    num.ToString(),
                    (mailItemDeliver.Recipient == null) ? "NotSet" : mailItemDeliver.Recipient.Email.ToString(),
                    Components.Configuration.AppConfig.RemoteDelivery.StoreDriverRecipientDeliveryHangThreshold.ToString(),
                    hangBreadcrumb
                };
                if (mailItemDeliver.MbxTransportMailItem != null)
                {
                    PoisonMessage.Context = new MessageContext(mailItemDeliver.MbxTransportMailItem.RecordId, mailItemDeliver.MbxTransportMailItem.InternetMessageId, MessageProcessingSource.StoreDriverLocalDelivery);
                }
                StoreDriverDeliveryDiagnostics.LogEvent(MailboxTransportEventLogConstants.Tuple_DeliveryHang, "DeliveryHang", messageArgs);
                return(true);
            }
            hangBreadcrumb = null;
            return(false);
        }
Ejemplo n.º 3
0
 public void Start(bool initiallyPaused, ServiceState targetRunningState)
 {
     lock (this.syncObject)
     {
         ADNotificationAdapter.RunADOperation(delegate()
         {
             try
             {
                 StoreDriverDelivery.localIp       = Dns.GetHostEntry("localhost");
                 StoreDriverDelivery.localFqdn     = StoreDriverDelivery.localIp.HostName;
                 StoreDriverDelivery.localDomain   = StoreDriverDelivery.GetDomainNameFromFqdn(StoreDriverDelivery.localFqdn);
                 StoreDriverDelivery.localHostName = StoreDriverDelivery.GetShortNameFromFqdn(StoreDriverDelivery.localFqdn);
             }
             catch (SocketException ex)
             {
                 StoreDriverDeliveryDiagnostics.Diag.TraceError <string>(0L, "Start failed: {0}", ex.ToString());
                 StoreDriverDeliveryDiagnostics.LogEvent(MailboxTransportEventLogConstants.Tuple_StoreDriverGetLocalIPFailure, null, new object[]
                 {
                     ex
                 });
                 throw new TransportComponentLoadFailedException(ex.Message, ex);
             }
             ProcessAccessManager.RegisterComponent(this);
             StoreDriverDeliveryDiagnostics.Diag.TraceDebug(0L, "Start delivery");
         }, 1);
     }
 }
 internal static void RecordExceptionForDiagnostics(MessageStatus messageStatus, IMessageConverter messageConverter)
 {
     if (messageStatus.Exception != null && (messageStatus.Action == MessageAction.NDR || messageStatus.Action == MessageAction.Retry || messageStatus.Action == MessageAction.RetryQueue || messageStatus.Action == MessageAction.Reroute || messageStatus.Action == MessageAction.RetryMailboxServer || messageStatus.Action == MessageAction.Skip))
     {
         StoreDriverDeliveryDiagnostics.UpdateDeliveryExceptionStatisticRecords(messageStatus, Components.TransportAppConfig.RemoteDelivery.MaxStoreDriverDeliveryExceptionOccurrenceHistoryPerException, Components.Configuration.AppConfig.RemoteDelivery.MaxStoreDriverDeliveryExceptionCallstackHistoryPerBucket, (MailItemDeliver)messageConverter);
         StoreDriverDeliveryDiagnostics.TrapCallstackWithConfiguredSubstring(messageStatus, Components.TransportAppConfig.RemoteDelivery.StoreDriverExceptionCallstackToTrap);
     }
 }
Ejemplo n.º 5
0
 private void ValidateLegacyDN(MailRecipient recipient, string legacyDN)
 {
     if (string.IsNullOrEmpty(legacyDN))
     {
         string text = recipient.Email.ToString();
         StoreDriverDeliveryDiagnostics.LogEvent(MailboxTransportEventLogConstants.Tuple_DeliveryFailedNoLegacyDN, text, new object[]
         {
             text
         });
         throw new SmtpResponseException(AckReason.NoLegacyDN, MessageAction.Reroute);
     }
 }
 public override void MarkPoisonMessageHandled(string poisonId)
 {
     try
     {
         base.MarkPoisonMessageHandled(poisonId);
     }
     catch (UnauthorizedAccessException ex)
     {
         StoreDriverDeliveryDiagnostics.LogEvent(MailboxTransportEventLogConstants.Tuple_PoisonMessageMarkFailedRegistryAccessDenied, null, new object[]
         {
             ex.Message
         });
     }
 }
 public override void SavePoisonContext()
 {
     try
     {
         base.SavePoisonContext();
     }
     catch (UnauthorizedAccessException ex)
     {
         StoreDriverDeliveryDiagnostics.LogEvent(MailboxTransportEventLogConstants.Tuple_PoisonMessageSaveFailedRegistryAccessDenied, null, new object[]
         {
             ex.Message
         });
     }
 }
 public override void Load()
 {
     try
     {
         base.Load();
     }
     catch (UnauthorizedAccessException ex)
     {
         StoreDriverDeliveryDiagnostics.LogEvent(MailboxTransportEventLogConstants.Tuple_PoisonMessageLoadFailedRegistryAccessDenied, null, new object[]
         {
             ex.Message
         });
         throw new TransportComponentLoadFailedException(Strings.PoisonMessageRegistryAccessFailed, ex);
     }
 }
Ejemplo n.º 9
0
 public void Load()
 {
     try
     {
         MExEvents.Initialize(Path.Combine(ConfigurationContext.Setup.InstallPath, "TransportRoles\\Shared\\agents.config"), ProcessTransportRole.MailboxDelivery, LatencyAgentGroup.StoreDriver, "Microsoft.Exchange.Data.Transport.StoreDriverDelivery.StoreDriverDeliveryAgent");
         ResourceHealthMonitorManager.Initialize(ResourceHealthComponent.Transport);
         StoreDriverDeliveryDiagnostics.Initialize();
         StoreDriverDelivery.InitializePerformanceCounterMaintenance();
     }
     catch (ExchangeConfigurationException ex)
     {
         StoreDriverDeliveryDiagnostics.Diag.TraceError((long)this.GetHashCode(), "StoreDriver.Load threw ExchangeConfigurationException: shutting down service.");
         StoreDriverDelivery.eventLogger.LogEvent(TransportEventLogConstants.Tuple_CannotStartAgents, null, new object[]
         {
             ex.LocalizedString,
             ex
         });
         this.Stop();
     }
 }
        XElement IDiagnosable.GetDiagnosticInfo(DiagnosableParameters parameters)
        {
            bool     flag     = parameters.Argument.IndexOf("exceptions", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag2    = parameters.Argument.IndexOf("callstacks", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag3    = parameters.Argument.IndexOf("verbose", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag4    = flag3 || parameters.Argument.IndexOf("basic", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag5    = parameters.Argument.IndexOf("currentThreads", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag6    = flag4 || parameters.Argument.IndexOf("config", StringComparison.OrdinalIgnoreCase) != -1;
            bool     flag7    = !flag6 || parameters.Argument.IndexOf("help", StringComparison.OrdinalIgnoreCase) != -1;
            XElement xelement = new XElement(((IDiagnosable)this).GetDiagnosticComponentName());

            if (flag7)
            {
                xelement.Add(new XElement("help", "Supported arguments: config, basic, verbose, exceptions, callstacks, currentThreads, help."));
            }
            if (flag4)
            {
                xelement.Add(new XElement("deliveringThreads", StoreDriverDeliveryDiagnostics.deliveringThreads));
                xelement.Add(DeliveryThrottling.Instance.DeliveryServerDiagnostics);
                xelement.Add(DeliveryThrottling.Instance.DeliveryDatabaseDiagnostics);
                xelement.Add(DeliveryThrottling.Instance.DeliveryRecipientDiagnostics);
            }
            if (flag5 && StoreDriverDeliveryDiagnostics.HangDetector != null)
            {
                xelement.Add(StoreDriverDeliveryDiagnostics.HangDetector.GetDiagnosticInfo());
            }
            if (flag3)
            {
                XElement xelement2 = new XElement("HealthHistory");
                foreach (DatabaseHealthBreadcrumb databaseHealthBreadcrumb in ((IEnumerable <DatabaseHealthBreadcrumb>)StoreDriverDeliveryDiagnostics.healthHistory))
                {
                    xelement2.Add(databaseHealthBreadcrumb.GetDiagnosticInfo());
                }
                xelement.Add(xelement2);
                xelement.Add(MailItemDeliver.GetDiagnosticInfo());
                string content;
                using (StringWriter stringWriter = new StringWriter(new StringBuilder(1024)))
                {
                    MemoryTraceBuilder memoryTraceBuilder = StoreDriverDeliveryDiagnostics.TroubleshootingContext.MemoryTraceBuilder;
                    if (memoryTraceBuilder == null)
                    {
                        stringWriter.Write("No traces were flushed from any thread yet, or in-memory tracing is disabled.");
                    }
                    else
                    {
                        memoryTraceBuilder.Dump(stringWriter, true, true);
                    }
                    content = stringWriter.ToString();
                }
                xelement.Add(new XElement("tracing", content));
            }
            if (flag)
            {
                StoreDriverDeliveryDiagnostics.DumpExceptionStatistics(xelement);
            }
            if (flag2)
            {
                StoreDriverDeliveryDiagnostics.DumpExceptionCallstacks(xelement);
            }
            return(xelement);
        }
Ejemplo n.º 11
0
        public SmtpResponse DoLocalDelivery(TransportMailItem item)
        {
            ulong num  = 0UL;
            ulong num2 = 0UL;
            ulong num3 = 0UL;
            MbxTransportMailItem mbxTransportMailItem = null;
            string sourceContext = string.Empty;

            if (StoreDriverDelivery.SilentlyDropProbeMessages(item))
            {
                return(SmtpResponse.ProbeMessageDropped);
            }
            try
            {
                item.CacheTransportSettings();
                ExTraceGlobals.FaultInjectionTracer.TraceTest(2735091005U);
                num3 = SessionId.GetNextSessionId();
                mbxTransportMailItem = new MbxTransportMailItem(item);
                mbxTransportMailItem.SessionStartTime = DateTime.UtcNow;
                sourceContext = StoreDriverDelivery.GenerateSessionSourceContext(num3, mbxTransportMailItem.SessionStartTime);
                StoreDriverDelivery.SetupLatencyTracker(mbxTransportMailItem);
                StoreDriverDelivery.ResolveItemRecipients(item);
                if (!this.ResolveMdbParameters(mbxTransportMailItem, num3))
                {
                    return(mbxTransportMailItem.Response);
                }
                StoreDriverDelivery.ScopeADRecipientCache(item);
                ConnectionLog.MapiDeliveryConnectionStart(num3, mbxTransportMailItem.DatabaseName, string.Format("Delivery;MailboxServer={0};Database={1}", StoreDriverDelivery.MailboxServerFqdn, mbxTransportMailItem.DatabaseName));
                if (this.retired)
                {
                    ConnectionLog.MapiDeliveryConnectionRetired(num3, mbxTransportMailItem.DatabaseName);
                    return(SmtpResponseGenerator.StoreDriverRetireResponse);
                }
                MSExchangeStoreDriver.MessageDeliveryAttempts.Increment();
                MSExchangeStoreDriver.CurrentDeliveryThreads.Increment();
                StoreDriverDeliveryDiagnostics.IncrementDeliveringThreads();
                StoreDriverDeliveryDiagnostics.Diag.TracePfd <int, string>(0L, "PFD ESD {0} Start local delivery to {1}", 21403, mbxTransportMailItem.DatabaseName);
                ConnectionLog.MapiDeliveryConnectionStartingDelivery(num3, mbxTransportMailItem.DatabaseName);
                int num4 = this.DeliverMailItem(mbxTransportMailItem, num3);
                if (0 < num4)
                {
                    num  += (ulong)mbxTransportMailItem.MimeSize;
                    num2 += (ulong)((long)num4);
                }
                ConnectionLog.MapiDeliveryConnectionStop(num3, mbxTransportMailItem.DatabaseName, 1UL, num, num2);
            }
            catch (ADTransientException exception)
            {
                if (mbxTransportMailItem == null)
                {
                    mbxTransportMailItem = new MbxTransportMailItem(item);
                }
                RetryException exception2 = new RetryException(new MessageStatus(MessageAction.Retry, AckReason.RecipientMailboxLocationInfoNotAvailable, exception));
                StoreDriverDelivery.AckMailItemOnRetryException(AckStatus.Retry, mbxTransportMailItem, exception2, sourceContext, num3, num, num2);
                ExTraceGlobals.FaultInjectionTracer.TraceTest(48992U);
            }
            catch (RetryException exception3)
            {
                StoreDriverDelivery.AckMailItemOnRetryException(AckStatus.Retry, mbxTransportMailItem, exception3, sourceContext, num3, num, num2);
            }
            finally
            {
                StoreDriverDeliveryDiagnostics.DecrementDeliveringThreads();
                MSExchangeStoreDriver.CurrentDeliveryThreads.Decrement();
                StoreDriverDeliveryDiagnostics.Diag.TracePfd <int, string>(0L, "PFD ESD {0} Stop local delivery to {1}", 17563, mbxTransportMailItem.DatabaseName);
                StoreDriverDeliveryDiagnostics.TroubleshootingContext.TraceOperationCompletedAndUpdateContext();
            }
            return(mbxTransportMailItem.Response);
        }