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); }
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); }