Skip to content

Commit 055df30

Browse files
committed
controllers: fix the bug for auto backup #737
1 parent 83917d7 commit 055df30

File tree

1 file changed

+43
-9
lines changed

1 file changed

+43
-9
lines changed

controllers/backupcron_controller.go

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,20 @@ func (r *BackupCronReconciler) Reconcile(ctx context.Context, req ctrl.Request)
8989
if err = instance.Validate(); err != nil {
9090
return ctrl.Result{}, err
9191
}
92+
93+
if *instance.Spec.Replicas == 0 {
94+
if err := r.Cron.Remove(instance.Name + "auto"); err == nil {
95+
log.V(1).Info("remove cronjob from cluster", "name", instance.Name)
96+
}
97+
// without bothS3NFs, clear all
98+
if err := r.ClearBothS3NFS(ctx, instance.Unwrap(), log); err != nil {
99+
return reconcile.Result{}, fmt.Errorf("failed to clear cronjob: %s", err)
100+
}
101+
102+
}
92103
// if spec.backupScheduler is not set then don't do anything
93-
if instance.Spec.BothS3NFS == nil &&
94-
(len(instance.Spec.BackupSchedule) == 0 || *instance.Spec.Replicas == 0) {
95-
if err := r.Cron.Remove(instance.Name); err == nil {
104+
if len(instance.Spec.BackupSchedule) == 0 && instance.Spec.BothS3NFS == nil {
105+
if err := r.Cron.Remove(instance.Name + "auto"); err == nil {
96106
log.V(1).Info("remove cronjob from cluster", "name", instance.Name)
97107
}
98108

@@ -120,14 +130,16 @@ func (r *BackupCronReconciler) Reconcile(ctx context.Context, req ctrl.Request)
120130
}
121131
return ctrl.Result{}, nil
122132
} else {
133+
// without bothS3NFs, clear all
134+
if err := r.ClearBothS3NFS(ctx, instance.Unwrap(), log); err != nil {
135+
return reconcile.Result{}, fmt.Errorf("failed to clear cronjob: %s", err)
136+
}
123137
schedule, err := cron.Parse(instance.Spec.BackupSchedule)
124138
if err != nil {
125139
return reconcile.Result{}, fmt.Errorf("failed to parse schedule: %s", err)
126140
}
127141

128-
log.V(1).Info("register cluster in cronjob", "key", instance, "schedule", schedule)
129-
130-
return ctrl.Result{}, r.updateClusterSchedule(ctx, instance.Unwrap(), schedule, "", log)
142+
return ctrl.Result{}, r.updateClusterSchedule(ctx, instance.Unwrap(), schedule, "auto", log)
131143
}
132144

133145
}
@@ -149,7 +161,7 @@ func (r *BackupCronReconciler) updateClusterSchedule(ctx context.Context, cluste
149161
log.Info("update cluster scheduler", "key", cluster,
150162
"scheduler", schedule)
151163

152-
if err := r.Cron.Remove(cluster.Name); err != nil {
164+
if err := r.Cron.Remove(cluster.Name + BackupType); err != nil {
153165
return err
154166
}
155167
break
@@ -165,7 +177,7 @@ func (r *BackupCronReconciler) updateClusterSchedule(ctx context.Context, cluste
165177
if BackupType == "nfs" {
166178
nfsServerAddress = cluster.Spec.NFSServerAddress
167179
}
168-
180+
log.V(1).Info("register cluster in cronjob", "key", cluster.Name+BackupType, "schedule", schedule)
169181
r.Cron.Schedule(schedule, &backup.CronJob{
170182
ClusterName: cluster.Name,
171183
Namespace: cluster.Namespace,
@@ -175,7 +187,29 @@ func (r *BackupCronReconciler) updateClusterSchedule(ctx context.Context, cluste
175187
NFSServerAddress: nfsServerAddress,
176188
BackupType: BackupType,
177189
Log: log,
178-
}, cluster.Name)
190+
}, cluster.Name+BackupType)
191+
192+
return nil
193+
}
194+
195+
// Clear all nfs and s3 cronjob
196+
func (r *BackupCronReconciler) ClearBothS3NFS(ctx context.Context, cluster *apiv1alpha1.MysqlCluster, log logr.Logger) error {
197+
r.LockJobRegister.Lock()
198+
defer r.LockJobRegister.Unlock()
199+
200+
for _, entry := range r.Cron.Entries() {
201+
j, ok := entry.Job.(*backup.CronJob)
202+
if ok && j.ClusterName == cluster.Name &&
203+
j.Namespace == cluster.Namespace &&
204+
(j.BackupType == "nfs" || j.BackupType == "s3") {
205+
log.V(1).Info("find s3 or nfs cron.", "key", cluster)
206+
207+
if err := r.Cron.Remove(cluster.Name + j.BackupType); err != nil {
208+
return err
209+
}
210+
break
211+
}
212+
}
179213

180214
return nil
181215
}

0 commit comments

Comments
 (0)