From 5f45fa7d378edae2fac73517384749fc73d24e89 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 28 Feb 2023 20:33:28 -0700 Subject: tree-wide: Don't pass around a full rebuildmappings.ScanDevicesResult when a simple list of nodes will do --- cmd/btrfs-rec/inspect_rebuildtrees.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'cmd/btrfs-rec/inspect_rebuildtrees.go') diff --git a/cmd/btrfs-rec/inspect_rebuildtrees.go b/cmd/btrfs-rec/inspect_rebuildtrees.go index 0b41dd9..5d782cf 100644 --- a/cmd/btrfs-rec/inspect_rebuildtrees.go +++ b/cmd/btrfs-rec/inspect_rebuildtrees.go @@ -15,7 +15,6 @@ import ( "github.com/datawire/ocibuild/pkg/cliutil" "github.com/spf13/cobra" - "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildmappings" "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildtrees" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" "git.lukeshu.com/btrfs-progs-ng/lib/textui" @@ -30,17 +29,14 @@ func init() { RunE: func(fs *btrfs.FS, cmd *cobra.Command, args []string) error { ctx := cmd.Context() - // This is wrapped in a func in order to *ensure* that `nodeScanResults` goes out of scope once + // This is wrapped in a func in order to *ensure* that `nodeList` goes out of scope once // `rebuilder` has been created. rebuilder, err := func(ctx context.Context) (rebuildtrees.Rebuilder, error) { - dlog.Infof(ctx, "Reading %q...", args[0]) - nodeScanResults, err := readJSONFile[rebuildmappings.ScanDevicesResult](ctx, args[0]) + nodeList, err := readNodeList(ctx, args[0]) if err != nil { return nil, err } - dlog.Infof(ctx, "... done reading %q", args[0]) - - return rebuildtrees.NewRebuilder(ctx, fs, nodeScanResults) + return rebuildtrees.NewRebuilder(ctx, fs, nodeList) }(ctx) if err != nil { return err -- cgit v1.2.3-2-g168b From 058f8c36f6bf9ae2600bf7da33d680ced41eae9a Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Mon, 6 Mar 2023 10:42:51 -0700 Subject: cmd/btrfs-rec: Have each subcommand call runWithRawFS itself --- cmd/btrfs-rec/inspect_rebuildtrees.go | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) (limited to 'cmd/btrfs-rec/inspect_rebuildtrees.go') diff --git a/cmd/btrfs-rec/inspect_rebuildtrees.go b/cmd/btrfs-rec/inspect_rebuildtrees.go index 5d782cf..8c6fc92 100644 --- a/cmd/btrfs-rec/inspect_rebuildtrees.go +++ b/cmd/btrfs-rec/inspect_rebuildtrees.go @@ -21,12 +21,10 @@ import ( ) func init() { - inspectors = append(inspectors, subcommand{ - Command: cobra.Command{ - Use: "rebuild-nodes NODESCAN.json", - Args: cliutil.WrapPositionalArgs(cobra.ExactArgs(1)), - }, - RunE: func(fs *btrfs.FS, cmd *cobra.Command, args []string) error { + inspectors.AddCommand(&cobra.Command{ + Use: "rebuild-nodes NODESCAN.json", + Args: cliutil.WrapPositionalArgs(cobra.ExactArgs(1)), + RunE: runWithRawFS(func(fs *btrfs.FS, cmd *cobra.Command, args []string) error { ctx := cmd.Context() // This is wrapped in a func in order to *ensure* that `nodeList` goes out of scope once @@ -66,6 +64,6 @@ func init() { dlog.Info(ctx, "... done writing") return rebuildErr - }, + }), }) } -- cgit v1.2.3-2-g168b From d8f9c4d091f6c2554251941c933e4549502d2e84 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 7 Mar 2023 12:47:24 -0700 Subject: =?UTF-8?q?cmd/btrs-rec:=20Rename=20'inspect=20rebuild-nodes'?= =?UTF-8?q?=E2=86=92'inspect=20rebuild-trees'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/btrfs-rec/inspect_rebuildtrees.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'cmd/btrfs-rec/inspect_rebuildtrees.go') diff --git a/cmd/btrfs-rec/inspect_rebuildtrees.go b/cmd/btrfs-rec/inspect_rebuildtrees.go index 8c6fc92..f66f287 100644 --- a/cmd/btrfs-rec/inspect_rebuildtrees.go +++ b/cmd/btrfs-rec/inspect_rebuildtrees.go @@ -22,7 +22,7 @@ import ( func init() { inspectors.AddCommand(&cobra.Command{ - Use: "rebuild-nodes NODESCAN.json", + Use: "rebuild-trees NODESCAN.json", Args: cliutil.WrapPositionalArgs(cobra.ExactArgs(1)), RunE: runWithRawFS(func(fs *btrfs.FS, cmd *cobra.Command, args []string) error { ctx := cmd.Context() -- cgit v1.2.3-2-g168b From 3949bd3ff240bc6d06dd08f6e3183e72571e0e1d Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 7 Mar 2023 12:10:42 -0700 Subject: Expose node-lists as a thing on the CLI --- cmd/btrfs-rec/inspect_rebuildtrees.go | 46 ++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 14 deletions(-) (limited to 'cmd/btrfs-rec/inspect_rebuildtrees.go') diff --git a/cmd/btrfs-rec/inspect_rebuildtrees.go b/cmd/btrfs-rec/inspect_rebuildtrees.go index f66f287..676533a 100644 --- a/cmd/btrfs-rec/inspect_rebuildtrees.go +++ b/cmd/btrfs-rec/inspect_rebuildtrees.go @@ -5,7 +5,6 @@ package main import ( - "context" "os" "runtime" "time" @@ -17,25 +16,39 @@ import ( "git.lukeshu.com/btrfs-progs-ng/cmd/btrfs-rec/inspect/rebuildtrees" "git.lukeshu.com/btrfs-progs-ng/lib/btrfs" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfs/btrfsvol" + "git.lukeshu.com/btrfs-progs-ng/lib/btrfsutil" "git.lukeshu.com/btrfs-progs-ng/lib/textui" ) func init() { - inspectors.AddCommand(&cobra.Command{ - Use: "rebuild-trees NODESCAN.json", - Args: cliutil.WrapPositionalArgs(cobra.ExactArgs(1)), + var nodeListFilename string + cmd := &cobra.Command{ + Use: "rebuild-trees", + Long: "" + + "Rebuild broken btrees based on missing items that are implied " + + "by present items. This requires functioning " + + "chunk/dev-extent/blockgroup trees, which can be rebuilt " + + "separately with `btrfs-rec inspect rebuild-mappings`.\n" + + "\n" + + "If no --node-list is given, then a slow sector-by-sector scan " + + "will be used to find all nodes.", + Args: cliutil.WrapPositionalArgs(cobra.NoArgs), RunE: runWithRawFS(func(fs *btrfs.FS, cmd *cobra.Command, args []string) error { ctx := cmd.Context() - // This is wrapped in a func in order to *ensure* that `nodeList` goes out of scope once - // `rebuilder` has been created. - rebuilder, err := func(ctx context.Context) (rebuildtrees.Rebuilder, error) { - nodeList, err := readNodeList(ctx, args[0]) - if err != nil { - return nil, err - } - return rebuildtrees.NewRebuilder(ctx, fs, nodeList) - }(ctx) + var nodeList []btrfsvol.LogicalAddr + var err error + if nodeListFilename != "" { + nodeList, err = readJSONFile[[]btrfsvol.LogicalAddr](ctx, nodeListFilename) + } else { + nodeList, err = btrfsutil.ListNodes(ctx, fs) + } + if err != nil { + return err + } + + rebuilder, err := rebuildtrees.NewRebuilder(ctx, fs, nodeList) if err != nil { return err } @@ -65,5 +78,10 @@ func init() { return rebuildErr }), - }) + } + cmd.Flags().StringVar(&nodeListFilename, "node-list", "", + "Output of 'btrfs-recs inspect [rebuild-mappings] list-nodes' to use for the node list") + noError(cmd.MarkFlagFilename("node-list")) + + inspectors.AddCommand(cmd) } -- cgit v1.2.3-2-g168b