Merge pull request #1365 from filecoin-project/feat/miner-storage-add

storageminer: 'storage attach' command
This commit is contained in:
Łukasz Magiera 2020-03-09 07:28:11 +01:00 committed by GitHub
commit 6981cfb8bc
6 changed files with 119 additions and 7 deletions

View File

@ -1,7 +1,7 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>Sending Funds - Lotus Fountain</title> <title>Creating Storage Miner (wait) - Lotus Fountain</title>
<link rel="stylesheet" type="text/css" href="main.css"> <link rel="stylesheet" type="text/css" href="main.css">
</head> </head>
<body> <body>

View File

@ -198,7 +198,7 @@ var initCmd = &cli.Command{
} }
if err := ioutil.WriteFile(filepath.Join(lr.Path(), "sectorstore.json"), b, 0644); err != nil { if err := ioutil.WriteFile(filepath.Join(lr.Path(), "sectorstore.json"), b, 0644); err != nil {
return xerrors.Errorf("persisting storage metadata (%s): %w", filepath.Join(lr.Path(), "storage.json"), err) return xerrors.Errorf("persisting storage metadata (%s): %w", filepath.Join(lr.Path(), "sectorstore.json"), err)
} }
sc.StoragePaths = append(sc.StoragePaths, config.LocalPath{ sc.StoragePaths = append(sc.StoragePaths, config.LocalPath{

View File

@ -29,6 +29,7 @@ func main() {
rewardsCmd, rewardsCmd,
runCmd, runCmd,
sectorsCmd, sectorsCmd,
storageCmd,
setPriceCmd, setPriceCmd,
} }
jaeger := tracing.SetupJaegerTracing("lotus") jaeger := tracing.SetupJaegerTracing("lotus")

View File

@ -0,0 +1,99 @@
package main
import (
"encoding/json"
"io/ioutil"
"os"
"path/filepath"
"github.com/google/uuid"
"github.com/mitchellh/go-homedir"
"golang.org/x/xerrors"
"gopkg.in/urfave/cli.v2"
lcli "github.com/filecoin-project/lotus/cli"
"github.com/filecoin-project/lotus/node/config"
)
const metaFile = "sectorstore.json"
var storageCmd = &cli.Command{
Name: "storage",
Usage: "manage sector storage",
Subcommands: []*cli.Command{
storageAttachCmd,
},
}
var storageAttachCmd = &cli.Command{
Name: "attach",
Usage: "attach local storage path",
Flags: []cli.Flag{
&cli.BoolFlag{
Name: "init",
Usage: "initialize the path first",
},
&cli.Uint64Flag{
Name: "weight",
Usage: "(for init) path weight",
Value: 10,
},
&cli.BoolFlag{
Name: "seal",
Usage: "(for init) use path for sealing",
},
&cli.BoolFlag{
Name: "store",
Usage: "(for init) use path for long-term storage",
},
},
Action: func(cctx *cli.Context) error {
nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
if err != nil {
return err
}
defer closer()
ctx := lcli.ReqContext(cctx)
if !cctx.Args().Present() {
return xerrors.Errorf("must specify storage path to attach")
}
p, err := homedir.Expand(cctx.Args().First())
if err != nil {
return xerrors.Errorf("expanding path: %w", err)
}
if cctx.Bool("init") {
_, err := os.Stat(filepath.Join(p, metaFile))
if !os.IsNotExist(err) {
if err == nil {
return xerrors.Errorf("path is already initialized")
}
return err
}
cfg := &config.StorageMeta{
ID: uuid.New().String(),
Weight: cctx.Uint64("weight"),
CanSeal: cctx.Bool("seal"),
CanStore: cctx.Bool("store"),
}
if !(cfg.CanStore || cfg.CanSeal) {
return xerrors.Errorf("must specify at least one of --store of --seal")
}
b, err := json.MarshalIndent(cfg, "", " ")
if err != nil {
return xerrors.Errorf("marshaling storage config: %w", err)
}
if err := ioutil.WriteFile(filepath.Join(p, metaFile), b, 0644); err != nil {
return xerrors.Errorf("persisting storage metadata (%s): %w", filepath.Join(p, metaFile), err)
}
}
return nodeApi.StorageAddLocal(ctx, p)
},
}

View File

@ -40,16 +40,22 @@ type lockedMemRepo struct {
tempDir string tempDir string
token *byte token *byte
sc *config.StorageConfig
} }
func (lmem *lockedMemRepo) GetStorage() (config.StorageConfig, error) { func (lmem *lockedMemRepo) GetStorage() (config.StorageConfig, error) {
return config.StorageConfig{StoragePaths: []config.LocalPath{ if lmem.sc == nil {
{Path: lmem.Path()}, lmem.sc = &config.StorageConfig{StoragePaths: []config.LocalPath{
}}, nil {Path: lmem.Path()},
}}
}
return *lmem.sc, nil
} }
func (lmem *lockedMemRepo) SetStorage(config.StorageConfig) error { func (lmem *lockedMemRepo) SetStorage(sc config.StorageConfig) error {
panic("implement me") lmem.sc = &sc
return nil
} }
func (lmem *lockedMemRepo) Path() string { func (lmem *lockedMemRepo) Path() string {

View File

@ -96,12 +96,18 @@ func (m *Manager) AddLocalStorage(path string) error {
return xerrors.Errorf("opening local path: %w", err) return xerrors.Errorf("opening local path: %w", err)
} }
// TODO: Locks!
sc, err := m.storage.localStorage.GetStorage() sc, err := m.storage.localStorage.GetStorage()
if err != nil { if err != nil {
return xerrors.Errorf("get storage config: %w", err) return xerrors.Errorf("get storage config: %w", err)
} }
sc.StoragePaths = append(sc.StoragePaths, config.LocalPath{Path: path}) sc.StoragePaths = append(sc.StoragePaths, config.LocalPath{Path: path})
if err := m.storage.localStorage.SetStorage(sc); err != nil {
return xerrors.Errorf("get storage config: %w", err)
}
return nil return nil
} }