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); }
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); } }
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); } }
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); }
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); }