@@ -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