feat: snapshot: remove existing chain

Remove existing chain on a snapshot-import

log info instead of print

log info instead of print

Remove defer lock

Remove defer lock, and explicitly close the lockedRepo instead
This commit is contained in:
Phi 2023-06-19 14:32:58 +02:00
parent 517c0a53b1
commit 5201744199
2 changed files with 103 additions and 0 deletions

View File

@ -12,6 +12,7 @@ import (
"io" "io"
"os" "os"
"path" "path"
"path/filepath"
"runtime/pprof" "runtime/pprof"
"strings" "strings"
@ -27,6 +28,7 @@ import (
"go.opencensus.io/stats" "go.opencensus.io/stats"
"go.opencensus.io/stats/view" "go.opencensus.io/stats/view"
"go.opencensus.io/tag" "go.opencensus.io/tag"
"go.uber.org/multierr"
"golang.org/x/xerrors" "golang.org/x/xerrors"
"gopkg.in/cheggaaa/pb.v1" "gopkg.in/cheggaaa/pb.v1"
@ -128,6 +130,10 @@ var DaemonCmd = &cli.Command{
Name: "import-snapshot", Name: "import-snapshot",
Usage: "import chain state from a given chain export file or url", Usage: "import chain state from a given chain export file or url",
}, },
&cli.BoolFlag{
Name: "remove-existing-chain",
Usage: "remove existing chain and splitstore data on a snapshot-import",
},
&cli.BoolFlag{ &cli.BoolFlag{
Name: "halt-after-import", Name: "halt-after-import",
Usage: "halt the process after importing chain from file", Usage: "halt the process after importing chain from file",
@ -285,6 +291,69 @@ var DaemonCmd = &cli.Command{
} }
} }
if cctx.Bool("remove-existing-chain") {
lr, err := repo.NewFS(cctx.String("repo"))
if err != nil {
return xerrors.Errorf("error opening fs repo: %w", err)
}
exists, err := lr.Exists()
if err != nil {
return err
}
if !exists {
return xerrors.Errorf("lotus repo doesn't exist")
}
lockedRepo, err := lr.Lock(repo.FullNode)
if err != nil {
return xerrors.Errorf("error locking repo: %w", err)
}
cfg, err := lockedRepo.Config()
if err != nil {
lockedRepo.Close()
return xerrors.Errorf("error getting config: %w", err)
}
fullNodeConfig, ok := cfg.(*config.FullNode)
if !ok {
lockedRepo.Close()
return xerrors.Errorf("wrong config type: %T", cfg)
}
if fullNodeConfig.Chainstore.EnableSplitstore {
log.Info("removing splitstore directory...")
err = deleteSplitstoreDir(lockedRepo)
if err != nil {
lockedRepo.Close()
return xerrors.Errorf("error removing splitstore directory: %w", err)
}
}
// Get the base repo path
repoPath := lockedRepo.Path()
// Construct the path to the chain directory
chainPath := filepath.Join(repoPath, "datastore", "chain")
log.Info("removing chain directory:", chainPath)
err = os.RemoveAll(chainPath)
if err != nil {
lockedRepo.Close()
return xerrors.Errorf("error removing chain directory: %w", err)
}
log.Info("chain and splitstore data have been removed")
// Explicitly close the lockedRepo now that we're done with it.
err = lockedRepo.Close()
if err != nil {
return xerrors.Errorf("error releasing lock: %w", err)
}
}
chainfile := cctx.String("import-chain") chainfile := cctx.String("import-chain")
snapshot := cctx.String("import-snapshot") snapshot := cctx.String("import-snapshot")
if chainfile != "" || snapshot != "" { if chainfile != "" || snapshot != "" {
@ -722,3 +791,36 @@ func slashFilterMinedBlock(ctx context.Context, sf *slashfilter.SlashFilter, a l
return nil, nil, nil return nil, nil, nil
} }
func deleteSplitstoreDir(lr repo.LockedRepo) error {
path, err := lr.SplitstorePath()
if err != nil {
return xerrors.Errorf("error getting splitstore path: %w", err)
}
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
}

View File

@ -65,6 +65,7 @@ OPTIONS:
--bootstrap (default: true) --bootstrap (default: true)
--import-chain value on first run, load chain from given file or url and validate --import-chain value on first run, load chain from given file or url and validate
--import-snapshot value import chain state from a given chain export file or url --import-snapshot value import chain state from a given chain export file or url
--remove-existing-chain remove existing chain and splitstore data on a snapshot-import (default: false)
--halt-after-import halt the process after importing chain from file (default: false) --halt-after-import halt the process after importing chain from file (default: false)
--lite start lotus in lite mode (default: false) --lite start lotus in lite mode (default: false)
--pprof value specify name of file for writing cpu profile to --pprof value specify name of file for writing cpu profile to