diff --git a/changelogs/unreleased/6303-Lyndon-Li b/changelogs/unreleased/6303-Lyndon-Li new file mode 100644 index 000000000..72c15680e --- /dev/null +++ b/changelogs/unreleased/6303-Lyndon-Li @@ -0,0 +1 @@ +Fix a PVR issue for generic data path -- the namespace remap was not honored, and enhance the code for better error handling \ No newline at end of file diff --git a/pkg/controller/pod_volume_restore_controller.go b/pkg/controller/pod_volume_restore_controller.go index a2db1ba49..d48925710 100644 --- a/pkg/controller/pod_volume_restore_controller.go +++ b/pkg/controller/pod_volume_restore_controller.go @@ -142,7 +142,7 @@ func (c *PodVolumeRestoreReconciler) Reconcile(ctx context.Context, req ctrl.Req log.WithField("path", volumePath.ByPath).Debugf("Found host path") - if err := fsRestore.Init(ctx, pvr.Spec.BackupStorageLocation, pvr.Spec.Pod.Namespace, pvr.Spec.UploaderType, + if err := fsRestore.Init(ctx, pvr.Spec.BackupStorageLocation, pvr.Spec.SourceNamespace, pvr.Spec.UploaderType, podvolume.GetPvrRepositoryType(pvr), pvr.Spec.RepoIdentifier, c.repositoryEnsurer, c.credentialGetter); err != nil { return c.errorOut(ctx, pvr, err, "error to initialize data path", log) } @@ -323,7 +323,7 @@ func (c *PodVolumeRestoreReconciler) OnDataPathFailed(ctx context.Context, names log := c.logger.WithField("pvr", pvrName) - log.WithError(err).Info("Async fs restore data path failed") + log.WithError(err).Error("Async fs restore data path failed") var pvr velerov1api.PodVolumeRestore if getErr := c.Client.Get(ctx, types.NamespacedName{Name: pvrName, Namespace: namespace}, &pvr); getErr != nil { @@ -338,7 +338,7 @@ func (c *PodVolumeRestoreReconciler) OnDataPathCancelled(ctx context.Context, na log := c.logger.WithField("pvr", pvrName) - log.Info("Async fs restore data path canceled") + log.Warn("Async fs restore data path canceled") var pvr velerov1api.PodVolumeRestore if getErr := c.Client.Get(ctx, types.NamespacedName{Name: pvrName, Namespace: namespace}, &pvr); getErr != nil { diff --git a/pkg/uploader/kopia/snapshot.go b/pkg/uploader/kopia/snapshot.go index 369316187..96d2ddc1d 100644 --- a/pkg/uploader/kopia/snapshot.go +++ b/pkg/uploader/kopia/snapshot.go @@ -256,6 +256,15 @@ func findPreviousSnapshotManifest(ctx context.Context, rep repo.Repository, sour continue } + uploaderName, found := p.Tags[uploader.SnapshotUploaderTag] + if !found { + continue + } + + if uploaderName != snapshotTags[uploader.SnapshotUploaderTag] { + continue + } + if noLaterThan != nil && p.StartTime.After(*noLaterThan) { continue } @@ -278,6 +287,13 @@ func Restore(ctx context.Context, rep repo.RepositoryWriter, progress *Progress, kopiaCtx := logging.SetupKopiaLog(ctx, log) + snapshot, err := snapshot.LoadSnapshot(kopiaCtx, rep, manifest.ID(snapshotID)) + if err != nil { + return 0, 0, errors.Wrapf(err, "Unable to load snapshot %v", snapshotID) + } + + log.Infof("Restore from snapshot %s, description %s, created time %v, tags %v", snapshotID, snapshot.Description, snapshot.EndTime.ToTime(), snapshot.Tags) + rootEntry, err := snapshotfs.FilesystemEntryFromIDWithPath(kopiaCtx, rep, snapshotID, false) if err != nil { return 0, 0, errors.Wrapf(err, "Unable to get filesystem entry for snapshot %v", snapshotID) diff --git a/pkg/uploader/provider/kopia.go b/pkg/uploader/provider/kopia.go index ea00be46f..f578419a6 100644 --- a/pkg/uploader/provider/kopia.go +++ b/pkg/uploader/provider/kopia.go @@ -144,6 +144,7 @@ func (kp *kopiaProvider) RunBackup( tags = make(map[string]string) } tags[uploader.SnapshotRequestorTag] = kp.requestorType + tags[uploader.SnapshotUploaderTag] = uploader.KopiaType snapshotInfo, isSnapshotEmpty, err := BackupFunc(ctx, kpUploader, repoWriter, path, forceFull, parentSnapshot, tags, log) if err != nil { diff --git a/pkg/uploader/types.go b/pkg/uploader/types.go index ee565fa80..b081069de 100644 --- a/pkg/uploader/types.go +++ b/pkg/uploader/types.go @@ -25,6 +25,7 @@ const ( ResticType = "restic" KopiaType = "kopia" SnapshotRequestorTag = "snapshot-requestor" + SnapshotUploaderTag = "snapshot-uploader" ) // ValidateUploaderType validates if the input param is a valid uploader type.