public ThroughputModificationResult ApplyRule(string table_name, string index_name, long?new_read_capacity_units, long?new_write_capacity_units, ProvisionedThroughputDescription current_provisioned_throughput)
        {
            ThroughputModificationResult throughput_modification_result = new ThroughputModificationResult(index_id);

            long current_read_capacity_units  = current_provisioned_throughput.ReadCapacityUnits;
            long current_write_capacity_units = current_provisioned_throughput.WriteCapacityUnits;

            // if no new read capacity units has been determined and the current rule is set up with a read section, try to apply read rule
            if (!new_read_capacity_units.HasValue && read != null)
            {
                throughput_modification_result.read_result = read.ApplyRule(table_name, index_name, look_back_minutes, current_provisioned_throughput);
                new_read_capacity_units = throughput_modification_result.read_result.new_capacity_units;
            }

            // if no new write capacity units has been determined and the current rule is set up with a write section, try to apply write rule
            if (!new_write_capacity_units.HasValue && write != null)
            {
                throughput_modification_result.write_result = write.ApplyRule(table_name, index_name, look_back_minutes, current_provisioned_throughput);
                new_write_capacity_units = throughput_modification_result.write_result.new_capacity_units;
            }

            // look for decrease combination modifier eligibility
            if (
                (new_write_capacity_units.HasValue && new_write_capacity_units.Value < current_write_capacity_units && !new_read_capacity_units.HasValue && read != null) ||
                (new_read_capacity_units.HasValue && new_read_capacity_units.Value < current_read_capacity_units && !new_write_capacity_units.HasValue && write != null)
                )
            {
                if (new_write_capacity_units.HasValue && new_write_capacity_units.Value < current_write_capacity_units && !new_read_capacity_units.HasValue && read != null)
                {
                    throughput_modification_result.read_result.decrease_combination_modifier_result = read.GetNewDecreaseCombinationModifierCapacityUnits(current_provisioned_throughput);
                    if (throughput_modification_result.read_result.decrease_combination_modifier_result != null)
                    {
                        new_read_capacity_units = throughput_modification_result.read_result.decrease_combination_modifier_result.new_capacity_units;
                        throughput_modification_result.read_result.new_capacity_units = new_read_capacity_units;
                    }
                }
                else                 // if (new_read_capacity_units.HasValue && new_read_capacity_units.Value < current_read_capacity_units && !new_write_capacity_units.HasValue && write != null)
                {
                    throughput_modification_result.write_result.decrease_combination_modifier_result = write.GetNewDecreaseCombinationModifierCapacityUnits(current_provisioned_throughput);
                    if (throughput_modification_result.write_result.decrease_combination_modifier_result != null)
                    {
                        new_write_capacity_units = throughput_modification_result.write_result.decrease_combination_modifier_result.new_capacity_units;
                        throughput_modification_result.write_result.new_capacity_units = new_write_capacity_units;
                    }
                }
            }

            // apply minimum/maximum throughput configured in the rule
            if (throughput_modification_result.read_result != null)
            {
                throughput_modification_result.read_result.ApplyAdjustmentConstraints(read.minimum_throughput, read.maximum_throughput);
            }
            if (throughput_modification_result.write_result != null)
            {
                throughput_modification_result.write_result.ApplyAdjustmentConstraints(write.minimum_throughput, write.maximum_throughput);
            }

            return(throughput_modification_result);
        }
Пример #2
0
        private static ModifiedThroughput BuildModifiedThroughput(string table_name, string index_name, ProvisionedThroughputDescription current_provisioned_throughput, List <ThroughputModification> throughput_modifications)
        {
            ModifiedThroughput modified_throughput = new ModifiedThroughput(table_name, index_name, current_provisioned_throughput);
            long?new_read_capacity_units           = null;
            long?new_write_capacity_units          = null;

            for (int index = 0;
                 index < throughput_modifications.Count && (!new_read_capacity_units.HasValue || !new_write_capacity_units.HasValue);
                 index++)
            {
                ThroughputModification       throughput_modification        = throughput_modifications.ElementAt(index);
                ThroughputModificationResult throughput_modification_result = throughput_modification.ApplyRule(table_name, index_name, new_read_capacity_units, new_write_capacity_units, current_provisioned_throughput);
                modified_throughput.throughput_modification_results.Add(throughput_modification_result);

                if (throughput_modification_result.read_result != null)
                {
                    new_read_capacity_units = throughput_modification_result.read_result.new_capacity_units;
                }
                if (throughput_modification_result.write_result != null)
                {
                    new_write_capacity_units = throughput_modification_result.write_result.new_capacity_units;
                }
            }

            new_read_capacity_units  = new_read_capacity_units ?? current_provisioned_throughput.ReadCapacityUnits;
            new_write_capacity_units = new_write_capacity_units ?? current_provisioned_throughput.WriteCapacityUnits;
            if (new_read_capacity_units != current_provisioned_throughput.ReadCapacityUnits || new_write_capacity_units != current_provisioned_throughput.WriteCapacityUnits)
            {
                modified_throughput.new_provisioned_throughput = new ProvisionedThroughput
                {
                    ReadCapacityUnits  = new_read_capacity_units.Value,
                    WriteCapacityUnits = new_write_capacity_units.Value
                };
            }

            return(modified_throughput);
        }