@@ -26,6 +26,7 @@ import (
26
26
"github.com/percona/percona-backup-mongodb/pbm/storage"
27
27
"github.com/percona/percona-backup-mongodb/pbm/storage/azure"
28
28
"github.com/percona/percona-backup-mongodb/pbm/storage/s3"
29
+
29
30
"github.com/percona/percona-server-mongodb-operator/clientcmd"
30
31
psmdbv1 "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
31
32
"github.com/percona/percona-server-mongodb-operator/pkg/naming"
@@ -169,9 +170,16 @@ func (r *ReconcilePerconaServerMongoDBBackup) Reconcile(ctx context.Context, req
169
170
}
170
171
}
171
172
172
- bcp, err := r.newBackup(ctx, cluster)
173
- if err != nil {
174
- return rr, errors.Wrap(err, "create backup object")
173
+ var bcp *Backup
174
+ if err = retry.OnError(defaultBackoff, func(err error) bool { return err != nil }, func() error {
175
+ var err error
176
+ bcp, err = r.newBackup(ctx, cluster)
177
+ if err != nil {
178
+ return errors.Wrap(err, "create backup object")
179
+ }
180
+ return nil
181
+ }); err != nil {
182
+ return rr, err
175
183
}
176
184
defer bcp.Close(ctx)
177
185
@@ -209,26 +217,37 @@ func (r *ReconcilePerconaServerMongoDBBackup) reconcile(
209
217
return status, errors.Wrap(err, "failed to run backup")
210
218
}
211
219
212
- cjobs, err := backup.HasActiveJobs(ctx, r.newPBMFunc, r.client, cluster, backup.NewBackupJob(cr.Name), backup.NotPITRLock)
213
- if err != nil {
214
- return status, errors.Wrap(err, "check for concurrent jobs")
215
- }
216
-
217
- if cjobs {
218
- if cr.Status.State != psmdbv1.BackupStateWaiting {
219
- log.Info("Waiting to finish another backup/restore.")
220
- }
221
- status.State = psmdbv1.BackupStateWaiting
222
- return status, nil
223
- }
224
-
225
- if cr.Status.State == psmdbv1.BackupStateNew || cr.Status.State == psmdbv1.BackupStateWaiting {
220
+ switch cr.Status.State {
221
+ case psmdbv1.BackupStateNew, psmdbv1.BackupStateWaiting:
226
222
time.Sleep(10 * time.Second)
227
223
return bcp.Start(ctx, r.client, cluster, cr)
224
+ case psmdbv1.BackupStateRunning:
225
+ default:
226
+ cjobs, err := backup.HasActiveJobs(ctx, r.newPBMFunc, r.client, cluster, backup.NewBackupJob(cr.Name), backup.NotPITRLock)
227
+ if err != nil {
228
+ return status, errors.Wrap(err, "check for concurrent jobs")
229
+ }
230
+
231
+ if cjobs {
232
+ if cr.Status.State != psmdbv1.BackupStateWaiting {
233
+ log.Info("Waiting to finish another backup/restore.")
234
+ }
235
+ status.State = psmdbv1.BackupStateWaiting
236
+ return status, nil
237
+ }
228
238
}
229
239
230
240
time.Sleep(5 * time.Second)
231
- return bcp.Status(ctx, cr)
241
+
242
+ err := retry.OnError(defaultBackoff, func(err error) bool { return err != nil }, func() error {
243
+ updatedStatus, err := bcp.Status(ctx, cr)
244
+ if err == nil {
245
+ status = updatedStatus
246
+ }
247
+ return err
248
+ })
249
+
250
+ return status, err
232
251
}
233
252
234
253
func (r *ReconcilePerconaServerMongoDBBackup) getPBMStorage(ctx context.Context, cluster *psmdbv1.PerconaServerMongoDB, cr *psmdbv1.PerconaServerMongoDBBackup) (storage.Storage, error) {
0 commit comments