protected override void ProcessRequest()
        {
            string text = string.Format("MsExchMlb:Band:{0:yyyyMMddhhmm}", ExDateTime.UtcNow);

            using (OperationTracker.Create(this.logger, "Rebalancing forest with StartMoves={0}, using LoadBalancer={1}, BatchName={2}", new object[]
            {
                this.startMoves,
                this.loadBalancer,
                text
            }))
            {
                List <BandMailboxRebalanceData> list = new List <BandMailboxRebalanceData>();
                foreach (LoadPartition loadPartition in this.partitionExtractor.GetPartitions(this.forestTopology))
                {
                    this.logger.LogInformation("Load balancing partition for MailboxProvisioningConstraint \"{0}\"", new object[]
                    {
                        loadPartition.ConstraintSetIdentity
                    });
                    IEnumerable <BandMailboxRebalanceData> enumerable = this.loadBalancer.BalanceForest(loadPartition.Root);
                    foreach (BandMailboxRebalanceData bandMailboxRebalanceData in enumerable)
                    {
                        bandMailboxRebalanceData.RebalanceBatchName    = text;
                        bandMailboxRebalanceData.ConstraintSetIdentity = loadPartition.ConstraintSetIdentity;
                        list.Add(bandMailboxRebalanceData);
                        if (this.startMoves)
                        {
                            this.moveStarter.ProcessRebalanceRequest(bandMailboxRebalanceData);
                        }
                    }
                }
                this.Results = list;
            }
        }
예제 #2
0
        protected virtual IAnchorRunspaceProxy GetRunspace()
        {
            IAnchorRunspaceProxy result;

            using (OperationTracker.Create(this.anchorContext.Logger, "Creating a new runspace.", new object[0]))
            {
                result = AnchorRunspaceProxy.CreateRunspaceForDatacenterAdmin(this.anchorContext, "Mailbox Load Balance");
            }
            return(result);
        }
예제 #3
0
 protected override void ProcessRequest()
 {
     using (OperationTracker.Create(this.logger, "Applying processor {0} to mailbox {1}.", new object[]
     {
         this.Processor.GetType().FullName,
         this.Mailbox.Identity
     }))
     {
         using (RunspaceReservation runspaceReservation = this.cmdletPool.AcquireRunspace())
         {
             this.Processor.ProcessMailbox(this.Mailbox, runspaceReservation.Runspace);
         }
     }
 }
 protected override void ProcessRequest()
 {
     using (OperationTracker.Create(this.logger, "Rebalancing {0} from {1} to {2}.", new object[]
     {
         this.rebalanceData.RebalanceInformation,
         this.rebalanceData.SourceDatabase,
         this.rebalanceData.TargetDatabase
     }))
     {
         this.logger.Log(MigrationEventType.Information, "MOVE: Moving {0} from {1} to {2}.", new object[]
         {
             this.rebalanceData.RebalanceInformation,
             this.rebalanceData.SourceDatabase,
             this.rebalanceData.TargetDatabase
         });
         Band[] bands = this.rebalanceData.RebalanceInformation.Metrics.OfType <Band>().ToArray <Band>();
         TopologyExtractorFactory entitySelectorFactory = this.serviceContext.TopologyExtractorFactoryContextPool.GetContext(this.clientFactory, bands, this.nonMovableOrgs, this.logger).GetEntitySelectorFactory();
         DirectoryDatabase        database              = this.directoryProvider.GetDatabase(this.rebalanceData.SourceDatabase.Guid);
         LoadContainer            container             = entitySelectorFactory.GetExtractor(database).ExtractTopology();
         IOperationRetryManager   operationRetryManager = LoadBalanceOperationRetryManager.Create(this.logger);
         foreach (LoadMetric loadMetric in this.rebalanceData.RebalanceInformation.Metrics)
         {
             EntitySelector selector = loadMetric.GetSelector(container, this.rebalanceData.ConstraintSetIdentity, this.rebalanceData.RebalanceInformation[loadMetric]);
             if (selector.IsEmpty)
             {
                 this.logger.Log(MigrationEventType.Information, "Could not find any mailbox for metric {0} in database {1}.", new object[]
                 {
                     loadMetric,
                     this.rebalanceData.SourceDatabase
                 });
             }
             else
             {
                 this.logger.Log(MigrationEventType.Information, "Found mailboxes matching the metric {0} in database {1}. Requesting the injections.", new object[]
                 {
                     loadMetric,
                     this.rebalanceData.SourceDatabase
                 });
                 operationRetryManager.TryRun(delegate
                 {
                     DirectoryDatabase database2 = (DirectoryDatabase)this.directoryProvider.GetDirectoryObject(this.rebalanceData.TargetDatabase.DirectoryObjectIdentity);
                     using (IInjectorService injectorClientForDatabase = this.clientFactory.GetInjectorClientForDatabase(database2))
                     {
                         injectorClientForDatabase.InjectMoves(this.rebalanceData.TargetDatabase.Guid, this.rebalanceData.RebalanceBatchName, selector.GetEntities(this.rebalanceData.TargetDatabase));
                     }
                 });
             }
         }
     }
 }
 private void RefreshCachedValue()
 {
     using (OperationTracker.Create(this.logger, "Refreshing topology for {0}.", new object[]
     {
         this.directoryObject
     }))
     {
         this.cachedValue = this.topologyExtractor.ExtractTopology();
         ExAssert.RetailAssert(this.cachedValue != null, "ExtractTopology for directoryObject: {0} should never return null.  TopologyExtractor: {1}", new object[]
         {
             this.directoryObject,
             this.topologyExtractor
         });
     }
 }
        private IPhysicalMailbox LoadMailboxData()
        {
            IPhysicalMailbox result;

            using (OperationTracker.Create(this.logger, "Retrieving single mailbox {0} data from database {1}", new object[]
            {
                this.Guid,
                this.database.Identity
            }))
            {
                using (IPhysicalDatabase physicalDatabaseConnection = this.clientFactory.GetPhysicalDatabaseConnection(this.database))
                {
                    result = (physicalDatabaseConnection.GetMailbox(this.Guid) ?? EmptyPhysicalMailbox.Instance);
                }
            }
            return(result);
        }
        private void BeginProcessingMailbox(DirectoryMailbox mailbox)
        {
            IRequestQueue requestQueue = (mailbox.Parent != null) ? this.context.QueueManager.GetProcessingQueue(mailbox.Parent) : this.context.QueueManager.MainProcessingQueue;

            string[] source = LoadBalanceADSettings.Instance.Value.ExcludedMailboxProcessors.Split(new char[]
            {
                ','
            });
            IList <MailboxProcessor> list = this.processors(this.context.QueueManager) ?? ((IList <MailboxProcessor>)Array <MailboxProcessor> .Empty);

            foreach (MailboxProcessor mailboxProcessor in list)
            {
                if (source.Contains(mailboxProcessor.Name))
                {
                    this.context.Logger.LogVerbose("Skipping processor {0} because it is disabled.", new object[]
                    {
                        mailboxProcessor.Name
                    });
                }
                else if (!mailboxProcessor.ShouldProcess(mailbox))
                {
                    this.context.Logger.LogVerbose("Processor {0} doesn't want to process the mailbox, ignored.", new object[]
                    {
                        mailboxProcessor.Name
                    });
                }
                else if (mailboxProcessor.RequiresRunspace)
                {
                    requestQueue.EnqueueRequest(new ProcessMailboxRequest(mailbox, mailboxProcessor, this.context.Logger, this.context.CmdletPool));
                }
                else
                {
                    using (OperationTracker.Create(this.context.Logger, "Applying processor {0} to mailbox {1}.", new object[]
                    {
                        mailboxProcessor.GetType().FullName,
                        mailbox.Identity
                    }))
                    {
                        mailboxProcessor.ProcessMailbox(mailbox, null);
                    }
                }
            }
        }
        protected override void ProcessRequest()
        {
            this.logger.LogInformation("Starting to drain database {0} with batch name {1}.", new object[]
            {
                this.directoryDatabase.Identity,
                this.batchName
            });
            IOperationRetryManager operationRetryManager = LoadBalanceOperationRetryManager.Create(this.logger);

            using (OperationTracker.Create(this.logger, "Moving mailboxes out of {0}.", new object[]
            {
                this.directoryDatabase.Identity
            }))
            {
                foreach (DirectoryMailbox mailboxToMove2 in this.directoryDatabase.GetMailboxes())
                {
                    DirectoryMailbox mailboxToMove = mailboxToMove2;
                    operationRetryManager.TryRun(delegate
                    {
                        this.moveInjector.InjectMoveForMailbox(mailboxToMove, this.batchName);
                    });
                }
            }
            this.logger.LogInformation("Draining database {0}: Cleaning soft deleted mailboxes.", new object[]
            {
                this.directoryDatabase.Identity
            });
            using (OperationTracker.Create(this.logger, "Starting soft deleted cleanup for {0}.", new object[]
            {
                this.directoryDatabase.Identity
            }))
            {
                this.serviceContext.CleanupSoftDeletedMailboxesOnDatabase(this.directoryDatabase.Identity, ByteQuantifiedSize.Zero);
            }
            this.logger.LogInformation("Finished processing the draining of database {0}.", new object[]
            {
                this.directoryDatabase.Identity
            });
            if (this.OnDrainFinished != null)
            {
                this.OnDrainFinished(this.directoryDatabase);
            }
        }
예제 #9
0
 private void PopulateDirectoryObjectFromIdentity(LoadEntity entity)
 {
     using (OperationTracker.Create(this.logger, "Re-hydrating directory object of type {0} on load entity.", new object[]
     {
         entity.DirectoryObjectIdentity.ObjectType
     }))
     {
         if (entity.DirectoryObjectIdentity != null)
         {
             try
             {
                 entity.DirectoryObject = this.directory.GetDirectoryObject(entity.DirectoryObjectIdentity);
             }
             catch (LocalizedException exception)
             {
                 this.logger.LogError(exception, "Failed to rehydrate object with identity '{0}'.", new object[]
                 {
                     entity.DirectoryObjectIdentity
                 });
             }
         }
     }
 }
예제 #10
0
        public MailboxProvisioningResult GetDatabase(MailboxProvisioningData provisioningData)
        {
            MailboxProvisioningResult result;

            using (OperationTracker.Create(this.logger, "Selecting database for '{0}' using {1}.", new object[]
            {
                provisioningData,
                base.GetType().Name
            }))
            {
                MailboxProvisioningResult mailboxProvisioningResult = new MailboxProvisioningResult
                {
                    Status = MailboxProvisioningResultStatus.ConstraintCouldNotBeSatisfied,
                    MailboxProvisioningConstraints = provisioningData.MailboxProvisioningConstraints
                };
                IMailboxProvisioningConstraints provisioningConstraint      = provisioningData.MailboxProvisioningConstraints ?? new MailboxProvisioningConstraints();
                IEnumerable <LoadContainer>     databasesMatchingConstraint = this.GetDatabasesMatchingConstraint(provisioningConstraint);
                List <LoadContainer>            list = new List <LoadContainer>(300);
                foreach (LoadContainer loadContainer in databasesMatchingConstraint)
                {
                    mailboxProvisioningResult.Status = MailboxProvisioningResultStatus.InsufficientCapacity;
                    LoadMetric loadMetric;
                    long       num;
                    long       num2;
                    if (!loadContainer.CanAcceptRegularLoad)
                    {
                        this.logger.Log(MigrationEventType.Instrumentation, "Database '{0}' cannot accept regular load, skipping.", new object[]
                        {
                            loadContainer.DirectoryObjectIdentity
                        });
                    }
                    else if (!loadContainer.AvailableCapacity.SupportsAdditional(provisioningData.ConsumedLoad, out loadMetric, out num, out num2))
                    {
                        this.logger.Log(MigrationEventType.Instrumentation, "Database '{0}' does not have sufficient capacity for the provisioning request. The {1} requested units of {2} would exceed the {3} available. Skipped.", new object[]
                        {
                            loadContainer.DirectoryObjectIdentity,
                            num,
                            loadMetric,
                            num2
                        });
                    }
                    else
                    {
                        list.Add(loadContainer);
                    }
                }
                if (list.Any <LoadContainer>())
                {
                    LoadContainer loadContainer2 = list[new Random().Next(0, list.Count)];
                    mailboxProvisioningResult.Status   = MailboxProvisioningResultStatus.Valid;
                    mailboxProvisioningResult.Database = loadContainer2.DirectoryObjectIdentity;
                    loadContainer2.CommittedLoad      += provisioningData.ConsumedLoad;
                    this.logger.Log(MigrationEventType.Instrumentation, "Selected database {0} with {1} max, {2} consumed and {3} available.", new object[]
                    {
                        loadContainer2.DirectoryObjectIdentity,
                        loadContainer2.MaximumLoad,
                        loadContainer2.ConsumedLoad,
                        loadContainer2.AvailableCapacity
                    });
                }
                result = mailboxProvisioningResult;
            }
            return(result);
        }