Пример #1
0
        protected virtual void InjectMoves(LoadContainer database, BatchName batchName, IEnumerable <LoadEntity> mailboxes, bool throwIfNotValid)
        {
            IRequestQueue          injectorQueue         = this.queueManager.GetInjectionQueue((DirectoryDatabase)database.DirectoryObject);
            IOperationRetryManager operationRetryManager = LoadBalanceOperationRetryManager.Create(this.logger);

            using (IEnumerator <LoadEntity> enumerator = mailboxes.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    LoadEntity mailbox = enumerator.Current;
                    if (mailbox.DirectoryObject == null)
                    {
                        this.logger.Log(MigrationEventType.Warning, "Not injecting move for {0} because its DirectoryObject is null", new object[]
                        {
                            mailbox
                        });
                    }
                    else
                    {
                        OperationRetryManagerResult operationRetryManagerResult = operationRetryManager.TryRun(delegate
                        {
                            DirectoryObject directoryObject = mailbox.DirectoryObject;
                            ConstraintValidationResult constraintValidationResult = database.Constraint.Accept(mailbox);
                            if (constraintValidationResult.Accepted)
                            {
                                database.CommittedLoad += mailbox.ConsumedLoad;
                                if (directoryObject.SupportsMoving)
                                {
                                    DirectoryObject directoryObject2 = database.DirectoryObject;
                                    IRequest request = directoryObject.CreateRequestToMove(directoryObject2.Identity, batchName.ToString(), this.logger);
                                    injectorQueue.EnqueueRequest(request);
                                    return;
                                }
                                if (throwIfNotValid)
                                {
                                    throw new ObjectCannotBeMovedException(mailbox.DirectoryObjectIdentity.ObjectType.ToString(), mailbox.DirectoryObjectIdentity.ToString());
                                }
                            }
                            else
                            {
                                this.logger.Log(MigrationEventType.Warning, "Not injecting move for {0} because it violates the target database constraints: {1}", new object[]
                                {
                                    mailbox,
                                    constraintValidationResult
                                });
                                if (throwIfNotValid)
                                {
                                    constraintValidationResult.Constraint.ValidateAccepted(mailbox);
                                }
                            }
                        });
                        if (!operationRetryManagerResult.Succeeded && throwIfNotValid)
                        {
                            throw operationRetryManagerResult.Exception;
                        }
                    }
                }
            }
        }
Пример #2
0
        public void ProcessRebalanceRequest(BandMailboxRebalanceData rebalanceRequest)
        {
            AnchorUtil.ThrowOnNullArgument(rebalanceRequest, "rebalanceRequest");
            BandRebalanceRequest request         = new BandRebalanceRequest(rebalanceRequest, this.clientFactory, this.logger);
            LoadContainer        sourceDatabase  = rebalanceRequest.SourceDatabase;
            IRequestQueue        processingQueue = this.GetProcessingQueue(sourceDatabase);

            processingQueue.EnqueueRequest(request);
        }
        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);
                    }
                }
            }
        }