private static void LogRetryExceptionInConnectionLog(RetryException exception, MbxTransportMailItem mbxItem, string sourceContext, ulong sessionId, ulong bytesDelivered, ulong recipientCount) { StringBuilder stringBuilder = new StringBuilder(400); stringBuilder.Append("Lost connection - scheduling retry. "); if (exception.MessageStatus.Exception != null) { string exceptionTypeString = StorageExceptionHandler.GetExceptionTypeString(exception.MessageStatus.Exception); string exceptionDiagnosticInfo = StorageExceptionHandler.GetExceptionDiagnosticInfo(exception.MessageStatus.Exception); if (string.IsNullOrEmpty(exceptionDiagnosticInfo)) { stringBuilder.AppendFormat(CultureInfo.InvariantCulture, "SmtpResponse: {0}: {1}: {2}.", new object[] { exception.MessageStatus.Response, exception.StoreDriverContext, exceptionTypeString }); } else { stringBuilder.AppendFormat(CultureInfo.InvariantCulture, "SmtpResponse: {0}: {1}: {2}: {3}", new object[] { exception.MessageStatus.Response, exception.StoreDriverContext, exceptionTypeString, exceptionDiagnosticInfo }); } } ConnectionLog.MapiDeliveryConnectionLost(sessionId, mbxItem.DatabaseName, stringBuilder.ToString(), 1UL, bytesDelivered, recipientCount); }
private static void AckMailItemOnRetryException(AckStatus status, MbxTransportMailItem mailItem, RetryException exception, string sourceContext, ulong sessionId, ulong bytesDelivered, ulong recipientCount) { StoreDriverDeliveryDiagnostics.Diag.TraceDebug <RetryException, AckStatus>(0L, "StoreDriverDelivery encountered an exception {0}. Message Action: {1}.", exception, status); if (exception.MessageStatus.Action == MessageAction.RetryQueue) { mailItem.MessageLevelAction = MessageAction.RetryQueue; } mailItem.AckMailItem(status, exception.MessageStatus.Response, new AckDetails(StoreDriverDelivery.localHostName), exception.MessageStatus.RetryInterval, sourceContext); StoreDriverDelivery.LogRetryExceptionInConnectionLog(exception, mailItem, sourceContext, sessionId, bytesDelivered, recipientCount); }
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); }