Exemplo n.º 1
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);
     }
 }
Exemplo n.º 2
0
 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);
 }
Exemplo n.º 3
0
        private static Guid GetHeaderValueAsGuid(Header header)
        {
            string headerValue = StoreDriverDelivery.GetHeaderValue(header);
            Guid   result;

            if (!string.IsNullOrEmpty(headerValue) && Guid.TryParse(headerValue, out result))
            {
                return(result);
            }
            return(Guid.Empty);
        }
Exemplo n.º 4
0
        private static Guid GetAddressBookPolicy(HeaderList headers)
        {
            ArgumentValidator.ThrowIfNull("headers", headers);
            Header header = headers.FindFirst("X-MS-Exchange-ABP-GUID");

            if (header != null)
            {
                return(StoreDriverDelivery.GetHeaderValueAsGuid(header));
            }
            return(Guid.Empty);
        }
Exemplo n.º 5
0
        private static Guid GetGal(HeaderList headers)
        {
            ArgumentValidator.ThrowIfNull("headers", headers);
            Header header = headers.FindFirst("X-MS-Exchange-Forest-GAL-Scope");

            if (header != null)
            {
                return(StoreDriverDelivery.GetHeaderValueAsGuid(header));
            }
            return(Guid.Empty);
        }
Exemplo n.º 6
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();
     }
 }
Exemplo n.º 7
0
        private static void ScopeADRecipientCache(TransportMailItem item)
        {
            Guid gal = StoreDriverDelivery.GetGal(item.RootPart.Headers);

            if (gal == Guid.Empty)
            {
                return;
            }
            ADObjectId        scopingAddressListId                     = new ADObjectId(gal);
            ADSessionSettings sessionSettings                          = ADSessionSettings.FromOrganizationIdWithAddressListScopeServiceOnly(item.OrganizationId, scopingAddressListId);
            IRecipientSession tenantOrRootOrgRecipientSession          = DirectorySessionFactory.Default.GetTenantOrRootOrgRecipientSession(ConsistencyMode.IgnoreInvalid, sessionSettings, 921, "ScopeADRecipientCache", "f:\\15.00.1497\\sources\\dev\\MailboxTransport\\src\\MailboxTransportDelivery\\StoreDriver\\StoreDriverDelivery.cs");
            ADRecipientCache <TransportMiniRecipient> adrecipientCache = new ADRecipientCache <TransportMiniRecipient>(tenantOrRootOrgRecipientSession, TransportMiniRecipientSchema.Properties, 1, item.OrganizationId);
            Guid addressBookPolicy = StoreDriverDelivery.GetAddressBookPolicy(item.RootPart.Headers);

            foreach (ProxyAddress proxyAddress in item.ADRecipientCache.Keys)
            {
                Result <TransportMiniRecipient> result;
                if (item.ADRecipientCache.TryGetValue(proxyAddress, out result) && result.Data != null && result.Data.AddressBookPolicy != null && result.Data.AddressBookPolicy.ObjectGuid == addressBookPolicy)
                {
                    adrecipientCache.AddCacheEntry(proxyAddress, result);
                }
            }
            item.ADRecipientCache = adrecipientCache;
        }
        private void ConstructComponentLoadTree()
        {
            TransportAppConfig.IsMemberOfResolverConfiguration transportIsMemberOfResolverConfig = Components.TransportAppConfig.TransportIsMemberOfResolverConfig;
            IsMemberOfResolverADAdapter <RoutingAddress> .RoutingAddressResolver adAdapter       = new IsMemberOfResolverADAdapter <RoutingAddress> .RoutingAddressResolver(transportIsMemberOfResolverConfig.DisableDynamicGroups);

            TransportAppConfig.IsMemberOfResolverConfiguration     mailboxRulesIsMemberOfResolverConfig = Components.TransportAppConfig.MailboxRulesIsMemberOfResolverConfig;
            IsMemberOfResolverADAdapter <string> .LegacyDNResolver adAdapter2 = new IsMemberOfResolverADAdapter <string> .LegacyDNResolver(mailboxRulesIsMemberOfResolverConfig.DisableDynamicGroups);

            Components.AgentComponent   = new AgentComponent();
            Components.RoutingComponent = new RoutingComponent();
            Components.EnhancedDns      = new EnhancedDns();
            Components.DsnGenerator     = new DsnGenerator();
            Components.UnhealthyTargetFilterComponent          = new UnhealthyTargetFilterComponent();
            Components.TransportIsMemberOfResolverComponent    = new IsMemberOfResolverComponent <RoutingAddress>("Transport", transportIsMemberOfResolverConfig, adAdapter);
            Components.MailboxRulesIsMemberOfResolverComponent = new IsMemberOfResolverComponent <string>("MailboxRules", mailboxRulesIsMemberOfResolverConfig, adAdapter2);
            Components.StoreDriverDelivery        = StoreDriverDelivery.CreateStoreDriver();
            Components.Categorizer                = this.submitHandler;
            Components.CertificateComponent       = new CertificateComponent();
            Components.Configuration              = new ConfigurationComponent(ProcessTransportRole.MailboxDelivery);
            Components.MessageThrottlingComponent = new MessageThrottlingComponent();
            Components.ResourceManagerComponent   = new ResourceManagerComponent(ResourceManagerResources.PrivateBytes | ResourceManagerResources.TotalBytes);
            Components.SmtpInComponent            = new SmtpInComponent(this.IsModernSmtpStackEnabled());
            Components.SmtpOutConnectionHandler   = new SmtpOutConnectionHandler();
            Components.SystemCheckComponent       = new SystemCheckComponent();
            Components.TransportMailItemLoader item = new Components.TransportMailItemLoader();
            Components.ProxyHubSelectorComponent = new ProxyHubSelectorComponent();
            Components.PoisonMessageComponent    = new PoisonMessage();
            Components.Logging           = new Components.LoggingComponent(false, false, false, false, false);
            StorageFactory.SchemaToUse   = StorageFactory.Schema.NullSchema;
            Components.MessagingDatabase = new MessagingDatabaseComponent();
            Components.PerfCountersLoader perfCountersLoader = new Components.PerfCountersLoader(false);
            Components.PerfCountersLoaderComponent = perfCountersLoader;
            Components.ResourceThrottlingComponent = new ResourceThrottlingComponent(new ResourceMeteringConfig(8000, null), new ResourceThrottlingConfig(null), new ComponentsWrapper(), Components.MessagingDatabase, null, Components.Configuration, ResourceManagerResources.PrivateBytes | ResourceManagerResources.TotalBytes, ResourceObservingComponents.EnhancedDns | ResourceObservingComponents.IsMemberOfResolver | ResourceObservingComponents.SmtpIn);
            ParallelTransportComponent parallelTransportComponent = new ParallelTransportComponent("Parallel Group 1");

            parallelTransportComponent.TransportComponents.Add(Components.ResourceManagerComponent);
            parallelTransportComponent.TransportComponents.Add(Components.CertificateComponent);
            parallelTransportComponent.TransportComponents.Add(Components.TransportIsMemberOfResolverComponent);
            parallelTransportComponent.TransportComponents.Add(Components.MailboxRulesIsMemberOfResolverComponent);
            ParallelTransportComponent parallelTransportComponent2 = new ParallelTransportComponent("Parallel Group 2");

            parallelTransportComponent2.TransportComponents.Add(item);
            parallelTransportComponent2.TransportComponents.Add(new Components.MicrosoftExchangeRecipientLoader());
            parallelTransportComponent2.TransportComponents.Add(perfCountersLoader);
            parallelTransportComponent2.TransportComponents.Add(Components.Logging);
            parallelTransportComponent2.TransportComponents.Add(Components.PoisonMessageComponent);
            parallelTransportComponent2.TransportComponents.Add(Components.MessageThrottlingComponent);
            parallelTransportComponent2.TransportComponents.Add(Components.StoreDriverDelivery);
            parallelTransportComponent2.TransportComponents.Add((ITransportComponent)Components.AgentComponent);
            ParallelTransportComponent parallelTransportComponent3 = new ParallelTransportComponent("Parallel Group 3");

            parallelTransportComponent3.TransportComponents.Add(Components.SmtpInComponent);
            parallelTransportComponent3.TransportComponents.Add(Components.SmtpOutConnectionHandler);
            parallelTransportComponent3.TransportComponents.Add(Components.RoutingComponent);
            parallelTransportComponent3.TransportComponents.Add(Components.UnhealthyTargetFilterComponent);
            parallelTransportComponent3.TransportComponents.Add(Components.DsnGenerator);
            parallelTransportComponent3.TransportComponents.Add(DeliveryConfiguration.poisonHandler);
            Components.SetRootComponent(new SequentialTransportComponent("Root Component")
            {
                TransportComponents =
                {
                    (ITransportComponent)Components.Configuration,
                    Components.SystemCheckComponent,
                    parallelTransportComponent,
                    parallelTransportComponent2,
                    parallelTransportComponent3,
                    Components.ResourceThrottlingComponent,
                    Components.ProxyHubSelectorComponent
                }
            });
        }
Exemplo n.º 9
0
        private int DeliverMailItem(MbxTransportMailItem mailItem, ulong sessionId)
        {
            int result = 0;

            TraceHelper.MessageProbeActivityId = mailItem.SystemProbeId;
            TraceHelper.StoreDriverDeliveryTracer.TracePass <string>(TraceHelper.MessageProbeActivityId, 0L, "Delivery: Processing started for MessageId {0}.", mailItem.InternetMessageId ?? "NULL");
            TimeSpan?retryInterval;

            using (MailItemDeliver mailItemDeliver = new MailItemDeliver(mailItem, sessionId))
            {
                try
                {
                    StoreDriverDeliveryDiagnostics.HangDetector[sessionId] = mailItemDeliver;
                    mailItemDeliver.DeliverToRecipients();
                }
                finally
                {
                    StoreDriverDeliveryDiagnostics.HangDetector.Remove(sessionId);
                }
                result        = mailItemDeliver.DeliveredRecipients;
                retryInterval = mailItemDeliver.RetryInterval;
            }
            AckDetails ackDetails = new AckDetails(StoreDriverDelivery.localHostName);

            ackDetails.AddEventData("MailboxDatabaseName", mailItem.DatabaseName);
            mailItem.AckMailItem(AckStatus.Success, SmtpResponse.NoopOk, ackDetails, retryInterval, StoreDriverDelivery.GenerateSessionSourceContext(sessionId, mailItem.SessionStartTime));
            TraceHelper.StoreDriverDeliveryTracer.TracePass <string>(TraceHelper.MessageProbeActivityId, 0L, "Delivery: Processing complete for MessageID {0}.", mailItem.InternetMessageId ?? "NULL");
            return(result);
        }
Exemplo n.º 10
0
        private bool ResolveMdbParameters(MbxTransportMailItem mbxItem, ulong sessionId)
        {
            bool         flag         = false;
            ProxyAddress proxyAddress = ProxyAddress.Parse("SMTP:" + mbxItem.Recipients[0].ToString());
            Result <TransportMiniRecipient> result;

            if (mbxItem.ADRecipientCache.TryGetValue(proxyAddress, out result) && result.Data != null)
            {
                if (result.Data.Database != null)
                {
                    mbxItem.DatabaseGuid = result.Data.Database.ObjectGuid;
                    mbxItem.DatabaseName = result.Data.Database.Name;
                    flag = true;
                }
                else if (result.Data.RecipientTypeDetails == RecipientTypeDetails.PublicFolder)
                {
                    ADObjectId adobjectId = null;
                    if (mbxItem.Recipients[0].ExtendedProperties.TryGetValue <ADObjectId>("Microsoft.Exchange.Transport.DirectoryData.Database", out adobjectId) && adobjectId != null)
                    {
                        mbxItem.DatabaseGuid = adobjectId.ObjectGuid;
                        mbxItem.DatabaseName = adobjectId.Name;
                        flag = true;
                    }
                }
            }
            if (flag)
            {
                Guid databaseGuid = mbxItem.DatabaseGuid;
                if (mbxItem.DatabaseGuid == Guid.Empty)
                {
                    flag = false;
                    StoreDriverDeliveryDiagnostics.Diag.TraceWarning <long>(0L, "MDB parameters were found but were null or empty for item {0}.", mbxItem.RecordId);
                }
            }
            if (!flag)
            {
                mbxItem.AckMailItem(AckStatus.Fail, AckReason.MissingMdbProperties, null, null, StoreDriverDelivery.GenerateSessionSourceContext(sessionId, mbxItem.SessionStartTime));
                StoreDriverDeliveryDiagnostics.Diag.TraceWarning <long>(0L, "Failed to get MDB parameters for item {0}.", mbxItem.RecordId);
            }
            return(flag);
        }
Exemplo 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);
        }
Exemplo n.º 12
0
 public void Unload()
 {
     MExEvents.Shutdown();
     StoreDriverDelivery.ShutdownPerformanceCounterMaintenance();
 }