in src/main/java/com/amazonaws/services/kinesis/scaling/StreamScalingUtils.java [394:450]
public static int getNewShardCount(int currentShardCount, Integer scaleCount, Integer scalePct,
ScaleDirection scalingDirection, Integer minShardsAllowed, Integer maxShardsAllowed) {
int newShardCount = 0;
if (scalingDirection.equals(ScaleDirection.UP)) {
if (scaleCount != null) {
newShardCount = currentShardCount + scaleCount;
} else {
// convert the scaling factor to a % above 100 if below - many customers use
// values above or below as the config value is an int
Double scalingFactor = 0D;
if (scalePct < 100) {
scalingFactor = Double.valueOf(100 + scalePct) / 100D;
} else {
scalingFactor = Double.valueOf(scalePct) / 100D;
}
newShardCount = Double.valueOf(Math.ceil(Double.valueOf(currentShardCount) * scalingFactor)).intValue();
if (maxShardsAllowed != null && newShardCount > maxShardsAllowed) {
newShardCount = maxShardsAllowed;
}
}
} else {
if (scaleCount != null) {
newShardCount = currentShardCount - scaleCount;
} else {
// scaling by %
Double scalingFactor = 0D;
// reduce the scaling factor by 100, if above 100 - many customers use either as
// the config value is an int
if (scalePct > 100) {
scalingFactor = Double.valueOf(scalePct) / 100D;
newShardCount = Double.valueOf(Math.floor(Double.valueOf(currentShardCount) / scalingFactor))
.intValue();
} else {
scalingFactor = Double.valueOf(scalePct) / 100D;
newShardCount = currentShardCount
- Double.valueOf(Math.floor(Double.valueOf(currentShardCount) * scalingFactor)).intValue();
}
// add a guard against any decision going below 1
// guard against going below min
if (minShardsAllowed != null && newShardCount < minShardsAllowed) {
newShardCount = minShardsAllowed;
} else {
if (newShardCount < 1) {
newShardCount = 1;
}
}
}
}
return newShardCount;
}