Merge pull request #1365 from filecoin-project/feat/miner-storage-add
storageminer: 'storage attach' command
This commit is contained in:
commit
6981cfb8bc
@ -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>
|
||||||
|
@ -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{
|
||||||
|
@ -29,6 +29,7 @@ func main() {
|
|||||||
rewardsCmd,
|
rewardsCmd,
|
||||||
runCmd,
|
runCmd,
|
||||||
sectorsCmd,
|
sectorsCmd,
|
||||||
|
storageCmd,
|
||||||
setPriceCmd,
|
setPriceCmd,
|
||||||
}
|
}
|
||||||
jaeger := tracing.SetupJaegerTracing("lotus")
|
jaeger := tracing.SetupJaegerTracing("lotus")
|
||||||
|
99
cmd/lotus-storage-miner/storage.go
Normal file
99
cmd/lotus-storage-miner/storage.go
Normal 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)
|
||||||
|
},
|
||||||
|
}
|
@ -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 {
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user