@@ -29,9 +29,11 @@ import (
2929 "k8s.io/apimachinery/pkg/util/sets"
3030
3131 workloads "github.com/apecloud/kubeblocks/apis/workloads/v1"
32+ "github.com/apecloud/kubeblocks/pkg/constant"
3233 "github.com/apecloud/kubeblocks/pkg/controller/instancetemplate"
3334 "github.com/apecloud/kubeblocks/pkg/controller/kubebuilderx"
3435 "github.com/apecloud/kubeblocks/pkg/controller/model"
36+ "github.com/apecloud/kubeblocks/pkg/controller/revisionmap"
3537 intctrlutil "github.com/apecloud/kubeblocks/pkg/controllerutil"
3638)
3739
@@ -53,6 +55,11 @@ func (r *statusReconciler) PreCondition(tree *kubebuilderx.ObjectTree) *kubebuil
5355func (r * statusReconciler ) Reconcile (tree * kubebuilderx.ObjectTree ) (kubebuilderx.Result , error ) {
5456 its , _ := tree .GetRoot ().(* workloads.InstanceSet )
5557
58+ desiredInstances , _ , err := buildDesiredInstancesByName (tree , its )
59+ if err != nil {
60+ return kubebuilderx .Continue , err
61+ }
62+
5663 instances := tree .List (& workloads.Instance {})
5764 var instanceList []* workloads.Instance
5865 for _ , object := range instances {
@@ -65,7 +72,11 @@ func (r *statusReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuilder
6572 readyReplicas , availableReplicas := int32 (0 ), int32 (0 )
6673 notReadyNames := sets .New [string ]()
6774 notAvailableNames := sets .New [string ]()
68- // currentRevisions := map[string]string{}
75+ currentRevisions := map [string ]string {}
76+ updateRevisions , err := revisionmap .Decode (its .Status .UpdateRevisions )
77+ if err != nil {
78+ return kubebuilderx .Continue , err
79+ }
6980
7081 template2TemplatesStatus := map [string ]* workloads.InstanceTemplateStatus {}
7182 template2TotalReplicas := map [string ]int32 {}
@@ -78,7 +89,7 @@ func (r *statusReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuilder
7889 }
7990
8091 for _ , inst := range instanceList {
81- templateName := inst . Labels [ instancetemplate . TemplateNameLabelKey ]
92+ templateName := getInstanceTemplateName ( inst )
8293 if template2TemplatesStatus [templateName ] == nil {
8394 template2TemplatesStatus [templateName ] = & workloads.InstanceTemplateStatus {
8495 Name : templateName ,
@@ -100,8 +111,9 @@ func (r *statusReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuilder
100111 notAvailableNames .Insert (inst .Name )
101112 }
102113 }
114+ currentRevisions [inst .Name ] = buildCurrentInstanceRevision (inst , desiredInstances [inst .Name ])
103115 if ! intctrlutil .IsInstanceTerminating (inst ) {
104- if isInstanceUpdated ( its , inst ) {
116+ if isInstanceUpdatedWithRevisions ( inst , currentRevisions [ inst . Name ], updateRevisions ) {
105117 updatedReplicas ++
106118 template2TemplatesStatus [templateName ].UpdatedReplicas ++
107119 } else {
@@ -115,15 +127,15 @@ func (r *statusReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuilder
115127 its .Status .AvailableReplicas = availableReplicas
116128 its .Status .CurrentReplicas = currentReplicas
117129 its .Status .UpdatedReplicas = updatedReplicas
118- // its.Status.CurrentRevisions, _ = buildRevisions (currentRevisions)
130+ its .Status .CurrentRevisions , _ = revisionmap . Encode (currentRevisions )
119131 its .Status .TemplatesStatus = buildTemplatesStatus (template2TemplatesStatus )
120132 // all pods have been updated
121133 totalReplicas := int32 (1 )
122134 if its .Spec .Replicas != nil {
123135 totalReplicas = * its .Spec .Replicas
124136 }
125137 if its .Status .Replicas == totalReplicas && its .Status .UpdatedReplicas == totalReplicas {
126- // its.Status.CurrentRevision = its.Status.UpdateRevision
138+ its .Status .CurrentRevision = its .Status .UpdateRevision
127139 its .Status .CurrentReplicas = totalReplicas
128140 }
129141 for idx , templateStatus := range its .Status .TemplatesStatus {
@@ -165,6 +177,16 @@ func (r *statusReconciler) Reconcile(tree *kubebuilderx.ObjectTree) (kubebuilder
165177 return kubebuilderx .Continue , nil
166178}
167179
180+ func getInstanceTemplateName (inst * workloads.Instance ) string {
181+ if inst .Labels == nil {
182+ return ""
183+ }
184+ if templateName := inst .Labels [instancetemplate .TemplateNameLabelKey ]; templateName != "" {
185+ return templateName
186+ }
187+ return inst .Labels [constant .KBAppInstanceTemplateLabelKey ]
188+ }
189+
168190func buildConditionMessageWithNames (instanceNames []string ) ([]byte , error ) {
169191 baseSort (instanceNames , func (i int ) (string , int ) {
170192 return parseParentNameAndOrdinal (instanceNames [i ])
0 commit comments