Skip to content

Commit 3fac1cc

Browse files
committed
PBM-1114: check backup files before done
1 parent 0d82ec4 commit 3fac1cc

File tree

3 files changed

+50
-16
lines changed

3 files changed

+50
-16
lines changed

pbm/backup/backup.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,11 @@ func (b *Backup) Run(ctx context.Context, bcp *ctrl.BackupCmd, opid ctrl.OPID, l
367367
return errors.Wrap(err, "dump metadata")
368368
}
369369

370+
err = CheckBackupFiles(ctx, stg, bcp.Name)
371+
if err != nil {
372+
return errors.Wrap(err, "check backup files")
373+
}
374+
370375
err = ChangeBackupStateWithUnix(b.leadConn, bcp.Name, defs.StatusDone, unix, "")
371376
return errors.Wrapf(err, "check cluster for backup done: update backup meta with %s",
372377
defs.StatusDone)

pbm/backup/storage.go

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package backup
22

33
import (
44
"context"
5+
"encoding/json"
56
"path"
67
"runtime"
78
"sync"
@@ -16,12 +17,45 @@ import (
1617
"github.com/percona/percona-backup-mongodb/pbm/version"
1718
)
1819

19-
func CheckBackupFiles(ctx context.Context, bcp *BackupMeta, stg storage.Storage) error {
20-
// !!! TODO: Check physical files ?
21-
if bcp.Type != defs.LogicalBackup {
22-
return nil
20+
func CheckBackupFiles(ctx context.Context, stg storage.Storage, name string) error {
21+
bcp, err := ReadMetadata(stg, name+defs.MetadataFileSuffix)
22+
if err != nil {
23+
return errors.Wrap(err, "read backup metadata")
24+
}
25+
26+
return CheckBackupDataFiles(ctx, stg, bcp)
27+
}
28+
29+
func ReadMetadata(stg storage.Storage, filename string) (*BackupMeta, error) {
30+
rdr, err := stg.SourceReader(filename)
31+
if err != nil {
32+
return nil, errors.Wrap(err, "open")
33+
}
34+
defer rdr.Close()
35+
36+
var meta *BackupMeta
37+
err = json.NewDecoder(rdr).Decode(&meta)
38+
if err != nil {
39+
return nil, errors.Wrap(err, "decode")
2340
}
2441

42+
return meta, nil
43+
}
44+
45+
func CheckBackupDataFiles(ctx context.Context, stg storage.Storage, bcp *BackupMeta) error {
46+
switch bcp.Type {
47+
case defs.LogicalBackup:
48+
return checkLogicalBackupFiles(ctx, stg, bcp)
49+
case defs.PhysicalBackup, defs.IncrementalBackup:
50+
return checkPhysicalBackupFiles(ctx, stg, bcp)
51+
case defs.ExternalBackup:
52+
return nil // no files available
53+
}
54+
55+
return errors.Errorf("unknown backup type %s", bcp.Type)
56+
}
57+
58+
func checkLogicalBackupFiles(ctx context.Context, stg storage.Storage, bcp *BackupMeta) error {
2559
legacy := version.IsLegacyArchive(bcp.PBMVersion)
2660
eg, _ := errgroup.WithContext(ctx)
2761
for _, rs := range bcp.Replsets {
@@ -74,6 +108,10 @@ func CheckBackupFiles(ctx context.Context, bcp *BackupMeta, stg storage.Storage)
74108
return eg.Wait()
75109
}
76110

111+
func checkPhysicalBackupFiles(ctx context.Context, stg storage.Storage, bcp *BackupMeta) error {
112+
return nil
113+
}
114+
77115
func ReadArchiveNamespaces(stg storage.Storage, metafile string) ([]*archive.Namespace, error) {
78116
r, err := stg.SourceReader(metafile)
79117
if err != nil {

pbm/resync/rsync.go

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package resync
22

33
import (
44
"context"
5-
"encoding/json"
65
"runtime"
76
"strings"
87
"sync"
@@ -293,21 +292,13 @@ func getAllBackupMetaFromStorage(
293292

294293
backupMeta := make([]*backup.BackupMeta, 0, len(backupFiles))
295294
for _, b := range backupFiles {
296-
d, err := stg.SourceReader(b.Name)
295+
meta, err := backup.ReadMetadata(stg, b.Name)
297296
if err != nil {
298-
l.Error("read meta for %v", b.Name)
297+
l.Error("read metadata of backup %s: %v", b.Name, err)
299298
continue
300299
}
301300

302-
var meta *backup.BackupMeta
303-
err = json.NewDecoder(d).Decode(&meta)
304-
d.Close()
305-
if err != nil {
306-
l.Error("unmarshal backup meta [%s]", b.Name)
307-
continue
308-
}
309-
310-
err = backup.CheckBackupFiles(ctx, meta, stg)
301+
err = backup.CheckBackupDataFiles(ctx, stg, meta)
311302
if err != nil {
312303
l.Warning("skip snapshot %s: %v", meta.Name, err)
313304
meta.Status = defs.StatusError

0 commit comments

Comments
 (0)