diff --git a/scaler/scaler.go b/scaler/scaler.go index cb1dd75..bb976c8 100644 --- a/scaler/scaler.go +++ b/scaler/scaler.go @@ -170,6 +170,11 @@ func (s *Scaler) scaleIn(desired int64, current AutoscaleGroupDetails) error { } desired = current.DesiredCount + factoredChange + + if desired < current.MinSize { + log.Printf("⚠️ Post scalein-factor desired count lower than MinSize, capping at %d", current.MinSize) + desired = current.MinSize + } } // Correct negative values if we get them @@ -222,6 +227,11 @@ func (s *Scaler) scaleOut(desired int64, current AutoscaleGroupDetails) error { } desired = current.DesiredCount + factoredChange + + if desired > current.MaxSize { + log.Printf("⚠️ Post scaleout-factor desired count exceed MaxSize, capping at %d", current.MaxSize) + desired = current.MaxSize + } } log.Printf("Scaling OUT 📈 to %d instances (currently %d)", desired, current.DesiredCount) diff --git a/scaler/scaler_test.go b/scaler/scaler_test.go index 9d91a42..24064ca 100644 --- a/scaler/scaler_test.go +++ b/scaler/scaler_test.go @@ -111,6 +111,19 @@ func TestScalingOutWithoutError(t *testing.T) { currentDesiredCapacity: 11, expectedDesiredCapacity: 12, }, + // Scale-out with a factor too large + { + metrics: buildkite.AgentMetrics{ + ScheduledJobs: 10, + }, + params: Params{ + AgentsPerInstance: 1, + ScaleOutParams: ScaleParams{ + Factor: 500.0, + }, + }, + expectedDesiredCapacity: 100.0, + }, // Cool-down period is enforced { metrics: buildkite.AgentMetrics{