@@ -89,7 +89,67 @@ func (s *StatusSyncer) GetOwner() runtime.Object { return s.MysqlCluster }
8989
9090// Sync persists data into the external store.
9191func (s * StatusSyncer ) Sync (ctx context.Context ) (syncer.SyncResult , error ) {
92- clusterCondition := s .updateClusterStatus ()
92+
93+ // init all contions for ClusterConditionType in file mysqlcluster_types.go
94+ if len (s .Status .Conditions ) == 0 {
95+ // init all contions for ClusterConditionType in file mysqlcluster_types.go
96+ s .Status .Conditions = []apiv1alpha1.ClusterCondition {
97+ {
98+ Type : apiv1alpha1 .ConditionInit ,
99+ Status : corev1 .ConditionFalse ,
100+ LastTransitionTime : metav1 .NewTime (time .Now ()),
101+ },
102+ {
103+ Type : apiv1alpha1 .ConditionUpdate ,
104+ Status : corev1 .ConditionFalse ,
105+ LastTransitionTime : metav1 .NewTime (time .Now ()),
106+ },
107+ {
108+ Type : apiv1alpha1 .ConditionReady ,
109+ Status : corev1 .ConditionFalse ,
110+ LastTransitionTime : metav1 .NewTime (time .Now ()),
111+ },
112+ {
113+ Type : apiv1alpha1 .ConditionClose ,
114+ Status : corev1 .ConditionFalse ,
115+ LastTransitionTime : metav1 .NewTime (time .Now ()),
116+ },
117+ {
118+ Type : apiv1alpha1 .ConditionError ,
119+ Status : corev1 .ConditionFalse ,
120+ LastTransitionTime : metav1 .NewTime (time .Now ()),
121+ },
122+ {
123+ Type : apiv1alpha1 .ConditionScaleIn ,
124+ Status : corev1 .ConditionFalse ,
125+ LastTransitionTime : metav1 .NewTime (time .Now ()),
126+ },
127+ {
128+ Type : apiv1alpha1 .ConditionScaleOut ,
129+ Status : corev1 .ConditionFalse ,
130+ LastTransitionTime : metav1 .NewTime (time .Now ()),
131+ },
132+ {
133+ Type : apiv1alpha1 .ConditionRemoteSlave ,
134+ Status : corev1 .ConditionFalse ,
135+ LastTransitionTime : metav1 .NewTime (time .Now ()),
136+ },
137+ }
138+ } else {
139+ errCond := apiv1alpha1.ClusterCondition {
140+ Type : apiv1alpha1 .ConditionError ,
141+ Status : corev1 .ConditionFalse ,
142+ LastTransitionTime : metav1 .NewTime (time .Now ()),
143+ Reason : "" ,
144+ Message : "" ,
145+ }
146+ s .updateClusterCondition (int (apiv1alpha1 .ClIndexError ), errCond , false )
147+ }
148+ clusterCondition , condInd := s .updateClusterStatus ()
149+ if condInd != - 1 {
150+ s .updateClusterCondition (condInd , clusterCondition , false )
151+ }
152+
93153 labelSelector := s .GetLabels ().AsSelector ()
94154 // Find the pods that revision is old.
95155 r , err := labels .NewRequirement ("readonly" , selection .DoesNotExist , []string {})
@@ -149,6 +209,8 @@ func (s *StatusSyncer) Sync(ctx context.Context) (syncer.SyncResult, error) {
149209 Reason : corev1 .PodReasonUnschedulable ,
150210 Message : cond .Message ,
151211 }
212+
213+ s .updateClusterCondition (int (apiv1alpha1 .ClIndexError ), clusterCondition , false )
152214 }
153215 }
154216 }
@@ -169,18 +231,18 @@ func (s *StatusSyncer) Sync(ctx context.Context) (syncer.SyncResult, error) {
169231 if err := s .reconcileXenon (s .Status .ReadyNodes ); err != nil {
170232 clusterCondition .Message = fmt .Sprintf ("%s" , err )
171233 clusterCondition .Type = apiv1alpha1 .ConditionError
234+ s .updateClusterCondition (int (apiv1alpha1 .ClIndexError ), clusterCondition , false )
172235 } else {
173236 s .Status .State = apiv1alpha1 .ClusterReadyState
174237 clusterCondition .Type = apiv1alpha1 .ConditionReady
175- }
176- }
177-
178- if len (s .Status .Conditions ) == 0 {
179- s .Status .Conditions = append (s .Status .Conditions , clusterCondition )
180- } else {
181- lastCond := s .Status .Conditions [len (s .Status .Conditions )- 1 ]
182- if lastCond .Type != clusterCondition .Type {
183- s .Status .Conditions = append (s .Status .Conditions , clusterCondition )
238+ s .updateClusterCondition (int (apiv1alpha1 .ClIndexReady ), clusterCondition , false )
239+ // change scale out, Initializing, scale in to false
240+ for _ , ind := range []int {int (apiv1alpha1 .ClIndexInit ),
241+ int (apiv1alpha1 .ClIndexScaleIn ), int (apiv1alpha1 .ClIndexScaleOut )} {
242+ tmpCond := s .Status .Conditions [ind ]
243+ tmpCond .Status = corev1 .ConditionFalse
244+ s .updateClusterCondition (ind , clusterCondition , false )
245+ }
184246 }
185247 }
186248
@@ -195,21 +257,7 @@ func (s *StatusSyncer) Sync(ctx context.Context) (syncer.SyncResult, error) {
195257 //Notice!!! ReadOnly node fail, just show the error log, do not return here!
196258 s .log .Error (err , "ReadOnly pod fail" , "namespace" , s .Namespace )
197259 }
198- // conditions := s.Status.Conditions
199- // sort.Slice(conditions, func(i, j int) bool {
200- // if conditions[i].Type < conditions[j].Type {
201- // return true
202- // } else if conditions[i].Type == conditions[j].Type &&
203- // conditions[i].LastTransitionTime.Before(&conditions[j].LastTransitionTime) {
204- // return true
205- // } else {
206- // return false
207- // }
208- // })
209- // s.Status.Conditions = conditions
210- if len (s .Status .Conditions ) > maxStatusesQuantity {
211- s .Status .Conditions = s .Status .Conditions [len (s .Status .Conditions )- maxStatusesQuantity :]
212- }
260+
213261 // update backup Status
214262 s .updateLastBackup ()
215263
@@ -252,7 +300,7 @@ func (s *StatusSyncer) updateLastBackup() error {
252300}
253301
254302// updateClusterStatus update the cluster status and returns condition.
255- func (s * StatusSyncer ) updateClusterStatus () apiv1alpha1.ClusterCondition {
303+ func (s * StatusSyncer ) updateClusterStatus () ( apiv1alpha1.ClusterCondition , int ) {
256304 clusterCondition := apiv1alpha1.ClusterCondition {
257305 Type : apiv1alpha1 .ConditionInit ,
258306 Status : corev1 .ConditionTrue ,
@@ -263,31 +311,36 @@ func (s *StatusSyncer) updateClusterStatus() apiv1alpha1.ClusterCondition {
263311 // If the state does not exist, the cluster is being initialized.
264312 if oldState == "" {
265313 s .Status .State = apiv1alpha1 .ClusterInitState
266- return clusterCondition
314+ return clusterCondition , int (apiv1alpha1 .ClIndexInit )
315+ }
316+ if oldState == apiv1alpha1 .ClusterUpdateState {
317+ clusterCondition .Type = apiv1alpha1 .ClusterConditionType (oldState )
318+ return clusterCondition , int (apiv1alpha1 .ClIndexUpdate )
267319 }
268320 // If the expected number of replicas and the actual number
269321 // of replicas are both 0, the cluster has been closed.
270322 if int (* s .Spec .Replicas ) == 0 && s .Status .ReadyNodes == 0 {
271323 clusterCondition .Type = apiv1alpha1 .ConditionClose
272324 s .Status .State = apiv1alpha1 .ClusterCloseState
273- return clusterCondition
325+ return clusterCondition , int ( apiv1alpha1 . ClIndexClose )
274326 }
275327 // When the cluster is ready or closed, the number of replicas changes,
276328 // indicating that the cluster is updating nodes.
277329 if oldState == apiv1alpha1 .ClusterReadyState || oldState == apiv1alpha1 .ClusterCloseState {
278330 if int (* s .Spec .Replicas ) > s .Status .ReadyNodes {
279331 clusterCondition .Type = apiv1alpha1 .ConditionScaleOut
280332 s .Status .State = apiv1alpha1 .ClusterScaleOutState
281- return clusterCondition
333+ return clusterCondition , int ( apiv1alpha1 . ClIndexScaleOut )
282334 } else if int (* s .Spec .Replicas ) < s .Status .ReadyNodes {
283335 clusterCondition .Type = apiv1alpha1 .ConditionScaleIn
284336 s .Status .State = apiv1alpha1 .ClusterScaleInState
285- return clusterCondition
337+ return clusterCondition , int ( apiv1alpha1 . ClIndexScaleIn )
286338 }
287339 }
288340
289341 clusterCondition .Type = apiv1alpha1 .ClusterConditionType (oldState )
290- return clusterCondition
342+
343+ return clusterCondition , - 1
291344}
292345
293346// Rebuild Pod by deleting and creating it.
@@ -934,22 +987,30 @@ func (s *StatusSyncer) clusterSlaveCheck() error {
934987 }
935988 if isReplicating == corev1 .ConditionFalse {
936989 s .log .Info ("remote cluster has no slave, change the status" )
990+ // here need force update the status.
991+ s .updateClusterCondition (int (apiv1alpha1 .ClIndexRemoteSlave ), clusterCondition , true )
937992 } else {
938993 clusterCondition .Status = corev1 .ConditionTrue
939994 clusterCondition .Message = ""
940995 clusterCondition .Reason = ""
941996 }
942- s .Status . Conditions = append ( s . Status . Conditions , clusterCondition )
997+ s .updateClusterCondition ( int ( apiv1alpha1 . ClIndexRemoteSlave ) , clusterCondition , false )
943998 }
944999 return nil
9451000}
9461001
947- func (s * StatusSyncer ) updateClusterCondition (idx int , status corev1.ConditionStatus ) {
948- if s .Status .Conditions [idx ].Status != status {
949- t := time .Now ()
950- s .log .V (3 ).Info (fmt .Sprintf ("Found status change for cluster %q condition %q: %q -> %q; setting lastTransitionTime to %v" ,
951- s .Name , s .Status .Conditions [idx ].Type , s .Status .Conditions [idx ].Status , status , t ))
952- s .Status .Conditions [idx ].Status = status
953- s .Status .Conditions [idx ].LastTransitionTime = metav1 .NewTime (t )
1002+ func (s * StatusSyncer ) updateClusterCondition (idx int , cond apiv1alpha1.ClusterCondition , force bool ) {
1003+ if idx >= len (s .Status .Conditions ) {
1004+ s .log .Info ("the cluster condition index is out of range, it may be upgrade the old version" , "index" , idx )
1005+ s .Status .Conditions = nil
1006+ return
1007+ }
1008+ if force {
1009+ s .Status .Conditions [idx ] = cond
1010+ } else if s .Status .Conditions [idx ].Status != cond .Status {
1011+ s .log .V (3 ).Info (fmt .Sprintf ("Found status change for cluster %q condition %q: %q -> %q" ,
1012+ s .Name , s .Status .Conditions [idx ].Type , s .Status .Conditions [idx ].Status , cond .Status ))
1013+ s .Status .Conditions [idx ] = cond
1014+
9541015 }
9551016}
0 commit comments