From c0db4fba93885cbf649b080e73131811ac20df85 Mon Sep 17 00:00:00 2001 From: Denis Shaposhnikov <993498+dsh2dsh@users.noreply.github.com> Date: Mon, 27 Jan 2025 19:24:58 +0100 Subject: [PATCH] Fix panic in ZFSListMapping after last commit --- internal/zfs/list.go | 18 ------------------ internal/zfs/mapping.go | 38 +++++++++++++++++++++----------------- 2 files changed, 21 insertions(+), 35 deletions(-) diff --git a/internal/zfs/list.go b/internal/zfs/list.go index c4fb2ef..cdd1de1 100644 --- a/internal/zfs/list.go +++ b/internal/zfs/list.go @@ -104,24 +104,6 @@ func maybeDatasetNotExists(cmd *zfscmd.Cmd, path string, err error) error { return err } -func listDatasets(ctx context.Context, properties []string, - notExistHint *DatasetPath, cmd *zfscmd.Cmd, -) ([]*DatasetPath, error) { - datasets := []*DatasetPath{} - zfsList := ListIter(ctx, properties, notExistHint, cmd) - for fields, err := range zfsList { - if err != nil { - return nil, err - } - path, err := NewDatasetPath(fields[0]) - if err != nil { - return nil, err - } - datasets = append(datasets, path) - } - return datasets, nil -} - func listVersions(ctx context.Context, props []string, fs *DatasetPath, cmd *zfscmd.Cmd, ) ([]FilesystemVersion, error) { diff --git a/internal/zfs/mapping.go b/internal/zfs/mapping.go index 2f29c02..06fe213 100644 --- a/internal/zfs/mapping.go +++ b/internal/zfs/mapping.go @@ -3,7 +3,6 @@ package zfs import ( "context" "fmt" - "slices" "github.com/dsh2dsh/zrepl/internal/zfs/zfscmd" ) @@ -18,39 +17,44 @@ func ZFSListMapping(ctx context.Context, filter DatasetFilter, props := []string{"name"} cmd := NewListCmd(ctx, props, []string{"-r", "-t", "filesystem,volume"}) v, err, _ := sg.Do(cmd.String(), func() (any, error) { - datasets, err := listDatasets(ctx, props, nil, cmd) - if err != nil { - return nil, err + datasets := []*DatasetPath{} + for fields, err := range ListIter(ctx, props, nil, cmd) { + if err != nil { + return nil, err + } + path, err := NewDatasetPath(fields[0]) + if err != nil { + return nil, err + } + datasets = append(datasets, path) } return datasets, nil }) if err != nil { return nil, err //nolint:wrapcheck // already wrapped } - return deleteUnmatchedDatasets(ctx, filter, v.([]*DatasetPath)) + return filterDatasets(ctx, filter, v.([]*DatasetPath)) } -func deleteUnmatchedDatasets(ctx context.Context, filter DatasetFilter, - datasets []*DatasetPath, +func filterDatasets(ctx context.Context, filter DatasetFilter, + all []*DatasetPath, ) ([]*DatasetPath, error) { var filterErr error roots := newRecursiveDatasets() unmatchedDatasets := filter.UserSpecifiedDatasets() - datasets = slices.DeleteFunc(datasets, func(path *DatasetPath) bool { - delete(unmatchedDatasets, path.ToString()) - if filterErr != nil { - return false - } - + datasets := []*DatasetPath{} + for _, path := range all { root, pass, err := filter.Filter2(path) if err != nil { - filterErr = fmt.Errorf("error calling filter: %w", err) - return false + return nil, fmt.Errorf("error calling filter: %w", err) } roots.Add(root, path, pass) - return !pass - }) + if pass { + datasets = append(datasets, path) + } + delete(unmatchedDatasets, path.ToString()) + } roots.UpdateChildren() prom.ZFSListUnmatchedUserSpecifiedDatasetCount.