diff --git a/src/internal/operations/restore.go b/src/internal/operations/restore.go index dafb8670e..5fd8c9ffb 100644 --- a/src/internal/operations/restore.go +++ b/src/internal/operations/restore.go @@ -25,6 +25,7 @@ import ( "github.com/alcionai/corso/src/pkg/account" "github.com/alcionai/corso/src/pkg/backup/details" "github.com/alcionai/corso/src/pkg/control" + "github.com/alcionai/corso/src/pkg/fault" "github.com/alcionai/corso/src/pkg/logger" "github.com/alcionai/corso/src/pkg/path" "github.com/alcionai/corso/src/pkg/selectors" @@ -201,7 +202,7 @@ func (op *RestoreOperation) do( return nil, errors.Wrap(err, "getting backup and details") } - paths, err := formatDetailsForRestoration(ctx, op.Selectors, deets) + paths, err := formatDetailsForRestoration(ctx, op.Selectors, deets, op.Errors) if err != nil { return nil, errors.Wrap(err, "formatting paths from details") } @@ -290,6 +291,7 @@ func (op *RestoreOperation) persistResults( if opStats.readErr != nil || opStats.writeErr != nil { op.Status = Failed + // TODO(keepers): replace with fault.Errors handling. return multierror.Append( errors.New("errors prevented the operation from processing"), opStats.readErr, @@ -340,6 +342,7 @@ func formatDetailsForRestoration( ctx context.Context, sel selectors.Selector, deets *details.Details, + errs *fault.Errors, ) ([]path.Path, error) { fds, err := sel.Reduce(ctx, deets) if err != nil { @@ -347,18 +350,21 @@ func formatDetailsForRestoration( } var ( - errs *multierror.Error fdsPaths = fds.Paths() paths = make([]path.Path, len(fdsPaths)) ) for i := range fdsPaths { + if errs.Err() != nil { + return nil, errs.Err() + } + p, err := path.FromDataLayerPath(fdsPaths[i], true) if err != nil { - errs = multierror.Append( - errs, - errors.Wrap(err, "parsing details entry path"), - ) + errs.Add(clues. + Wrap(err, "parsing details path after reduction"). + WithMap(clues.In(ctx)). + With("path", fdsPaths[i])) continue } @@ -377,9 +383,5 @@ func formatDetailsForRestoration( return paths[i].String() < paths[j].String() }) - if errs != nil { - return nil, errs - } - - return paths, nil + return paths, errs.Err() } diff --git a/src/internal/operations/restore_test.go b/src/internal/operations/restore_test.go index 9bf21b806..7b0e0d211 100644 --- a/src/internal/operations/restore_test.go +++ b/src/internal/operations/restore_test.go @@ -285,6 +285,7 @@ func (suite *RestoreOpIntegrationSuite) TestRestore_Run() { ds, err := ro.Run(ctx) require.NoError(t, err, "restoreOp.Run()") + require.Empty(t, ro.Errors.Errs(), "restoreOp.Run() recoverable errors") require.NotEmpty(t, ro.Results, "restoreOp results") require.NotNil(t, ds, "restored details") assert.Equal(t, ro.Status, Completed, "restoreOp status") diff --git a/src/pkg/fault/mock/mock.go b/src/pkg/fault/mock/mock.go index ba560996d..4d3fd06cd 100644 --- a/src/pkg/fault/mock/mock.go +++ b/src/pkg/fault/mock/mock.go @@ -13,5 +13,5 @@ func NewAdder() *Adder { func (ma *Adder) Add(err error) *fault.Errors { ma.Errs = append(ma.Errs, err) - return fault.New(false) + return fault.New(true) }