add lotus-shed splitstore clear command
This commit is contained in:
parent
8c326d7bad
commit
13e9d7c71c
@ -11,6 +11,7 @@ import (
|
|||||||
|
|
||||||
"github.com/dgraph-io/badger/v2"
|
"github.com/dgraph-io/badger/v2"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
|
"go.uber.org/multierr"
|
||||||
"golang.org/x/sync/errgroup"
|
"golang.org/x/sync/errgroup"
|
||||||
"golang.org/x/xerrors"
|
"golang.org/x/xerrors"
|
||||||
|
|
||||||
@ -29,6 +30,7 @@ var splitstoreCmd = &cli.Command{
|
|||||||
Description: "splitstore utilities",
|
Description: "splitstore utilities",
|
||||||
Subcommands: []*cli.Command{
|
Subcommands: []*cli.Command{
|
||||||
splitstoreRollbackCmd,
|
splitstoreRollbackCmd,
|
||||||
|
splitstoreClearCmd,
|
||||||
splitstoreCheckCmd,
|
splitstoreCheckCmd,
|
||||||
splitstoreInfoCmd,
|
splitstoreInfoCmd,
|
||||||
},
|
},
|
||||||
@ -118,6 +120,65 @@ var splitstoreRollbackCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var splitstoreClearCmd = &cli.Command{
|
||||||
|
Name: "clear",
|
||||||
|
Description: "clears a splitstore installation for restart from snapshot",
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "repo",
|
||||||
|
Value: "~/.lotus",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Action: func(cctx *cli.Context) error {
|
||||||
|
r, err := repo.NewFS(cctx.String("repo"))
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error opening fs repo: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
exists, err := r.Exists()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if !exists {
|
||||||
|
return xerrors.Errorf("lotus repo doesn't exist")
|
||||||
|
}
|
||||||
|
|
||||||
|
lr, err := r.Lock(repo.FullNode)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error locking repo: %w", err)
|
||||||
|
}
|
||||||
|
defer lr.Close() //nolint:errcheck
|
||||||
|
|
||||||
|
cfg, err := lr.Config()
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error getting config: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fncfg, ok := cfg.(*config.FullNode)
|
||||||
|
if !ok {
|
||||||
|
return xerrors.Errorf("wrong config type: %T", cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !fncfg.Chainstore.EnableSplitstore {
|
||||||
|
return xerrors.Errorf("splitstore is not enabled")
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("clearing splitstore directory...")
|
||||||
|
err = clearSplitstoreDir(lr)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error clearing splitstore directory: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("deleting splitstore keys from metadata datastore...")
|
||||||
|
err = deleteSplitstoreKeys(lr)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error deleting splitstore keys: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
func copyHotstoreToColdstore(lr repo.LockedRepo, gcColdstore bool) error {
|
func copyHotstoreToColdstore(lr repo.LockedRepo, gcColdstore bool) error {
|
||||||
repoPath := lr.Path()
|
repoPath := lr.Path()
|
||||||
dataPath := filepath.Join(repoPath, "datastore")
|
dataPath := filepath.Join(repoPath, "datastore")
|
||||||
@ -224,6 +285,30 @@ func deleteSplitstoreDir(lr repo.LockedRepo) error {
|
|||||||
return os.RemoveAll(path)
|
return os.RemoveAll(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func clearSplitstoreDir(lr repo.LockedRepo) error {
|
||||||
|
path, err := lr.SplitstorePath()
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error getting splitstore path: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
entries, err := os.ReadDir(path)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("error reading splitstore directory %s: %W", path, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var result error
|
||||||
|
for _, e := range entries {
|
||||||
|
target := filepath.Join(path, e.Name())
|
||||||
|
err = os.RemoveAll(target)
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("error removing %s: %s", target, err)
|
||||||
|
result = multierr.Append(result, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
func deleteSplitstoreKeys(lr repo.LockedRepo) error {
|
func deleteSplitstoreKeys(lr repo.LockedRepo) error {
|
||||||
ds, err := lr.Datastore(context.TODO(), "/metadata")
|
ds, err := lr.Datastore(context.TODO(), "/metadata")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user