Skip to content

Commit

Permalink
[Cache] Sort resourceUsages according to resourceName
Browse files Browse the repository at this point in the history
Signed-off-by: Yuki Iwai <yuki.iwai.tz@gmail.com>
  • Loading branch information
tenzen-y committed Jun 27, 2023
1 parent 8596b6a commit 4524c0c
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 16 deletions.
9 changes: 9 additions & 0 deletions pkg/cache/cache.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"context"
"errors"
"fmt"
"sort"
"sync"

corev1 "k8s.io/api/core/v1"
Expand Down Expand Up @@ -879,6 +880,10 @@ func (c *Cache) Usage(cqObj *kueue.ClusterQueue) ([]kueue.FlavorUsage, int, erro
}
outFlvUsage.Resources = append(outFlvUsage.Resources, rUsage)
}
// The resourceUsages should be in a stable order to avoid endless creation of update events.
sort.Slice(outFlvUsage.Resources, func(i, j int) bool {
return outFlvUsage.Resources[i].Name < outFlvUsage.Resources[j].Name
})
usage = append(usage, outFlvUsage)
}
}
Expand Down Expand Up @@ -912,6 +917,10 @@ func (c *Cache) LocalQueueUsage(qObj *kueue.LocalQueue) ([]kueue.LocalQueueFlavo
Total: workload.ResourceQuantity(rName, flvUsage[rName]),
})
}
// The resourceUsages should be in a stable order to avoid endless creation of update events.
sort.Slice(outFlvUsage.Resources, func(i, j int) bool {
return outFlvUsage.Resources[i].Name < outFlvUsage.Resources[j].Name
})
qFlvUsages = append(qFlvUsages, outFlvUsage)
}
}
Expand Down
101 changes: 85 additions & 16 deletions pkg/cache/cache_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1327,7 +1327,15 @@ func TestClusterQueueUsage(t *testing.T) {
*utiltesting.MakeFlavorQuotas("model_b").
Resource("example.com/gpu", "5").
Obj(),
).Cohort("one").Obj()
).
ResourceGroup(
*utiltesting.MakeFlavorQuotas("interconnect_a").
Resource("example.com/vf-0", "5", "5").
Resource("example.com/vf-1", "5", "5").
Resource("example.com/vf-2", "5", "5").
Obj(),
).
Cohort("one").Obj()
cqWithOutCohort := cq.DeepCopy()
cqWithOutCohort.Spec.Cohort = ""
workloads := []kueue.Workload{
Expand Down Expand Up @@ -1372,6 +1380,14 @@ func TestClusterQueueUsage(t *testing.T) {
Name: "example.com/gpu",
}},
},
{
Name: "interconnect_a",
Resources: []kueue.ResourceUsage{
{Name: "example.com/vf-0"},
{Name: "example.com/vf-1"},
{Name: "example.com/vf-2"},
},
},
},
wantWorkloads: 1,
},
Expand Down Expand Up @@ -1402,6 +1418,14 @@ func TestClusterQueueUsage(t *testing.T) {
Borrowed: resource.MustParse("1"),
}},
},
{
Name: "interconnect_a",
Resources: []kueue.ResourceUsage{
{Name: "example.com/vf-0"},
{Name: "example.com/vf-1"},
{Name: "example.com/vf-2"},
},
},
},
wantWorkloads: 2,
},
Expand Down Expand Up @@ -1432,6 +1456,14 @@ func TestClusterQueueUsage(t *testing.T) {
Borrowed: resource.MustParse("0"),
}},
},
{
Name: "interconnect_a",
Resources: []kueue.ResourceUsage{
{Name: "example.com/vf-0"},
{Name: "example.com/vf-1"},
{Name: "example.com/vf-2"},
},
},
},
wantWorkloads: 2,
},
Expand All @@ -1449,15 +1481,18 @@ func TestClusterQueueUsage(t *testing.T) {
t.Fatalf("Workload %s was not added", workload.Key(&w))
}
}
resources, workloads, err := cache.Usage(tc.clusterQueue)
if err != nil {
t.Fatalf("Couldn't get usage: %v", err)
}
if diff := cmp.Diff(tc.wantUsedResources, resources); diff != "" {
t.Errorf("Unexpected used resources (-want,+got):\n%s", diff)
}
if workloads != tc.wantWorkloads {
t.Errorf("Got %d workloads, want %d", workloads, tc.wantWorkloads)
// We must check whether the same order of 'flavorUsage' is returned.
for i := 0; i < 10; i++ {
resources, workloads, err := cache.Usage(tc.clusterQueue)
if err != nil {
t.Fatalf("Couldn't get usage: %v", err)
}
if diff := cmp.Diff(tc.wantUsedResources, resources); diff != "" {
t.Errorf("Unexpected used resources (-want,+got):\n%s", diff)
}
if workloads != tc.wantWorkloads {
t.Errorf("Got %d workloads, want %d", workloads, tc.wantWorkloads)
}
}
})
}
Expand All @@ -1475,6 +1510,13 @@ func TestLocalQueueUsage(t *testing.T) {
*utiltesting.MakeFlavorQuotas("model-b").
Resource("example.com/gpu", "5").Obj(),
).
ResourceGroup(
*utiltesting.MakeFlavorQuotas("interconnect-a").
Resource("example.com/vf-0", "5", "5").
Resource("example.com/vf-1", "5", "5").
Resource("example.com/vf-2", "5", "5").
Obj(),
).
Obj()
localQueue := *utiltesting.MakeLocalQueue("test", "ns1").
ClusterQueue("foo").Obj()
Expand Down Expand Up @@ -1522,6 +1564,14 @@ func TestLocalQueueUsage(t *testing.T) {
},
},
},
{
Name: "interconnect-a",
Resources: []kueue.LocalQueueResourceUsage{
{Name: "example.com/vf-0"},
{Name: "example.com/vf-1"},
{Name: "example.com/vf-2"},
},
},
},
},
"all workloads are admitted": {
Expand Down Expand Up @@ -1576,6 +1626,14 @@ func TestLocalQueueUsage(t *testing.T) {
},
},
},
{
Name: "interconnect-a",
Resources: []kueue.LocalQueueResourceUsage{
{Name: "example.com/vf-0"},
{Name: "example.com/vf-1"},
{Name: "example.com/vf-2"},
},
},
},
},
"some workloads are inadmissible": {
Expand Down Expand Up @@ -1624,6 +1682,14 @@ func TestLocalQueueUsage(t *testing.T) {
},
},
},
{
Name: "interconnect-a",
Resources: []kueue.LocalQueueResourceUsage{
{Name: "example.com/vf-0"},
{Name: "example.com/vf-1"},
{Name: "example.com/vf-2"},
},
},
},
},
}
Expand All @@ -1644,12 +1710,15 @@ func TestLocalQueueUsage(t *testing.T) {
t.Fatalf("Workload %s was not added", workload.Key(&w))
}
}
gotUsage, err := cache.LocalQueueUsage(&localQueue)
if err != nil {
t.Fatalf("Couldn't get usage for the queue: %v", err)
}
if diff := cmp.Diff(tc.wantUsage, gotUsage); diff != "" {
t.Errorf("Unexpected used resources for the queue (-want,+got):\n%s", diff)
// We must check whether the same order of 'flavorUsage' is returned.
for i := 0; i < 10; i++ {
gotUsage, err := cache.LocalQueueUsage(&localQueue)
if err != nil {
t.Fatalf("Couldn't get usage for the queue: %v", err)
}
if diff := cmp.Diff(tc.wantUsage, gotUsage); diff != "" {
t.Errorf("Unexpected used resources for the queue (-want,+got):\n%s", diff)
}
}
})
}
Expand Down

0 comments on commit 4524c0c

Please sign in to comment.