Skip to content

Commit 922477a

Browse files
authored
Improve upgradeOrder behavior more intuitive and safer (#1547)
* Improve the roleset upgradeOrder behavior * Add roleset upgrade integration test * Sync crds changes * Address code review feedback --------- Signed-off-by: Jiaxin Shan <seedjeffwan@gmail.com>
1 parent 51ee928 commit 922477a

File tree

7 files changed

+599
-21
lines changed

7 files changed

+599
-21
lines changed

api/orchestration/v1alpha1/roleset_types.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,10 @@ type RoleSpec struct {
6767
Replicas *int32 `json:"replicas,omitempty"`
6868

6969
// UpgradeOrder specifies the order in which this role should be upgraded.
70-
// Lower values are upgraded first. If not specified, defaults to 0.
70+
// Lower values are upgraded first. If not specified, roles upgrade after all explicitly ordered roles.
7171
// +optional
72-
// +kubebuilder:validation:Minimum=0
72+
// +kubebuilder:validation:Minimum=1
7373
// +kubebuilder:validation:Type=integer
74-
// +kubebuilder:default:=0
7574
UpgradeOrder *int32 `json:"upgradeOrder,omitempty"`
7675

7776
// PodGroupSize is the number of pods to form a minimum role instance.

config/crd/orchestration/orchestration.aibrix.ai_rolesets.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3690,9 +3690,8 @@ spec:
36903690
x-kubernetes-int-or-string: true
36913691
type: object
36923692
upgradeOrder:
3693-
default: 0
36943693
format: int32
3695-
minimum: 0
3694+
minimum: 1
36963695
type: integer
36973696
type: object
36983697
type: array

config/crd/orchestration/orchestration.aibrix.ai_stormservices.yaml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3757,9 +3757,8 @@ spec:
37573757
x-kubernetes-int-or-string: true
37583758
type: object
37593759
upgradeOrder:
3760-
default: 0
37613760
format: int32
3762-
minimum: 0
3761+
minimum: 1
37633762
type: integer
37643763
type: object
37653764
type: array

pkg/controller/roleset/rolling.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,13 @@ func (m *RollingManagerSequential) Next(ctx context.Context, roleSet *orchestrat
5858
sortedRoles := sortRolesByUpgradeOrder(roleSet.Spec.Roles)
5959
var sequenceLines []string
6060
for i, role := range sortedRoles {
61-
order := int32(0)
61+
var orderStr string
6262
if role.UpgradeOrder != nil {
63-
order = *role.UpgradeOrder
63+
orderStr = fmt.Sprintf("%d", *role.UpgradeOrder)
64+
} else {
65+
orderStr = "nil"
6466
}
65-
sequenceLines = append(sequenceLines, fmt.Sprintf("[%d] %s (Order=%d)", i+1, role.Name, order))
67+
sequenceLines = append(sequenceLines, fmt.Sprintf("[%d] %s (Order=%s)", i+1, role.Name, orderStr))
6668
}
6769

6870
klog.Infof("[RollingManagerSequential.Next] Upgrade sequence for %s/%s:\n%s",

pkg/controller/roleset/utils.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -396,15 +396,19 @@ func sortRolesByUpgradeOrder(roles []orchestrationv1alpha1.RoleSpec) []orchestra
396396
sortedRoles := make([]orchestrationv1alpha1.RoleSpec, len(roles))
397397
copy(sortedRoles, roles)
398398
sort.SliceStable(sortedRoles, func(i, j int) bool {
399-
orderI := int32(0)
400-
if sortedRoles[i].UpgradeOrder != nil {
401-
orderI = *sortedRoles[i].UpgradeOrder
399+
iOrder := sortedRoles[i].UpgradeOrder
400+
jOrder := sortedRoles[j].UpgradeOrder
401+
if iOrder == nil {
402+
// i is nil. If j is also nil, stable sort. If j is not nil, i comes after.
403+
// In both cases, i is not "less than" j.
404+
return false
402405
}
403-
orderJ := int32(0)
404-
if sortedRoles[j].UpgradeOrder != nil {
405-
orderJ = *sortedRoles[j].UpgradeOrder
406+
if jOrder == nil {
407+
// i is not nil, but j is. i comes before.
408+
return true
406409
}
407-
return orderI < orderJ
410+
// Both have explicit orders, sort by value.
411+
return *iOrder < *jOrder
408412
})
409413
return sortedRoles
410414
}

pkg/controller/roleset/utils_test.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -341,9 +341,9 @@ func TestSortRolesByUpgradeOrder(t *testing.T) {
341341
{Name: "role2", UpgradeOrder: int32Ptr(1)},
342342
},
343343
expected: []orchestrationv1alpha1.RoleSpec{
344-
{Name: "role1", UpgradeOrder: nil},
345344
{Name: "role2", UpgradeOrder: int32Ptr(1)},
346345
{Name: "role3", UpgradeOrder: int32Ptr(2)},
346+
{Name: "role1", UpgradeOrder: nil},
347347
},
348348
},
349349
{
@@ -368,10 +368,25 @@ func TestSortRolesByUpgradeOrder(t *testing.T) {
368368
{Name: "role3", UpgradeOrder: int32Ptr(1)},
369369
},
370370
expected: []orchestrationv1alpha1.RoleSpec{
371-
{Name: "role1", UpgradeOrder: nil},
372-
{Name: "role2", UpgradeOrder: nil},
373371
{Name: "role3", UpgradeOrder: int32Ptr(1)},
374372
{Name: "role4", UpgradeOrder: int32Ptr(2)},
373+
{Name: "role1", UpgradeOrder: nil},
374+
{Name: "role2", UpgradeOrder: nil},
375+
},
376+
},
377+
{
378+
name: "multiple roles with explicit order and one missing (real-world scenario)",
379+
roles: []orchestrationv1alpha1.RoleSpec{
380+
{Name: "api-server", UpgradeOrder: int32Ptr(2)},
381+
{Name: "database", UpgradeOrder: nil}, // Missing - should upgrade LAST
382+
{Name: "cache", UpgradeOrder: int32Ptr(1)},
383+
{Name: "monitoring", UpgradeOrder: int32Ptr(3)},
384+
},
385+
expected: []orchestrationv1alpha1.RoleSpec{
386+
{Name: "cache", UpgradeOrder: int32Ptr(1)}, // First
387+
{Name: "api-server", UpgradeOrder: int32Ptr(2)}, // Second
388+
{Name: "monitoring", UpgradeOrder: int32Ptr(3)}, // Third
389+
{Name: "database", UpgradeOrder: nil}, // Last (safest)
375390
},
376391
},
377392
}

0 commit comments

Comments
 (0)