Skip to content

Commit 084b158

Browse files
committed
*: change the cluster condition
1 parent 6e7beba commit 084b158

File tree

1 file changed

+100
-39
lines changed

1 file changed

+100
-39
lines changed

mysqlcluster/syncer/status.go

Lines changed: 100 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,67 @@ func (s *StatusSyncer) GetOwner() runtime.Object { return s.MysqlCluster }
8989

9090
// Sync persists data into the external store.
9191
func (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

Comments
 (0)