private void ExtractConstraintSetHierarchy(LoadContainer databaseContainer)
        {
            DirectoryDatabase directoryDatabase           = (DirectoryDatabase)base.DirectoryObject;
            Dictionary <string, LoadContainer> dictionary = new Dictionary <string, LoadContainer>();

            foreach (DirectoryMailbox directoryMailbox in directoryDatabase.GetMailboxes())
            {
                TopologyExtractor extractor = base.ExtractorFactory.GetExtractor(directoryMailbox);
                IMailboxProvisioningConstraints mailboxProvisioningConstraints = directoryMailbox.MailboxProvisioningConstraints;
                string text = null;
                if (mailboxProvisioningConstraints != null)
                {
                    text = mailboxProvisioningConstraints.HardConstraint.Value;
                }
                text = (text ?? string.Empty);
                if (!dictionary.ContainsKey(text))
                {
                    DirectoryIdentity identity        = new DirectoryIdentity(DirectoryObjectType.ConstraintSet, Guid.NewGuid(), text, directoryMailbox.Identity.OrganizationId);
                    DirectoryObject   directoryObject = new DirectoryObject(base.DirectoryObject.Directory, identity);
                    LoadContainer     value           = new LoadContainer(directoryObject, ContainerType.ConstraintSet);
                    dictionary.Add(text, value);
                    databaseContainer.AddChild(dictionary[text]);
                }
                LoadEntity extractedEntity = extractor.ExtractEntity();
                this.AddEntityToContainer(dictionary[text], extractedEntity);
            }
        }
示例#2
0
 protected IEnumerable <LoadContainer> GetDatabasesMatchingConstraint(IMailboxProvisioningConstraints provisioningConstraint)
 {
     foreach (LoadContainer container in this.GetAvailableDatabases())
     {
         DirectoryDatabase database = container.DirectoryObject as DirectoryDatabase;
         if (database != null && provisioningConstraint.IsMatch(database.MailboxProvisioningAttributes))
         {
             yield return(container);
         }
     }
     yield break;
 }
 public MailboxProvisioningData(ByteQuantifiedSize totalDataSize, IMailboxProvisioningConstraints mailboxProvisioningConstraintses = null, LoadMetricStorage consumedLoad = null)
 {
     this.TotalDataSize = totalDataSize;
     this.MailboxProvisioningConstraints = mailboxProvisioningConstraintses;
     if (consumedLoad == null)
     {
         this.ConsumedLoad = new LoadMetricStorage();
         this.ConsumedLoad[PhysicalSize.Instance] = PhysicalSize.Instance.GetUnitsForSize(totalDataSize);
         return;
     }
     this.ConsumedLoad = consumedLoad;
 }
示例#4
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);
        }