Skip to content

Commit 4796de4

Browse files
committed
K8SPSMDB-1339: Validate PiTR target before starting restore
1 parent c2f5bc1 commit 4796de4

File tree

11 files changed

+92
-30
lines changed

11 files changed

+92
-30
lines changed

config/crd/bases/psmdb.percona.com_perconaservermongodbbackups.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,9 @@ spec:
107107
lastTransition:
108108
format: date-time
109109
type: string
110+
lastWriteAt:
111+
format: date-time
112+
type: string
110113
latestRestorableTime:
111114
format: date-time
112115
type: string

config/crd/bases/psmdb.percona.com_perconaservermongodbrestores.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ spec:
7575
lastTransition:
7676
format: date-time
7777
type: string
78+
lastWriteAt:
79+
format: date-time
80+
type: string
7881
latestRestorableTime:
7982
format: date-time
8083
type: string

deploy/bundle.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ spec:
106106
lastTransition:
107107
format: date-time
108108
type: string
109+
lastWriteAt:
110+
format: date-time
111+
type: string
109112
latestRestorableTime:
110113
format: date-time
111114
type: string
@@ -260,6 +263,9 @@ spec:
260263
lastTransition:
261264
format: date-time
262265
type: string
266+
lastWriteAt:
267+
format: date-time
268+
type: string
263269
latestRestorableTime:
264270
format: date-time
265271
type: string

deploy/crd.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ spec:
106106
lastTransition:
107107
format: date-time
108108
type: string
109+
lastWriteAt:
110+
format: date-time
111+
type: string
109112
latestRestorableTime:
110113
format: date-time
111114
type: string
@@ -260,6 +263,9 @@ spec:
260263
lastTransition:
261264
format: date-time
262265
type: string
266+
lastWriteAt:
267+
format: date-time
268+
type: string
263269
latestRestorableTime:
264270
format: date-time
265271
type: string

deploy/cw-bundle.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ spec:
106106
lastTransition:
107107
format: date-time
108108
type: string
109+
lastWriteAt:
110+
format: date-time
111+
type: string
109112
latestRestorableTime:
110113
format: date-time
111114
type: string
@@ -260,6 +263,9 @@ spec:
260263
lastTransition:
261264
format: date-time
262265
type: string
266+
lastWriteAt:
267+
format: date-time
268+
type: string
263269
latestRestorableTime:
264270
format: date-time
265271
type: string

e2e-tests/version-service/conf/crd.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,9 @@ spec:
106106
lastTransition:
107107
format: date-time
108108
type: string
109+
lastWriteAt:
110+
format: date-time
111+
type: string
109112
latestRestorableTime:
110113
format: date-time
111114
type: string
@@ -260,6 +263,9 @@ spec:
260263
lastTransition:
261264
format: date-time
262265
type: string
266+
lastWriteAt:
267+
format: date-time
268+
type: string
263269
latestRestorableTime:
264270
format: date-time
265271
type: string

pkg/apis/psmdb/v1/perconaservermongodbbackup_types.go

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,24 +35,26 @@ const (
3535

3636
// PerconaServerMongoDBBackupStatus defines the observed state of PerconaServerMongoDBBackup
3737
type PerconaServerMongoDBBackupStatus struct {
38-
Type defs.BackupType `json:"type,omitempty"`
39-
State BackupState `json:"state,omitempty"`
40-
StartAt *metav1.Time `json:"start,omitempty"`
41-
CompletedAt *metav1.Time `json:"completed,omitempty"`
42-
LastTransition *metav1.Time `json:"lastTransition,omitempty"`
43-
Destination string `json:"destination,omitempty"`
44-
StorageName string `json:"storageName,omitempty"`
45-
S3 *BackupStorageS3Spec `json:"s3,omitempty"`
46-
Azure *BackupStorageAzureSpec `json:"azure,omitempty"`
47-
Filesystem *BackupStorageFilesystemSpec `json:"filesystem,omitempty"`
48-
ReplsetNames []string `json:"replsetNames,omitempty"`
49-
PBMname string `json:"pbmName,omitempty"`
38+
Type defs.BackupType `json:"type,omitempty"`
39+
State BackupState `json:"state,omitempty"`
40+
Destination string `json:"destination,omitempty"`
41+
StorageName string `json:"storageName,omitempty"`
42+
S3 *BackupStorageS3Spec `json:"s3,omitempty"`
43+
Azure *BackupStorageAzureSpec `json:"azure,omitempty"`
44+
Filesystem *BackupStorageFilesystemSpec `json:"filesystem,omitempty"`
45+
ReplsetNames []string `json:"replsetNames,omitempty"`
46+
PBMname string `json:"pbmName,omitempty"`
5047

5148
// Deprecated: Use PBMPods instead
52-
PBMPod string `json:"pbmPod,omitempty"`
53-
PBMPods map[string]string `json:"pbmPods,omitempty"`
54-
Error string `json:"error,omitempty"`
55-
LatestRestorableTime *metav1.Time `json:"latestRestorableTime,omitempty"`
49+
PBMPod string `json:"pbmPod,omitempty"`
50+
PBMPods map[string]string `json:"pbmPods,omitempty"`
51+
Error string `json:"error,omitempty"`
52+
53+
StartAt *metav1.Time `json:"start,omitempty"`
54+
CompletedAt *metav1.Time `json:"completed,omitempty"`
55+
LastWriteAt *metav1.Time `json:"lastWriteAt,omitempty"`
56+
LastTransition *metav1.Time `json:"lastTransition,omitempty"`
57+
LatestRestorableTime *metav1.Time `json:"latestRestorableTime,omitempty"`
5658
}
5759

5860
// +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object

pkg/apis/psmdb/v1/zz_generated.deepcopy.go

Lines changed: 16 additions & 12 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/controller/perconaservermongodbbackup/backup.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,9 @@ func (b *Backup) Status(ctx context.Context, cr *api.PerconaServerMongoDBBackup)
187187
status.CompletedAt = &metav1.Time{
188188
Time: time.Unix(meta.LastTransitionTS, 0),
189189
}
190+
status.LastWriteAt = &metav1.Time{
191+
Time: time.Unix(int64(meta.LastWriteTS.T), 0),
192+
}
190193
case defs.StatusStarting:
191194
passed := time.Now().UTC().Sub(time.Unix(meta.StartTS, 0))
192195
if passed >= pbmStartingDeadline {

pkg/controller/perconaservermongodbrestore/perconaservermongodbrestore_controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ func (r *ReconcilePerconaServerMongoDBRestore) Reconcile(ctx context.Context, re
188188
}
189189

190190
if cr.Status.State == psmdbv1.RestoreStateNew {
191-
err := r.validate(ctx, cr, cluster)
191+
err = r.validate(ctx, cr, cluster)
192192
if err != nil {
193193
if errors.Is(err, errWaitingPBM) {
194194
err = nil
@@ -209,7 +209,7 @@ func (r *ReconcilePerconaServerMongoDBRestore) Reconcile(ctx context.Context, re
209209
return rr, nil
210210
}
211211

212-
return rr, errors.Wrap(err, "failed to validate restore")
212+
return reconcile.Result{}, errors.Wrap(err, "failed to validate restore")
213213
}
214214

215215
if cluster.Spec.Sharding.Enabled {

pkg/controller/perconaservermongodbrestore/validate.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,28 @@ func (r *ReconcilePerconaServerMongoDBRestore) validate(ctx context.Context, cr
4949
return errors.Wrap(err, "failed to validate backup")
5050
}
5151

52+
if pitr := cr.Spec.PITR; pitr != nil {
53+
switch {
54+
case pitr.Type == psmdbv1.PITRestoreTypeDate && pitr.Date != nil:
55+
if bcp.Status.LastWriteAt != nil {
56+
if pitr.Date.Time.Equal(bcp.Status.LastWriteAt) {
57+
return errors.New("backup's last write is equal to target time")
58+
}
59+
if pitr.Date.Time.Before(bcp.Status.LastWriteAt) {
60+
return errors.New("backup's last write is later than target time")
61+
}
62+
}
63+
ts := pitr.Date.Unix()
64+
if _, err := pbmc.GetPITRChunkContains(ctx, ts); err != nil {
65+
return err
66+
}
67+
case pitr.Type == psmdbv1.PITRestoreTypeLatest:
68+
_, err := pbmc.GetLatestTimelinePITR(ctx)
69+
if err != nil {
70+
return err
71+
}
72+
}
73+
}
74+
5275
return nil
5376
}

0 commit comments

Comments
 (0)