Skip to content

Commit 1c223cf

Browse files
committed
skip calculate available replicas when no need
Signed-off-by: zhzhuang-zju <[email protected]>
1 parent 6586e42 commit 1c223cf

File tree

4 files changed

+95
-5
lines changed

4 files changed

+95
-5
lines changed

pkg/scheduler/core/spreadconstraint/group_clusters.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ func GroupClustersWithScore(
9595
calAvailableReplicasFunc func(clusters []*clusterv1alpha1.Cluster, spec *workv1alpha2.ResourceBindingSpec) []workv1alpha2.TargetCluster,
9696
) *GroupClustersInfo {
9797
if isTopologyIgnored(placement) {
98+
if shouldIgnoreCalculateAvailableResource(placement) {
99+
return groupClustersIgnoringTopology(clustersScore, spec, nil)
100+
}
98101
return groupClustersIgnoringTopology(clustersScore, spec, calAvailableReplicasFunc)
99102
}
100103

@@ -343,11 +346,13 @@ func (info *GroupClustersInfo) generateClustersInfo(clustersScore framework.Clus
343346
clusters = append(clusters, clusterScore.Cluster)
344347
}
345348

346-
clustersReplicas := info.calAvailableReplicasFunc(clusters, rbSpec)
347-
for i, clustersReplica := range clustersReplicas {
348-
info.Clusters[i].AvailableReplicas = int64(clustersReplica.Replicas)
349-
info.Clusters[i].AvailableReplicas += int64(rbSpec.AssignedReplicasForCluster(clustersReplica.Name))
350-
info.Clusters[i].AllocatableReplicas = clustersReplica.Replicas
349+
if info.calAvailableReplicasFunc != nil {
350+
clustersReplicas := info.calAvailableReplicasFunc(clusters, rbSpec)
351+
for i, clustersReplica := range clustersReplicas {
352+
info.Clusters[i].AvailableReplicas = int64(clustersReplica.Replicas)
353+
info.Clusters[i].AvailableReplicas += int64(rbSpec.AssignedReplicasForCluster(clustersReplica.Name))
354+
info.Clusters[i].AllocatableReplicas = clustersReplica.Replicas
355+
}
351356
}
352357

353358
sortClusters(info.Clusters, func(i *ClusterDetailInfo, j *ClusterDetailInfo) *bool {

pkg/scheduler/core/spreadconstraint/group_clusters_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,7 @@ func Test_GroupClustersWithScore(t *testing.T) {
201201

202202
for _, tt := range tests {
203203
t.Run(tt.name, func(t *testing.T) {
204+
tt.args.spec.Placement = tt.args.placement
204205
groupInfo := GroupClustersWithScore(tt.args.clustersScore, tt.args.placement, tt.args.spec, calAvailableReplicasFunc)
205206
for i, cluster := range groupInfo.Clusters {
206207
if cluster.Name != tt.want.clusters[i] {

pkg/scheduler/core/spreadconstraint/select_clusters.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,3 +78,15 @@ func shouldIgnoreAvailableResource(placement *policyv1alpha1.Placement) bool {
7878

7979
return false
8080
}
81+
82+
// when replica assignment strategy is "Duplicated" or "static weighted", no need to calculate the available resource
83+
func shouldIgnoreCalculateAvailableResource(placement *policyv1alpha1.Placement) bool {
84+
strategy := placement.ReplicaSchedulingType()
85+
if strategy == policyv1alpha1.ReplicaSchedulingTypeDuplicated {
86+
return true
87+
}
88+
if strategy == policyv1alpha1.ReplicaSchedulingTypeDivided && placement.ReplicaScheduling.ReplicaDivisionPreference == policyv1alpha1.ReplicaDivisionPreferenceWeighted && (placement.ReplicaScheduling.WeightPreference == nil || len(placement.ReplicaScheduling.WeightPreference.DynamicWeight) == 0) {
89+
return true
90+
}
91+
return false
92+
}

pkg/scheduler/core/spreadconstraint/select_clusters_test.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,3 +249,75 @@ func TestSelectBestClusters(t *testing.T) {
249249
})
250250
}
251251
}
252+
253+
func TestIgnoreCalculateAvailableResource(t *testing.T) {
254+
tests := []struct {
255+
name string
256+
placement *policyv1alpha1.Placement
257+
ignore bool
258+
}{
259+
{
260+
name: "when ReplicaScheduling is nil",
261+
placement: &policyv1alpha1.Placement{ReplicaScheduling: nil},
262+
ignore: true,
263+
},
264+
{
265+
name: "when strategy is duplicated",
266+
placement: &policyv1alpha1.Placement{
267+
ReplicaScheduling: &policyv1alpha1.ReplicaSchedulingStrategy{ReplicaSchedulingType: policyv1alpha1.ReplicaSchedulingTypeDuplicated},
268+
},
269+
ignore: true,
270+
},
271+
{
272+
name: "when strategy is divided, and ReplicaDivisionPreference is Aggregated",
273+
placement: &policyv1alpha1.Placement{
274+
ReplicaScheduling: &policyv1alpha1.ReplicaSchedulingStrategy{
275+
ReplicaSchedulingType: policyv1alpha1.ReplicaSchedulingTypeDivided,
276+
ReplicaDivisionPreference: policyv1alpha1.ReplicaDivisionPreferenceAggregated,
277+
},
278+
},
279+
ignore: false,
280+
},
281+
{
282+
name: "when strategy is divided, and ReplicaDivisionPreference is Weighted, and WeightPreference is nil",
283+
placement: &policyv1alpha1.Placement{
284+
ReplicaScheduling: &policyv1alpha1.ReplicaSchedulingStrategy{
285+
ReplicaSchedulingType: policyv1alpha1.ReplicaSchedulingTypeDivided,
286+
ReplicaDivisionPreference: policyv1alpha1.ReplicaDivisionPreferenceWeighted,
287+
WeightPreference: nil,
288+
},
289+
},
290+
ignore: true,
291+
},
292+
{
293+
name: "when strategy is divided, and ReplicaDivisionPreference is Weighted, and WeightPreference is DynamicWeight",
294+
placement: &policyv1alpha1.Placement{
295+
ReplicaScheduling: &policyv1alpha1.ReplicaSchedulingStrategy{
296+
ReplicaSchedulingType: policyv1alpha1.ReplicaSchedulingTypeDivided,
297+
ReplicaDivisionPreference: policyv1alpha1.ReplicaDivisionPreferenceWeighted,
298+
WeightPreference: &policyv1alpha1.ClusterPreferences{DynamicWeight: policyv1alpha1.DynamicWeightByAvailableReplicas},
299+
},
300+
},
301+
ignore: false,
302+
},
303+
{
304+
name: "when strategy is divided, and ReplicaDivisionPreference is Weighted, and WeightPreference is StaticWeightList",
305+
placement: &policyv1alpha1.Placement{
306+
ReplicaScheduling: &policyv1alpha1.ReplicaSchedulingStrategy{
307+
ReplicaSchedulingType: policyv1alpha1.ReplicaSchedulingTypeDivided,
308+
ReplicaDivisionPreference: policyv1alpha1.ReplicaDivisionPreferenceWeighted,
309+
WeightPreference: &policyv1alpha1.ClusterPreferences{StaticWeightList: make([]policyv1alpha1.StaticClusterWeight, 0)},
310+
},
311+
},
312+
ignore: true,
313+
},
314+
}
315+
for _, tt := range tests {
316+
t.Run(tt.name, func(t *testing.T) {
317+
got := shouldIgnoreCalculateAvailableResource(tt.placement)
318+
if !reflect.DeepEqual(got, tt.ignore) {
319+
t.Errorf("shouldIgnoreCalculateAvailableResource() = %v, want %v", got, tt.ignore)
320+
}
321+
})
322+
}
323+
}

0 commit comments

Comments
 (0)