Skip to content

Commit

Permalink
Fix panic in ZFSListMapping after last commit
Browse files Browse the repository at this point in the history
  • Loading branch information
dsh2dsh committed Jan 27, 2025
1 parent 26dc914 commit c0db4fb
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 35 deletions.
18 changes: 0 additions & 18 deletions internal/zfs/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
38 changes: 21 additions & 17 deletions internal/zfs/mapping.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package zfs
import (
"context"
"fmt"
"slices"

"github.com/dsh2dsh/zrepl/internal/zfs/zfscmd"
)
Expand All @@ -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.
Expand Down

0 comments on commit c0db4fb

Please sign in to comment.