From ae7893171c7f71e2fe72ee877c3944994531239d Mon Sep 17 00:00:00 2001 From: Bo Liu Date: Fri, 17 Jan 2025 16:02:32 +0800 Subject: [PATCH] fix(controllerrevision): add component into revision name (#6045) Signed-off-by: liubo02 --- pkg/controllers/common/interfaces.go | 4 +- pkg/controllers/common/resource.go | 8 ++- pkg/controllers/common/revision.go | 55 +++++++++------- pkg/controllers/common/revision_test.go | 64 +++++++++++++------ pkg/controllers/pdgroup/builder.go | 2 +- pkg/controllers/pdgroup/tasks/state.go | 20 +++--- pkg/controllers/tidbgroup/builder.go | 2 +- pkg/controllers/tidbgroup/tasks/state.go | 20 +++--- pkg/controllers/tidbgroup/tasks/state_test.go | 3 +- pkg/controllers/tiflashgroup/builder.go | 2 +- pkg/controllers/tiflashgroup/tasks/state.go | 20 +++--- .../tiflashgroup/tasks/state_test.go | 3 +- pkg/controllers/tikvgroup/builder.go | 2 +- pkg/controllers/tikvgroup/tasks/state.go | 20 +++--- pkg/utils/k8s/revision/controller_revision.go | 7 +- .../k8s/revision/controller_revision_test.go | 18 +++--- .../controller/history/controller_history.go | 3 +- 17 files changed, 145 insertions(+), 108 deletions(-) diff --git a/pkg/controllers/common/interfaces.go b/pkg/controllers/common/interfaces.go index d2ac73d082..5c68db9831 100644 --- a/pkg/controllers/common/interfaces.go +++ b/pkg/controllers/common/interfaces.go @@ -92,8 +92,8 @@ type GroupAndInstanceSliceState[ InstanceSliceState[I] } -type RevisionStateInitializer interface { - RevisionInitializer() RevisionInitializer +type RevisionStateInitializer[G runtime.Group] interface { + RevisionInitializer() RevisionInitializer[G] } type RevisionState interface { diff --git a/pkg/controllers/common/resource.go b/pkg/controllers/common/resource.go index 05cd198a3e..faa41b1f6f 100644 --- a/pkg/controllers/common/resource.go +++ b/pkg/controllers/common/resource.go @@ -14,7 +14,9 @@ package common -import "github.com/pingcap/tidb-operator/pkg/client" +import ( + "github.com/pingcap/tidb-operator/pkg/runtime" +) type Setter[T any] interface { Set(T) @@ -50,8 +52,8 @@ type CollisionCountOption interface { CollisionCount() *int32 } -type ParentOption interface { - Parent() client.Object +type ParentOption[G runtime.Group] interface { + Parent() G } type ( diff --git a/pkg/controllers/common/revision.go b/pkg/controllers/common/revision.go index 6a6830b811..0bc9b32686 100644 --- a/pkg/controllers/common/revision.go +++ b/pkg/controllers/common/revision.go @@ -20,6 +20,7 @@ import ( "k8s.io/apimachinery/pkg/labels" "github.com/pingcap/tidb-operator/pkg/client" + "github.com/pingcap/tidb-operator/pkg/runtime" revisionutil "github.com/pingcap/tidb-operator/pkg/utils/k8s/revision" "github.com/pingcap/tidb-operator/pkg/utils/task/v3" "github.com/pingcap/tidb-operator/third_party/kubernetes/pkg/controller/history" @@ -35,78 +36,83 @@ func (f RevisionSetterFunc) Set(update, current string, collisionCount int32) { f(update, current, collisionCount) } -type Revision interface { - WithCurrentRevision(CurrentRevisionOption) Revision - WithCollisionCount(CollisionCountOption) Revision - WithParent(ParentOption) Revision - WithLabels(LabelsOption) Revision - Initializer() RevisionInitializer +type Revision[G runtime.Group] interface { + WithCurrentRevision(CurrentRevisionOption) Revision[G] + WithCollisionCount(CollisionCountOption) Revision[G] + WithParent(ParentOption[G]) Revision[G] + WithLabels(LabelsOption) Revision[G] + Initializer() RevisionInitializer[G] } -type RevisionInitializer interface { +type RevisionInitializer[G runtime.Group] interface { LabelsOption - ParentOption + ParentOption[G] CurrentRevision() string CollisionCount() *int32 RevisionSetter } -type revision struct { +type revision[G runtime.Group] struct { RevisionSetter - parent ParentOption + parent ParentOption[G] currentRevision CurrentRevisionOption collisionCount CollisionCountOption labels LabelsOption } -func NewRevision(setter RevisionSetter) Revision { - return &revision{ +func NewRevision[G runtime.Group](setter RevisionSetter) Revision[G] { + return &revision[G]{ RevisionSetter: setter, } } -func (r *revision) WithParent(parent ParentOption) Revision { +func (r *revision[G]) WithParent(parent ParentOption[G]) Revision[G] { r.parent = parent return r } -func (r *revision) WithCurrentRevision(rev CurrentRevisionOption) Revision { +func (r *revision[G]) WithCurrentRevision(rev CurrentRevisionOption) Revision[G] { r.currentRevision = rev return r } -func (r *revision) WithCollisionCount(collisionCount CollisionCountOption) Revision { +func (r *revision[G]) WithCollisionCount(collisionCount CollisionCountOption) Revision[G] { r.collisionCount = collisionCount return r } -func (r *revision) WithLabels(ls LabelsOption) Revision { +func (r *revision[G]) WithLabels(ls LabelsOption) Revision[G] { r.labels = ls return r } -func (r *revision) Initializer() RevisionInitializer { +func (r *revision[G]) Initializer() RevisionInitializer[G] { return r } -func (r *revision) Parent() client.Object { +func (r *revision[G]) Parent() G { return r.parent.Parent() } -func (r *revision) CurrentRevision() string { +func (r *revision[G]) CurrentRevision() string { return r.currentRevision.CurrentRevision() } -func (r *revision) CollisionCount() *int32 { +func (r *revision[G]) CollisionCount() *int32 { return r.collisionCount.CollisionCount() } -func (r *revision) Labels() map[string]string { +func (r *revision[G]) Labels() map[string]string { return r.labels.Labels() } -func TaskRevision(state RevisionStateInitializer, c client.Client) task.Task { +func TaskRevision[ + GT runtime.GroupTuple[OG, RG], + OG client.Object, + RG runtime.Group, +](state RevisionStateInitializer[RG], c client.Client) task.Task { + var gt GT w := state.RevisionInitializer() return task.NameTaskFunc("ContextRevision", func(ctx context.Context) task.Result { historyCli := history.NewClient(c) @@ -115,7 +121,7 @@ func TaskRevision(state RevisionStateInitializer, c client.Client) task.Task { lbs := w.Labels() selector := labels.SelectorFromSet(labels.Set(lbs)) - revisions, err := historyCli.ListControllerRevisions(parent, selector) + revisions, err := historyCli.ListControllerRevisions(gt.To(parent), selector) if err != nil { return task.Fail().With("cannot list controller revisions: %w", err) } @@ -124,7 +130,8 @@ func TaskRevision(state RevisionStateInitializer, c client.Client) task.Task { // Get the current(old) and update(new) ControllerRevisions. currentRevision, updateRevision, collisionCount, err := revisionutil.GetCurrentAndUpdate( ctx, - parent, + gt.To(parent), + parent.Component(), lbs, revisions, historyCli, diff --git a/pkg/controllers/common/revision_test.go b/pkg/controllers/common/revision_test.go index 7d11e1b182..02b0d2b7fb 100644 --- a/pkg/controllers/common/revision_test.go +++ b/pkg/controllers/common/revision_test.go @@ -21,23 +21,23 @@ import ( "github.com/stretchr/testify/assert" appsv1 "k8s.io/api/apps/v1" - "github.com/pingcap/tidb-operator/apis/core/v1alpha1" "github.com/pingcap/tidb-operator/pkg/client" + "github.com/pingcap/tidb-operator/pkg/runtime" "github.com/pingcap/tidb-operator/pkg/utils/fake" "github.com/pingcap/tidb-operator/pkg/utils/task/v3" ) -type fakeRevisionStateInitializer struct { +type fakeRevisionStateInitializer[G runtime.Group] struct { fakeRevisionState currentRevision CurrentRevisionOption collisionCount CollisionCountOption - parent ParentOption + parent ParentOption[G] labels LabelsOption } -func (f *fakeRevisionStateInitializer) RevisionInitializer() RevisionInitializer { - return NewRevision(&f.fakeRevisionState). +func (f *fakeRevisionStateInitializer[G]) RevisionInitializer() RevisionInitializer[G] { + return NewRevision[G](&f.fakeRevisionState). WithCurrentRevision(f.currentRevision). WithCollisionCount(f.collisionCount). WithParent(f.parent). @@ -53,7 +53,7 @@ const ( func TestTaskRevision(t *testing.T) { cases := []struct { desc string - state *fakeRevisionStateInitializer + state *fakeRevisionStateInitializer[*runtime.PDGroup] objs []client.Object expectedResult task.Status @@ -63,15 +63,21 @@ func TestTaskRevision(t *testing.T) { }{ { desc: "no revisions", - state: &fakeRevisionStateInitializer{ + state: &fakeRevisionStateInitializer[*runtime.PDGroup]{ currentRevision: Lazy[string](func() string { return "" }), collisionCount: Lazy[*int32](func() *int32 { return nil }), - parent: Lazy[client.Object](func() client.Object { - return fake.FakeObj("aaa", fake.Label[v1alpha1.PDGroup]("aaa", "bbb")) + parent: Lazy[*runtime.PDGroup](func() *runtime.PDGroup { + return fake.Fake(func(obj *runtime.PDGroup) *runtime.PDGroup { + obj.SetName("aaa") + obj.Labels = map[string]string{ + "aaa": "bbb", + } + return obj + }) }), labels: Labels{ "ccc": "ddd", @@ -82,15 +88,21 @@ func TestTaskRevision(t *testing.T) { }, { desc: "has a revision", - state: &fakeRevisionStateInitializer{ + state: &fakeRevisionStateInitializer[*runtime.PDGroup]{ currentRevision: Lazy[string](func() string { return "xxx" }), collisionCount: Lazy[*int32](func() *int32 { return nil }), - parent: Lazy[client.Object](func() client.Object { - return fake.FakeObj("aaa", fake.Label[v1alpha1.PDGroup]("aaa", "bbb")) + parent: Lazy[*runtime.PDGroup](func() *runtime.PDGroup { + return fake.Fake(func(obj *runtime.PDGroup) *runtime.PDGroup { + obj.SetName("aaa") + obj.Labels = map[string]string{ + "aaa": "bbb", + } + return obj + }) }), labels: Labels{ "ccc": "ddd", @@ -104,15 +116,21 @@ func TestTaskRevision(t *testing.T) { }, { desc: "has a coflict revision", - state: &fakeRevisionStateInitializer{ + state: &fakeRevisionStateInitializer[*runtime.PDGroup]{ currentRevision: Lazy[string](func() string { return fakeOldRevision }), collisionCount: Lazy[*int32](func() *int32 { return nil }), - parent: Lazy[client.Object](func() client.Object { - return fake.FakeObj("aaa", fake.Label[v1alpha1.PDGroup]("aaa", "bbb")) + parent: Lazy[*runtime.PDGroup](func() *runtime.PDGroup { + return fake.Fake(func(obj *runtime.PDGroup) *runtime.PDGroup { + obj.SetName("aaa") + obj.Labels = map[string]string{ + "aaa": "bbb", + } + return obj + }) }), labels: Labels{ "ccc": "ddd", @@ -127,15 +145,21 @@ func TestTaskRevision(t *testing.T) { }, { desc: "has two coflict revision", - state: &fakeRevisionStateInitializer{ + state: &fakeRevisionStateInitializer[*runtime.PDGroup]{ currentRevision: Lazy[string](func() string { return fakeOldRevision }), collisionCount: Lazy[*int32](func() *int32 { return nil }), - parent: Lazy[client.Object](func() client.Object { - return fake.FakeObj("aaa", fake.Label[v1alpha1.PDGroup]("aaa", "bbb")) + parent: Lazy[*runtime.PDGroup](func() *runtime.PDGroup { + return fake.Fake(func(obj *runtime.PDGroup) *runtime.PDGroup { + obj.SetName("aaa") + obj.Labels = map[string]string{ + "aaa": "bbb", + } + return obj + }) }), labels: Labels{ "ccc": "ddd", @@ -158,7 +182,7 @@ func TestTaskRevision(t *testing.T) { fc := client.NewFakeClient(c.objs...) - res, done := task.RunTask(context.Background(), TaskRevision(c.state, fc)) + res, done := task.RunTask(context.Background(), TaskRevision[runtime.PDGroupTuple](c.state, fc)) assert.Equal(tt, c.expectedResult.String(), res.Status().String(), c.desc) assert.False(tt, done, c.desc) update, current, collisionCount := c.state.Revision() @@ -175,7 +199,7 @@ func TestTaskRevision(t *testing.T) { }) // rerun Revision task and make sure that status is unchanged - res2, _ := task.RunTask(context.Background(), TaskRevision(c.state, fc)) + res2, _ := task.RunTask(context.Background(), TaskRevision[runtime.PDGroupTuple](c.state, fc)) assert.Equal(tt, c.expectedResult.String(), res2.Status().String(), c.desc) update, current, collisionCount = c.state.Revision() assert.Equal(tt, c.expectedUpdateRevision, update, c.desc) diff --git a/pkg/controllers/pdgroup/builder.go b/pkg/controllers/pdgroup/builder.go index e68e598b7f..374dc07478 100644 --- a/pkg/controllers/pdgroup/builder.go +++ b/pkg/controllers/pdgroup/builder.go @@ -46,7 +46,7 @@ func (r *Reconciler) NewRunner(state *tasks.ReconcileContext, reporter task.Task common.TaskGroupStatusSuspend[runtime.PDGroupTuple](state, r.Client), ), tasks.TaskContextPDClient(state, r.PDClientManager), - common.TaskRevision(state, r.Client), + common.TaskRevision[runtime.PDGroupTuple](state, r.Client), tasks.TaskBoot(state, r.Client), tasks.TaskService(state, r.Client), tasks.TaskUpdater(state, r.Client), diff --git a/pkg/controllers/pdgroup/tasks/state.go b/pkg/controllers/pdgroup/tasks/state.go index 48972ef4fa..7d10ddd4be 100644 --- a/pkg/controllers/pdgroup/tasks/state.go +++ b/pkg/controllers/pdgroup/tasks/state.go @@ -18,7 +18,6 @@ import ( "k8s.io/apimachinery/pkg/types" "github.com/pingcap/tidb-operator/apis/core/v1alpha1" - "github.com/pingcap/tidb-operator/pkg/client" "github.com/pingcap/tidb-operator/pkg/controllers/common" "github.com/pingcap/tidb-operator/pkg/runtime" ) @@ -39,7 +38,7 @@ type State interface { common.PDGroupStateInitializer common.ClusterStateInitializer common.PDSliceStateInitializer - common.RevisionStateInitializer + common.RevisionStateInitializer[*runtime.PDGroup] common.PDGroupState common.ClusterState @@ -100,23 +99,24 @@ func (s *state) PDSliceInitializer() common.PDSliceInitializer { Initializer() } -func (s *state) RevisionInitializer() common.RevisionInitializer { - return common.NewRevision(common.RevisionSetterFunc(func(update, current string, collisionCount int32) { - s.updateRevision = update - s.currentRevision = current - s.collisionCount = collisionCount - })). +func (s *state) RevisionInitializer() common.RevisionInitializer[*runtime.PDGroup] { + return common.NewRevision[*runtime.PDGroup]( + common.RevisionSetterFunc(func(update, current string, collisionCount int32) { + s.updateRevision = update + s.currentRevision = current + s.collisionCount = collisionCount + })). WithCurrentRevision(common.Lazy[string](func() string { return s.pdg.Status.CurrentRevision })). WithCollisionCount(common.Lazy[*int32](func() *int32 { return s.pdg.Status.CollisionCount })). - WithParent(common.Lazy[client.Object](func() client.Object { + WithParent(common.Lazy[*runtime.PDGroup](func() *runtime.PDGroup { pdg := s.pdg.DeepCopy() // always ignore bootstrapped field in spec pdg.Spec.Bootstrapped = false - return pdg + return runtime.FromPDGroup(pdg) })). WithLabels(s.Labels()). Initializer() diff --git a/pkg/controllers/tidbgroup/builder.go b/pkg/controllers/tidbgroup/builder.go index 78332dd69e..d6ca579ba2 100644 --- a/pkg/controllers/tidbgroup/builder.go +++ b/pkg/controllers/tidbgroup/builder.go @@ -46,7 +46,7 @@ func (r *Reconciler) NewRunner(state *tasks.ReconcileContext, reporter task.Task common.TaskGroupStatusSuspend[runtime.TiDBGroupTuple](state, r.Client), ), - common.TaskRevision(state, r.Client), + common.TaskRevision[runtime.TiDBGroupTuple](state, r.Client), tasks.TaskService(state, r.Client), tasks.TaskUpdater(state, r.Client), tasks.TaskStatusAvailable(state, r.Client), diff --git a/pkg/controllers/tidbgroup/tasks/state.go b/pkg/controllers/tidbgroup/tasks/state.go index b9e5e7e072..ad97416311 100644 --- a/pkg/controllers/tidbgroup/tasks/state.go +++ b/pkg/controllers/tidbgroup/tasks/state.go @@ -18,7 +18,6 @@ import ( "k8s.io/apimachinery/pkg/types" "github.com/pingcap/tidb-operator/apis/core/v1alpha1" - "github.com/pingcap/tidb-operator/pkg/client" "github.com/pingcap/tidb-operator/pkg/controllers/common" "github.com/pingcap/tidb-operator/pkg/runtime" ) @@ -39,7 +38,7 @@ type State interface { common.TiDBGroupStateInitializer common.ClusterStateInitializer common.TiDBSliceStateInitializer - common.RevisionStateInitializer + common.RevisionStateInitializer[*runtime.TiDBGroup] common.TiDBGroupState common.ClusterState @@ -100,20 +99,21 @@ func (s *state) TiDBSliceInitializer() common.TiDBSliceInitializer { Initializer() } -func (s *state) RevisionInitializer() common.RevisionInitializer { - return common.NewRevision(common.RevisionSetterFunc(func(update, current string, collisionCount int32) { - s.updateRevision = update - s.currentRevision = current - s.collisionCount = collisionCount - })). +func (s *state) RevisionInitializer() common.RevisionInitializer[*runtime.TiDBGroup] { + return common.NewRevision[*runtime.TiDBGroup]( + common.RevisionSetterFunc(func(update, current string, collisionCount int32) { + s.updateRevision = update + s.currentRevision = current + s.collisionCount = collisionCount + })). WithCurrentRevision(common.Lazy[string](func() string { return s.dbg.Status.CurrentRevision })). WithCollisionCount(common.Lazy[*int32](func() *int32 { return s.dbg.Status.CollisionCount })). - WithParent(common.Lazy[client.Object](func() client.Object { - return s.dbg + WithParent(common.Lazy[*runtime.TiDBGroup](func() *runtime.TiDBGroup { + return s.Group() })). WithLabels(s.Labels()). Initializer() diff --git a/pkg/controllers/tidbgroup/tasks/state_test.go b/pkg/controllers/tidbgroup/tasks/state_test.go index 9969140312..f8da6f9b23 100644 --- a/pkg/controllers/tidbgroup/tasks/state_test.go +++ b/pkg/controllers/tidbgroup/tasks/state_test.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb-operator/apis/core/v1alpha1" "github.com/pingcap/tidb-operator/pkg/client" "github.com/pingcap/tidb-operator/pkg/controllers/common" + "github.com/pingcap/tidb-operator/pkg/runtime" "github.com/pingcap/tidb-operator/pkg/utils/fake" "github.com/pingcap/tidb-operator/pkg/utils/task/v3" ) @@ -98,7 +99,7 @@ func TestState(t *testing.T) { common.TaskContextTiDBGroup(s, fc), common.TaskContextCluster(s, fc), common.TaskContextTiDBSlice(s, fc), - common.TaskRevision(s, fc), + common.TaskRevision[runtime.TiDBGroupTuple](s, fc), )) assert.Equal(tt, task.SComplete, res.Status(), c.desc) assert.False(tt, done, c.desc) diff --git a/pkg/controllers/tiflashgroup/builder.go b/pkg/controllers/tiflashgroup/builder.go index 1b27bbc68c..f1aab107df 100644 --- a/pkg/controllers/tiflashgroup/builder.go +++ b/pkg/controllers/tiflashgroup/builder.go @@ -46,7 +46,7 @@ func (r *Reconciler) NewRunner(state *tasks.ReconcileContext, reporter task.Task common.TaskGroupStatusSuspend[runtime.TiFlashGroupTuple](state, r.Client), ), - common.TaskRevision(state, r.Client), + common.TaskRevision[runtime.TiFlashGroupTuple](state, r.Client), tasks.TaskService(state, r.Client), tasks.TaskUpdater(state, r.Client), common.TaskGroupStatus[runtime.TiFlashGroupTuple](state, r.Client), diff --git a/pkg/controllers/tiflashgroup/tasks/state.go b/pkg/controllers/tiflashgroup/tasks/state.go index 89993cb8d1..7543b01ae9 100644 --- a/pkg/controllers/tiflashgroup/tasks/state.go +++ b/pkg/controllers/tiflashgroup/tasks/state.go @@ -18,7 +18,6 @@ import ( "k8s.io/apimachinery/pkg/types" "github.com/pingcap/tidb-operator/apis/core/v1alpha1" - "github.com/pingcap/tidb-operator/pkg/client" "github.com/pingcap/tidb-operator/pkg/controllers/common" "github.com/pingcap/tidb-operator/pkg/runtime" ) @@ -39,7 +38,7 @@ type State interface { common.TiFlashGroupStateInitializer common.ClusterStateInitializer common.TiFlashSliceStateInitializer - common.RevisionStateInitializer + common.RevisionStateInitializer[*runtime.TiFlashGroup] common.TiFlashGroupState common.ClusterState @@ -100,20 +99,21 @@ func (s *state) TiFlashSliceInitializer() common.TiFlashSliceInitializer { Initializer() } -func (s *state) RevisionInitializer() common.RevisionInitializer { - return common.NewRevision(common.RevisionSetterFunc(func(update, current string, collisionCount int32) { - s.updateRevision = update - s.currentRevision = current - s.collisionCount = collisionCount - })). +func (s *state) RevisionInitializer() common.RevisionInitializer[*runtime.TiFlashGroup] { + return common.NewRevision[*runtime.TiFlashGroup]( + common.RevisionSetterFunc(func(update, current string, collisionCount int32) { + s.updateRevision = update + s.currentRevision = current + s.collisionCount = collisionCount + })). WithCurrentRevision(common.Lazy[string](func() string { return s.fg.Status.CurrentRevision })). WithCollisionCount(common.Lazy[*int32](func() *int32 { return s.fg.Status.CollisionCount })). - WithParent(common.Lazy[client.Object](func() client.Object { - return s.fg + WithParent(common.Lazy[*runtime.TiFlashGroup](func() *runtime.TiFlashGroup { + return s.Group() })). WithLabels(s.Labels()). Initializer() diff --git a/pkg/controllers/tiflashgroup/tasks/state_test.go b/pkg/controllers/tiflashgroup/tasks/state_test.go index e679141d78..4e4393543c 100644 --- a/pkg/controllers/tiflashgroup/tasks/state_test.go +++ b/pkg/controllers/tiflashgroup/tasks/state_test.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb-operator/apis/core/v1alpha1" "github.com/pingcap/tidb-operator/pkg/client" "github.com/pingcap/tidb-operator/pkg/controllers/common" + "github.com/pingcap/tidb-operator/pkg/runtime" "github.com/pingcap/tidb-operator/pkg/utils/fake" "github.com/pingcap/tidb-operator/pkg/utils/task/v3" ) @@ -98,7 +99,7 @@ func TestState(t *testing.T) { common.TaskContextTiFlashGroup(s, fc), common.TaskContextCluster(s, fc), common.TaskContextTiFlashSlice(s, fc), - common.TaskRevision(s, fc), + common.TaskRevision[runtime.TiFlashGroupTuple](s, fc), )) assert.Equal(tt, task.SComplete.String(), res.Status().String(), c.desc) assert.False(tt, done, c.desc) diff --git a/pkg/controllers/tikvgroup/builder.go b/pkg/controllers/tikvgroup/builder.go index 015f78e506..30fe81af3a 100644 --- a/pkg/controllers/tikvgroup/builder.go +++ b/pkg/controllers/tikvgroup/builder.go @@ -46,7 +46,7 @@ func (r *Reconciler) NewRunner(state *tasks.ReconcileContext, reporter task.Task common.TaskGroupStatusSuspend[runtime.TiKVGroupTuple](state, r.Client), ), - common.TaskRevision(state, r.Client), + common.TaskRevision[runtime.TiKVGroupTuple](state, r.Client), tasks.TaskService(state, r.Client), tasks.TaskUpdater(state, r.Client), common.TaskGroupStatus[runtime.TiKVGroupTuple](state, r.Client), diff --git a/pkg/controllers/tikvgroup/tasks/state.go b/pkg/controllers/tikvgroup/tasks/state.go index 1a17b8ed2f..2c03b38a96 100644 --- a/pkg/controllers/tikvgroup/tasks/state.go +++ b/pkg/controllers/tikvgroup/tasks/state.go @@ -18,7 +18,6 @@ import ( "k8s.io/apimachinery/pkg/types" "github.com/pingcap/tidb-operator/apis/core/v1alpha1" - "github.com/pingcap/tidb-operator/pkg/client" "github.com/pingcap/tidb-operator/pkg/controllers/common" "github.com/pingcap/tidb-operator/pkg/runtime" ) @@ -39,7 +38,7 @@ type State interface { common.TiKVGroupStateInitializer common.ClusterStateInitializer common.TiKVSliceStateInitializer - common.RevisionStateInitializer + common.RevisionStateInitializer[*runtime.TiKVGroup] common.TiKVGroupState common.ClusterState @@ -100,20 +99,21 @@ func (s *state) TiKVSliceInitializer() common.TiKVSliceInitializer { Initializer() } -func (s *state) RevisionInitializer() common.RevisionInitializer { - return common.NewRevision(common.RevisionSetterFunc(func(update, current string, collisionCount int32) { - s.updateRevision = update - s.currentRevision = current - s.collisionCount = collisionCount - })). +func (s *state) RevisionInitializer() common.RevisionInitializer[*runtime.TiKVGroup] { + return common.NewRevision[*runtime.TiKVGroup]( + common.RevisionSetterFunc(func(update, current string, collisionCount int32) { + s.updateRevision = update + s.currentRevision = current + s.collisionCount = collisionCount + })). WithCurrentRevision(common.Lazy[string](func() string { return s.kvg.Status.CurrentRevision })). WithCollisionCount(common.Lazy[*int32](func() *int32 { return s.kvg.Status.CollisionCount })). - WithParent(common.Lazy[client.Object](func() client.Object { - return s.kvg + WithParent(common.Lazy[*runtime.TiKVGroup](func() *runtime.TiKVGroup { + return s.Group() })). WithLabels(s.Labels()). Initializer() diff --git a/pkg/utils/k8s/revision/controller_revision.go b/pkg/utils/k8s/revision/controller_revision.go index bfa6da362e..d46420d86e 100644 --- a/pkg/utils/k8s/revision/controller_revision.go +++ b/pkg/utils/k8s/revision/controller_revision.go @@ -49,6 +49,7 @@ var encoderMap = map[schema.GroupVersion]kuberuntime.Encoder{} func GetCurrentAndUpdate( _ context.Context, group client.Object, + component string, labels map[string]string, revisions []*appsv1.ControllerRevision, cli history.Interface, @@ -69,7 +70,7 @@ func GetCurrentAndUpdate( return nil, nil, collisionCount, fmt.Errorf("cannot get gvk of group: %w", err) } // create a new revision from the current object - updateRevision, err = newRevision(group, labels, gvk, statefulset.NextRevision(revisions), &collisionCount) + updateRevision, err = newRevision(group, component, labels, gvk, statefulset.NextRevision(revisions), &collisionCount) if err != nil { return nil, nil, collisionCount, fmt.Errorf("failed to new a revision: %w", err) } @@ -114,14 +115,14 @@ func GetCurrentAndUpdate( } // newRevision creates a new ControllerRevision containing a patch that reapplies the target state of CR. -func newRevision(obj client.Object, labels map[string]string, gvk schema.GroupVersionKind, +func newRevision(obj client.Object, component string, labels map[string]string, gvk schema.GroupVersionKind, revision int64, collisionCount *int32, ) (*appsv1.ControllerRevision, error) { patch, err := getPatch(obj, gvk) if err != nil { return nil, fmt.Errorf("failed to get patch: %w", err) } - cr, err := history.NewControllerRevision(obj, labels, kuberuntime.RawExtension{Raw: patch}, revision, collisionCount) + cr, err := history.NewControllerRevision(obj, component, labels, kuberuntime.RawExtension{Raw: patch}, revision, collisionCount) if err != nil { return nil, fmt.Errorf("failed to create a revision: %w", err) } diff --git a/pkg/utils/k8s/revision/controller_revision_test.go b/pkg/utils/k8s/revision/controller_revision_test.go index 648d2ed8a6..4c6a67d03e 100644 --- a/pkg/utils/k8s/revision/controller_revision_test.go +++ b/pkg/utils/k8s/revision/controller_revision_test.go @@ -207,12 +207,12 @@ func TestGetCurrentAndUpdate(t *testing.T) { Replicas: ptr.To[int32](1), }, } - rev1, err := newRevision(pdg, nil, pdg.GVK(), 1, ptr.To[int32](0)) + rev1, err := newRevision(pdg, "pd", nil, pdg.GVK(), 1, ptr.To[int32](0)) require.NoError(t, err) pdg2 := pdg.DeepCopy() pdg2.Spec.Replicas = ptr.To[int32](2) - rev2, err := newRevision(pdg2, nil, pdg2.GVK(), 2, ptr.To[int32](0)) + rev2, err := newRevision(pdg2, "pd", nil, pdg2.GVK(), 2, ptr.To[int32](0)) require.NoError(t, err) tests := []struct { @@ -229,8 +229,8 @@ func TestGetCurrentAndUpdate(t *testing.T) { group: pdg, revisions: []*appsv1.ControllerRevision{}, accessor: pdg, - expectedCurRev: "basic-687bcf9d45", - expectedUpdRev: "basic-687bcf9d45", + expectedCurRev: "basic-pd-687bcf9d45", + expectedUpdRev: "basic-pd-687bcf9d45", expectedErr: false, }, { @@ -238,8 +238,8 @@ func TestGetCurrentAndUpdate(t *testing.T) { group: pdg2, revisions: []*appsv1.ControllerRevision{rev1, rev2}, accessor: pdg2, - expectedCurRev: "basic-5f5f578c9d", - expectedUpdRev: "basic-5f5f578c9d", + expectedCurRev: "basic-pd-5f5f578c9d", + expectedUpdRev: "basic-pd-5f5f578c9d", expectedErr: false, }, { @@ -247,8 +247,8 @@ func TestGetCurrentAndUpdate(t *testing.T) { group: pdg, revisions: []*appsv1.ControllerRevision{rev1, rev2}, accessor: pdg, - expectedCurRev: "basic-687bcf9d45", - expectedUpdRev: "basic-687bcf9d45", + expectedCurRev: "basic-pd-687bcf9d45", + expectedUpdRev: "basic-pd-687bcf9d45", expectedErr: false, }, } @@ -261,7 +261,7 @@ func TestGetCurrentAndUpdate(t *testing.T) { return revision, nil }, } - curRev, updRev, _, err := GetCurrentAndUpdate(context.TODO(), tt.group, nil, tt.revisions, cli, tt.accessor.CurrentRevision(), tt.accessor.CollisionCount()) + curRev, updRev, _, err := GetCurrentAndUpdate(context.TODO(), tt.group, "pd", nil, tt.revisions, cli, tt.accessor.CurrentRevision(), tt.accessor.CollisionCount()) if tt.expectedErr { require.Error(t, err) } else { diff --git a/third_party/kubernetes/pkg/controller/history/controller_history.go b/third_party/kubernetes/pkg/controller/history/controller_history.go index 17dccac628..f738e11db9 100644 --- a/third_party/kubernetes/pkg/controller/history/controller_history.go +++ b/third_party/kubernetes/pkg/controller/history/controller_history.go @@ -59,6 +59,7 @@ func ControllerRevisionName(prefix string, hash string) string { // so the name is likely unique. If the returned error is nil, the returned ControllerRevision is valid. If the // returned error is not nil, the returned ControllerRevision is invalid for use. func NewControllerRevision(parent metav1.Object, + component string, templateLabels map[string]string, data runtime.RawExtension, revision int64, @@ -77,7 +78,7 @@ func NewControllerRevision(parent metav1.Object, Revision: revision, } hash := HashControllerRevision(cr, collisionCount) - cr.Name = ControllerRevisionName(parent.GetName(), hash) + cr.Name = ControllerRevisionName(parent.GetName()+"-"+component, hash) cr.Labels[HashLabel] = hash return cr, nil }