Skip to content

Commit

Permalink
Fix nits and address comments
Browse files Browse the repository at this point in the history
  • Loading branch information
Duke0404 committed Sep 20, 2024
1 parent ee53762 commit a6f4fc2
Show file tree
Hide file tree
Showing 4 changed files with 44 additions and 44 deletions.
8 changes: 4 additions & 4 deletions cluster-autoscaler/config/autoscaling_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -297,10 +297,10 @@ type AutoscalingOptions struct {
AsyncNodeGroupsEnabled bool
// CheckCapacityBatchProcessing is used to enable/disable batch processing of check capacity provisioning class
CheckCapacityBatchProcessing bool
// MaxBatchSize is the maximum number of provisioning requests to process in a single batch
MaxBatchSize int
// BatchTimebox is the maximum time to spend processing a batch of provisioning requests
BatchTimebox time.Duration
// CheckCapacityProvisioningRequestMaxBatchSize is the maximum number of provisioning requests to process in a single batch
CheckCapacityProvisioningRequestMaxBatchSize int
// CheckCapacityProvisioningRequestBatchTimebox is the maximum time to spend processing a batch of provisioning requests
CheckCapacityProvisioningRequestBatchTimebox time.Duration
}

// KubeClientOptions specify options for kube client
Expand Down
30 changes: 15 additions & 15 deletions cluster-autoscaler/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -270,14 +270,14 @@ var (
"--max-graceful-termination-sec flag should not be set when this flag is set. Not setting this flag will use unordered evictor by default."+
"Priority evictor reuses the concepts of drain logic in kubelet(https://github.com/kubernetes/enhancements/tree/master/keps/sig-node/2712-pod-priority-based-graceful-node-shutdown#migration-from-the-node-graceful-shutdown-feature)."+
"Eg. flag usage: '10000:20,1000:100,0:60'")
provisioningRequestsEnabled = flag.Bool("enable-provisioning-requests", false, "Whether the clusterautoscaler will be handling the ProvisioningRequest CRs.")
frequentLoopsEnabled = flag.Bool("frequent-loops-enabled", false, "Whether clusterautoscaler triggers new iterations more frequently when it's needed")
asyncNodeGroupsEnabled = flag.Bool("async-node-groups", false, "Whether clusterautoscaler creates and deletes node groups asynchronously. Experimental: requires cloud provider supporting async node group operations, enable at your own risk.")
proactiveScaleupEnabled = flag.Bool("enable-proactive-scaleup", false, "Whether to enable/disable proactive scale-ups, defaults to false")
podInjectionLimit = flag.Int("pod-injection-limit", 5000, "Limits total number of pods while injecting fake pods. If unschedulable pods already exceeds the limit, pod injection is disabled but pods are not truncated.")
checkCapacityBatchProcessing = flag.Bool("check-capacity-batch-processing", false, "Whether to enable batch processing for check capacity requests.")
maxBatchSize = flag.Int("max-batch-size", 10, "Maximum number of provisioning requests to process in a single batch.")
batchTimebox = flag.Duration("batch-timebox", 5*time.Minute, "Maximum time to process a batch of provisioning requests.")
provisioningRequestsEnabled = flag.Bool("enable-provisioning-requests", false, "Whether the clusterautoscaler will be handling the ProvisioningRequest CRs.")
frequentLoopsEnabled = flag.Bool("frequent-loops-enabled", false, "Whether clusterautoscaler triggers new iterations more frequently when it's needed")
asyncNodeGroupsEnabled = flag.Bool("async-node-groups", false, "Whether clusterautoscaler creates and deletes node groups asynchronously. Experimental: requires cloud provider supporting async node group operations, enable at your own risk.")
proactiveScaleupEnabled = flag.Bool("enable-proactive-scaleup", false, "Whether to enable/disable proactive scale-ups, defaults to false")
podInjectionLimit = flag.Int("pod-injection-limit", 5000, "Limits total number of pods while injecting fake pods. If unschedulable pods already exceeds the limit, pod injection is disabled but pods are not truncated.")
checkCapacityBatchProcessing = flag.Bool("check-capacity-batch-processing", false, "Whether to enable batch processing for check capacity requests.")
checkCapacityProvisioningRequestMaxBatchSize = flag.Int("check-capacity-provisioning-request-max-batch-size", 1, "Maximum number of provisioning requests to process in a single batch.")
checkCapacityProvisioningRequestBatchTimebox = flag.Duration("check-capacity-provisioning-request-batch-timebox", 10*time.Second, "Maximum time to process a batch of provisioning requests.")
)

func isFlagPassed(name string) bool {
Expand Down Expand Up @@ -446,13 +446,13 @@ func createAutoscalingOptions() config.AutoscalingOptions {
MaxAllocatableDifferenceRatio: *maxAllocatableDifferenceRatio,
MaxFreeDifferenceRatio: *maxFreeDifferenceRatio,
},
DynamicNodeDeleteDelayAfterTaintEnabled: *dynamicNodeDeleteDelayAfterTaintEnabled,
BypassedSchedulers: scheduler_util.GetBypassedSchedulersMap(*bypassedSchedulers),
ProvisioningRequestEnabled: *provisioningRequestsEnabled,
AsyncNodeGroupsEnabled: *asyncNodeGroupsEnabled,
CheckCapacityBatchProcessing: *checkCapacityBatchProcessing,
MaxBatchSize: *maxBatchSize,
BatchTimebox: *batchTimebox,
DynamicNodeDeleteDelayAfterTaintEnabled: *dynamicNodeDeleteDelayAfterTaintEnabled,
BypassedSchedulers: scheduler_util.GetBypassedSchedulersMap(*bypassedSchedulers),
ProvisioningRequestEnabled: *provisioningRequestsEnabled,
AsyncNodeGroupsEnabled: *asyncNodeGroupsEnabled,
CheckCapacityBatchProcessing: *checkCapacityBatchProcessing,
CheckCapacityProvisioningRequestMaxBatchSize: *checkCapacityProvisioningRequestMaxBatchSize,
CheckCapacityProvisioningRequestBatchTimebox: *checkCapacityProvisioningRequestBatchTimebox,
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,21 +44,21 @@ import (
)

type checkCapacityProvClass struct {
context *context.AutoscalingContext
client *provreqclient.ProvisioningRequestClient
injector *scheduling.HintingSimulator
batchProcessing bool
maxBatchSize int
batchTimebox time.Duration
provisioningRequestPodsInjector *provreq.ProvisioningRequestPodsInjector
context *context.AutoscalingContext
client *provreqclient.ProvisioningRequestClient
schedulingSimulator *scheduling.HintingSimulator
checkCapacityBatchProcessing bool
checkCapacityProvisioningRequestMaxBatchSize int
checkCapacityProvisioningRequestBatchTimebox time.Duration
provreqInjector *provreq.ProvisioningRequestPodsInjector
}

// New create check-capacity scale-up mode.
func New(
client *provreqclient.ProvisioningRequestClient,
provisioningRequestPodsInjector *provreq.ProvisioningRequestPodsInjector,
provreqInjector *provreq.ProvisioningRequestPodsInjector,
) *checkCapacityProvClass {
return &checkCapacityProvClass{client: client, provisioningRequestPodsInjector: provisioningRequestPodsInjector}
return &checkCapacityProvClass{client: client, provreqInjector: provreqInjector}
}

func (o *checkCapacityProvClass) Initialize(
Expand All @@ -67,13 +67,13 @@ func (o *checkCapacityProvClass) Initialize(
clusterStateRegistry *clusterstate.ClusterStateRegistry,
estimatorBuilder estimator.EstimatorBuilder,
taintConfig taints.TaintConfig,
injector *scheduling.HintingSimulator,
schedulingSimulator *scheduling.HintingSimulator,
) {
o.context = autoscalingContext
o.injector = injector
o.batchProcessing = autoscalingContext.CheckCapacityBatchProcessing
o.batchTimebox = autoscalingContext.BatchTimebox
o.maxBatchSize = autoscalingContext.MaxBatchSize
o.schedulingSimulator = schedulingSimulator
o.checkCapacityBatchProcessing = autoscalingContext.CheckCapacityBatchProcessing
o.checkCapacityProvisioningRequestBatchTimebox = autoscalingContext.CheckCapacityProvisioningRequestBatchTimebox
o.checkCapacityProvisioningRequestMaxBatchSize = autoscalingContext.CheckCapacityProvisioningRequestMaxBatchSize
}

// Provision return if there is capacity in the cluster for pods from ProvisioningRequest.
Expand Down Expand Up @@ -104,7 +104,7 @@ func (o *checkCapacityProvClass) Provision(
if err != nil {
st, err := status.UpdateScaleUpError(&status.ScaleUpStatus{}, errors.NewAutoscalerError(errors.InternalError, "error during ScaleUp: %s", err.Error()))

if o.batchProcessing {
if o.checkCapacityBatchProcessing {
combinedStatus.Add(st)
} else {
return st, err
Expand All @@ -116,31 +116,31 @@ func (o *checkCapacityProvClass) Provision(
combinedStatus.Add(&status.ScaleUpStatus{Result: status.ScaleUpNoOptionsAvailable})
}

if !o.batchProcessing {
if !o.checkCapacityBatchProcessing {
break
}

if o.provisioningRequestPodsInjector == nil {
if o.provreqInjector == nil {
klog.Errorf("ProvisioningRequestPodsInjector is not set, falling back to non-batch processing")
break
}

if o.maxBatchSize <= 1 {
klog.Errorf("MaxBatchSize is set to %d, falling back to non-batch processing", o.maxBatchSize)
if o.checkCapacityProvisioningRequestMaxBatchSize <= 1 {
klog.Errorf("MaxBatchSize is set to %d, falling back to non-batch processing", o.checkCapacityProvisioningRequestMaxBatchSize)
break
}

provisioningRequestsProcessed++
if provisioningRequestsProcessed >= o.maxBatchSize {
if provisioningRequestsProcessed >= o.checkCapacityProvisioningRequestMaxBatchSize {
break
}

if time.Since(startTime) > o.batchTimebox {
if time.Since(startTime) > o.checkCapacityProvisioningRequestBatchTimebox {
klog.Infof("Batch timebox exceeded, processed %d check capacity provisioning requests this iteration", provisioningRequestsProcessed)
break
}

unschedulablePods, err = (*o.provisioningRequestPodsInjector).GetPodsFromNextRequest(func(pr *provreqwrapper.ProvisioningRequest) bool {
unschedulablePods, err = (*o.provreqInjector).GetPodsFromNextRequest(func(pr *provreqwrapper.ProvisioningRequest) bool {
return pr.Spec.ProvisioningClassName == v1.ProvisioningClassCheckCapacity
})
if err != nil {
Expand All @@ -156,7 +156,7 @@ func (o *checkCapacityProvClass) Provision(
// Assuming that all unschedulable pods comes from one ProvisioningRequest.
func (o *checkCapacityProvClass) checkcapacity(unschedulablePods []*apiv1.Pod, provReq *provreqwrapper.ProvisioningRequest) (capacityAvailable bool, err error) {
capacityAvailable = true
st, _, err := o.injector.TrySchedulePods(o.context.ClusterSnapshot, unschedulablePods, scheduling.ScheduleAnywhere, true)
st, _, err := o.schedulingSimulator.TrySchedulePods(o.context.ClusterSnapshot, unschedulablePods, scheduling.ScheduleAnywhere, true)
if len(st) < len(unschedulablePods) || err != nil {
conditions.AddOrUpdateCondition(provReq, v1.Provisioned, metav1.ConditionFalse, conditions.CapacityIsNotFoundReason, "Capacity is not found, CA will try to find it later.", metav1.Now())
capacityAvailable = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -460,8 +460,8 @@ func setupTest(t *testing.T, client *provreqclient.ProvisioningRequestClient, no
options := config.AutoscalingOptions{}
if batchProcessing {
options.CheckCapacityBatchProcessing = true
options.MaxBatchSize = maxBatchSize
options.BatchTimebox = batchTimebox
options.CheckCapacityProvisioningRequestMaxBatchSize = maxBatchSize
options.CheckCapacityProvisioningRequestBatchTimebox = batchTimebox
}

autoscalingContext, err := NewScaleTestAutoscalingContext(options, &fake.Clientset{}, listers, provider, nil, nil)
Expand Down

0 comments on commit a6f4fc2

Please sign in to comment.