diff --git a/pkg/controller/perconaservermongodbrestore/logical.go b/pkg/controller/perconaservermongodbrestore/logical.go index 986000e4d5..6ad535fc89 100644 --- a/pkg/controller/perconaservermongodbrestore/logical.go +++ b/pkg/controller/perconaservermongodbrestore/logical.go @@ -14,6 +14,8 @@ import ( pbmErrors "github.com/percona/percona-backup-mongodb/pbm/errors" psmdbv1 "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1" + "github.com/percona/percona-server-mongodb-operator/pkg/k8s" + "github.com/percona/percona-server-mongodb-operator/pkg/naming" "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/backup" ) @@ -59,6 +61,26 @@ func (r *ReconcilePerconaServerMongoDBRestore) reconcileLogicalRestore( return status, nil } + leaseActive, err := k8s.IsLeaseActive(ctx, r.client, naming.BackupLeaseName(cluster.Name), cluster.Namespace) + if err != nil { + return status, errors.Wrap(err, "check backup lease") + } + if leaseActive { + log.Info("Waiting for active backup to complete before starting restore.") + status.State = psmdbv1.RestoreStateWaiting + return status, nil + } + + hasActiveLocks, err := pbmc.HasLocks(ctx) + if err != nil { + return status, errors.Wrap(err, "checking pbm locks") + } + if hasActiveLocks { + log.Info("Waiting for active PBM operation to complete.") + status.State = psmdbv1.RestoreStateWaiting + return status, nil + } + log.Info("Starting restore", "backup", backupName) status.PBMname, err = runRestore(ctx, backupName, pbmc, cr) status.State = psmdbv1.RestoreStateRequested diff --git a/pkg/k8s/lease.go b/pkg/k8s/lease.go index 2fb8d73616..2f9196a435 100644 --- a/pkg/k8s/lease.go +++ b/pkg/k8s/lease.go @@ -45,6 +45,20 @@ func AcquireLease(ctx context.Context, c client.Client, name, namespace, holder return lease, nil } +func IsLeaseActive(ctx context.Context, c client.Client, name, namespace string) (bool, error) { + lease := new(coordv1.Lease) + + if err := c.Get(ctx, types.NamespacedName{Namespace: namespace, Name: name}, lease); err != nil { + if k8serrors.IsNotFound(err) { + return false, nil + } + + return false, errors.Wrap(err, "get lease") + } + + return lease.Spec.HolderIdentity != nil && *lease.Spec.HolderIdentity != "", nil +} + func ReleaseLease(ctx context.Context, c client.Client, name, namespace, holder string) error { lease := new(coordv1.Lease)