From 8cff52aef6261b2c8431bb9b178f657207e49954 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Fri, 15 Jul 2022 12:44:05 +0200 Subject: [PATCH] Storage detach/attach in lotus-miner, cli commands --- api/api_storage.go | 6 +- api/api_worker.go | 6 +- api/docgen/docgen.go | 2 + api/proxy_gen.go | 34 +++++++-- build/openrpc/full.json.gz | Bin 28042 -> 28040 bytes build/openrpc/gateway.json.gz | Bin 4895 -> 4894 bytes build/openrpc/miner.json.gz | Bin 14275 -> 14383 bytes build/openrpc/worker.json.gz | Bin 4850 -> 4881 bytes cmd/lotus-miner/storage.go | 82 ++++++++++++++++++++++ cmd/lotus-worker/main.go | 2 +- cmd/lotus-worker/sealworker/rpc.go | 4 +- cmd/lotus-worker/storage.go | 82 ++++++++++++++++++++++ documentation/en/api-v0-methods-miner.md | 33 ++++++++- documentation/en/api-v0-methods-worker.md | 2 +- documentation/en/cli-lotus-miner.md | 42 +++++++++-- documentation/en/cli-lotus-worker.md | 34 ++++++++- node/impl/storminer.go | 16 +++++ storage/sealer/manager.go | 50 +++++++++++++ 18 files changed, 372 insertions(+), 23 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 1740e9778..83357feff 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -176,9 +176,9 @@ type StorageMiner interface { StorageAuthVerify(ctx context.Context, token string) ([]auth.Permission, error) //perm:read - StorageAddLocal(ctx context.Context, path string) error //perm:admin - //StorageDetachLocal(ctx context.Context, path string) error //perm:admin - //StorageRedeclareLocal(ctx context.Context, id storiface.ID, dropMissing bool) error //perm:admin + StorageAddLocal(ctx context.Context, path string) error //perm:admin + StorageDetachLocal(ctx context.Context, path string) error //perm:admin + StorageRedeclareLocal(ctx context.Context, id *storiface.ID, dropMissing bool) error //perm:admin MarketImportDealData(ctx context.Context, propcid cid.Cid, path string) error //perm:write MarketListDeals(ctx context.Context) ([]*MarketDeal, error) //perm:read diff --git a/api/api_worker.go b/api/api_worker.go index 9bb2c299b..e59e9f922 100644 --- a/api/api_worker.go +++ b/api/api_worker.go @@ -59,9 +59,9 @@ type Worker interface { // Storage / Other Remove(ctx context.Context, sector abi.SectorID) error //perm:admin - StorageAddLocal(ctx context.Context, path string) error //perm:admin - StorageDetachLocal(ctx context.Context, path string) error //perm:admin - StorageRedeclareLocal(ctx context.Context, id storiface.ID, dropMissing bool) error //perm:admin + StorageAddLocal(ctx context.Context, path string) error //perm:admin + StorageDetachLocal(ctx context.Context, path string) error //perm:admin + StorageRedeclareLocal(ctx context.Context, id *storiface.ID, dropMissing bool) error //perm:admin // SetEnabled marks the worker as enabled/disabled. Not that this setting // may take a few seconds to propagate to task scheduler diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index e6e16986f..b2a96f8b7 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -272,6 +272,8 @@ func init() { Read: [storiface.FileTypes]uint{2, 3, 0}, }, }) + storifaceid := storiface.ID("1399aa04-2625-44b1-bad4-bd07b59b22c4") + addExample(&storifaceid) // worker specific addExample(storiface.AcquireMove) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 10dee583d..961625606 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -850,7 +850,7 @@ type StorageMinerStruct struct { SectorsUpdate func(p0 context.Context, p1 abi.SectorNumber, p2 SectorState) error `perm:"admin"` - StorageAddLocal func(p0 context.Context, p1 string) error `` + StorageAddLocal func(p0 context.Context, p1 string) error `perm:"admin"` StorageAttach func(p0 context.Context, p1 storiface.StorageInfo, p2 fsutil.FsStat) error `perm:"admin"` @@ -862,6 +862,8 @@ type StorageMinerStruct struct { StorageDetach func(p0 context.Context, p1 storiface.ID, p2 string) error `perm:"admin"` + StorageDetachLocal func(p0 context.Context, p1 string) error `perm:"admin"` + StorageDropSector func(p0 context.Context, p1 storiface.ID, p2 abi.SectorID, p3 storiface.SectorFileType) error `perm:"admin"` StorageFindSector func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 abi.SectorSize, p4 bool) ([]storiface.SectorStorageInfo, error) `perm:"admin"` @@ -876,6 +878,8 @@ type StorageMinerStruct struct { StorageLock func(p0 context.Context, p1 abi.SectorID, p2 storiface.SectorFileType, p3 storiface.SectorFileType) error `perm:"admin"` + StorageRedeclareLocal func(p0 context.Context, p1 *storiface.ID, p2 bool) error `perm:"admin"` + StorageReportHealth func(p0 context.Context, p1 storiface.ID, p2 storiface.HealthReport) error `perm:"admin"` StorageStat func(p0 context.Context, p1 storiface.ID) (fsutil.FsStat, error) `perm:"admin"` @@ -971,7 +975,7 @@ type WorkerStruct struct { StorageDetachLocal func(p0 context.Context, p1 string) error `perm:"admin"` - StorageRedeclareLocal func(p0 context.Context, p1 storiface.ID, p2 bool) error `perm:"admin"` + StorageRedeclareLocal func(p0 context.Context, p1 *storiface.ID, p2 bool) error `perm:"admin"` TaskDisable func(p0 context.Context, p1 sealtasks.TaskType) error `perm:"admin"` @@ -5093,6 +5097,17 @@ func (s *StorageMinerStub) StorageDetach(p0 context.Context, p1 storiface.ID, p2 return ErrNotSupported } +func (s *StorageMinerStruct) StorageDetachLocal(p0 context.Context, p1 string) error { + if s.Internal.StorageDetachLocal == nil { + return ErrNotSupported + } + return s.Internal.StorageDetachLocal(p0, p1) +} + +func (s *StorageMinerStub) StorageDetachLocal(p0 context.Context, p1 string) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) StorageDropSector(p0 context.Context, p1 storiface.ID, p2 abi.SectorID, p3 storiface.SectorFileType) error { if s.Internal.StorageDropSector == nil { return ErrNotSupported @@ -5170,6 +5185,17 @@ func (s *StorageMinerStub) StorageLock(p0 context.Context, p1 abi.SectorID, p2 s return ErrNotSupported } +func (s *StorageMinerStruct) StorageRedeclareLocal(p0 context.Context, p1 *storiface.ID, p2 bool) error { + if s.Internal.StorageRedeclareLocal == nil { + return ErrNotSupported + } + return s.Internal.StorageRedeclareLocal(p0, p1, p2) +} + +func (s *StorageMinerStub) StorageRedeclareLocal(p0 context.Context, p1 *storiface.ID, p2 bool) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) StorageReportHealth(p0 context.Context, p1 storiface.ID, p2 storiface.HealthReport) error { if s.Internal.StorageReportHealth == nil { return ErrNotSupported @@ -5599,14 +5625,14 @@ func (s *WorkerStub) StorageDetachLocal(p0 context.Context, p1 string) error { return ErrNotSupported } -func (s *WorkerStruct) StorageRedeclareLocal(p0 context.Context, p1 storiface.ID, p2 bool) error { +func (s *WorkerStruct) StorageRedeclareLocal(p0 context.Context, p1 *storiface.ID, p2 bool) error { if s.Internal.StorageRedeclareLocal == nil { return ErrNotSupported } return s.Internal.StorageRedeclareLocal(p0, p1, p2) } -func (s *WorkerStub) StorageRedeclareLocal(p0 context.Context, p1 storiface.ID, p2 bool) error { +func (s *WorkerStub) StorageRedeclareLocal(p0 context.Context, p1 *storiface.ID, p2 bool) error { return ErrNotSupported } diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 8554e0a0173b1a17dcb492dfd564106bbb11f3a5..1cf63d4a768025d64514d59eb954c7cb0895b809 100644 GIT binary patch delta 26447 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 JPOok8001tsgXI7K delta 4889 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 L|4TQJZSepAB%!W( diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index f04741ad11cba71da9ab420f66656e9e3b398874..659ecc71e05512a813485187b5673834cd85d6b9 100644 GIT binary patch literal 14383 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 literal 14275 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 delta 4848 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 diff --git a/cmd/lotus-miner/storage.go b/cmd/lotus-miner/storage.go index 035af80c6..e7cd7b5e7 100644 --- a/cmd/lotus-miner/storage.go +++ b/cmd/lotus-miner/storage.go @@ -46,6 +46,8 @@ long term for proving (references as 'store') as well as how sectors will be stored while moving through the sealing pipeline (references as 'seal').`, Subcommands: []*cli.Command{ storageAttachCmd, + storageDetachCmd, + storageRedeclareCmd, storageListCmd, storageFindCmd, storageCleanupCmd, @@ -174,6 +176,86 @@ over time }, } +var storageDetachCmd = &cli.Command{ + Name: "detach", + Usage: "detach local storage path", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "really-do-it", + }, + }, + ArgsUsage: "[path]", + 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") + } + + p, err := homedir.Expand(cctx.Args().First()) + if err != nil { + return xerrors.Errorf("expanding path: %w", err) + } + + if !cctx.Bool("really-do-id") { + return xerrors.Errorf("pass --really-do-it to execute the action") + } + + return nodeApi.StorageDetachLocal(ctx, p) + }, +} + +var storageRedeclareCmd = &cli.Command{ + Name: "redeclare", + Usage: "redeclare sectors in a local storage path", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "id", + Usage: "storage path ID", + }, + &cli.BoolFlag{ + Name: "all", + Usage: "redeclare all storage paths", + }, + &cli.BoolFlag{ + Name: "drop-missing", + Usage: "Drop index entries with missing files", + }, + }, + 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") + } + + if cctx.IsSet("id") && cctx.Bool("all") { + return xerrors.Errorf("--id and --all can't be passed at the same time") + } + + if cctx.IsSet("id") { + id := storiface.ID(cctx.String("id")) + return nodeApi.StorageRedeclareLocal(ctx, &id, cctx.Bool("drop-missing")) + } + + if cctx.Bool("all") { + return nodeApi.StorageRedeclareLocal(ctx, nil, cctx.Bool("drop-missing")) + } + + return xerrors.Errorf("either --all or --id must be specified") + }, +} + var storageListCmd = &cli.Command{ Name: "list", Usage: "list local storage paths", diff --git a/cmd/lotus-worker/main.go b/cmd/lotus-worker/main.go index 41a59f6b4..35814e3d6 100644 --- a/cmd/lotus-worker/main.go +++ b/cmd/lotus-worker/main.go @@ -571,7 +571,7 @@ var runCmd = &cli.Command{ if redeclareStorage { log.Info("Redeclaring local storage") - if err := localStore.Redeclare(ctx); err != nil { + if err := localStore.Redeclare(ctx, nil, false); err != nil { log.Errorf("Redeclaring local storage failed: %+v", err) select { diff --git a/cmd/lotus-worker/sealworker/rpc.go b/cmd/lotus-worker/sealworker/rpc.go index 14a486c56..4095f528e 100644 --- a/cmd/lotus-worker/sealworker/rpc.go +++ b/cmd/lotus-worker/sealworker/rpc.go @@ -130,8 +130,8 @@ func (w *Worker) StorageDetachLocal(ctx context.Context, path string) error { return w.LocalStore.ClosePath(ctx, localPath.ID) } -func (w *Worker) StorageRedeclareLocal(ctx context.Context, id storiface.ID, dropMissing bool) error { - return w.LocalStore.Redeclare(ctx, &id, dropMissing) +func (w *Worker) StorageRedeclareLocal(ctx context.Context, id *storiface.ID, dropMissing bool) error { + return w.LocalStore.Redeclare(ctx, id, dropMissing) } func (w *Worker) SetEnabled(ctx context.Context, enabled bool) error { diff --git a/cmd/lotus-worker/storage.go b/cmd/lotus-worker/storage.go index 2f1cd2f71..36b9e271f 100644 --- a/cmd/lotus-worker/storage.go +++ b/cmd/lotus-worker/storage.go @@ -24,6 +24,8 @@ var storageCmd = &cli.Command{ Usage: "manage sector storage", Subcommands: []*cli.Command{ storageAttachCmd, + storageDetachCmd, + storageRedeclareCmd, }, } @@ -128,3 +130,83 @@ var storageAttachCmd = &cli.Command{ return nodeApi.StorageAddLocal(ctx, p) }, } + +var storageDetachCmd = &cli.Command{ + Name: "detach", + Usage: "detach local storage path", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "really-do-it", + }, + }, + ArgsUsage: "[path]", + Action: func(cctx *cli.Context) error { + nodeApi, closer, err := lcli.GetWorkerAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := lcli.ReqContext(cctx) + + if !cctx.Args().Present() { + return xerrors.Errorf("must specify storage path") + } + + p, err := homedir.Expand(cctx.Args().First()) + if err != nil { + return xerrors.Errorf("expanding path: %w", err) + } + + if !cctx.Bool("really-do-id") { + return xerrors.Errorf("pass --really-do-it to execute the action") + } + + return nodeApi.StorageDetachLocal(ctx, p) + }, +} + +var storageRedeclareCmd = &cli.Command{ + Name: "redeclare", + Usage: "redeclare sectors in a local storage path", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "id", + Usage: "storage path ID", + }, + &cli.BoolFlag{ + Name: "all", + Usage: "redeclare all storage paths", + }, + &cli.BoolFlag{ + Name: "drop-missing", + Usage: "Drop index entries with missing files", + }, + }, + Action: func(cctx *cli.Context) error { + nodeApi, closer, err := lcli.GetWorkerAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := lcli.ReqContext(cctx) + + if !cctx.Args().Present() { + return xerrors.Errorf("must specify storage path") + } + + if cctx.IsSet("id") && cctx.Bool("all") { + return xerrors.Errorf("--id and --all can't be passed at the same time") + } + + if cctx.IsSet("id") { + id := storiface.ID(cctx.String("id")) + return nodeApi.StorageRedeclareLocal(ctx, &id, cctx.Bool("drop-missing")) + } + + if cctx.Bool("all") { + return nodeApi.StorageRedeclareLocal(ctx, nil, cctx.Bool("drop-missing")) + } + + return xerrors.Errorf("either --all or --id must be specified") + }, +} diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 096b75ce1..9a4b31cff 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -161,6 +161,7 @@ * [StorageBestAlloc](#StorageBestAlloc) * [StorageDeclareSector](#StorageDeclareSector) * [StorageDetach](#StorageDetach) + * [StorageDetachLocal](#StorageDetachLocal) * [StorageDropSector](#StorageDropSector) * [StorageFindSector](#StorageFindSector) * [StorageGetLocks](#StorageGetLocks) @@ -168,6 +169,7 @@ * [StorageList](#StorageList) * [StorageLocal](#StorageLocal) * [StorageLock](#StorageLock) + * [StorageRedeclareLocal](#StorageRedeclareLocal) * [StorageReportHealth](#StorageReportHealth) * [StorageStat](#StorageStat) * [StorageTryLock](#StorageTryLock) @@ -3260,7 +3262,7 @@ Response: `{}` ### StorageAddLocal -Perms: +Perms: admin Inputs: ```json @@ -3414,6 +3416,20 @@ Inputs: Response: `{}` +### StorageDetachLocal + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + ### StorageDropSector @@ -3610,6 +3626,21 @@ Inputs: Response: `{}` +### StorageRedeclareLocal + + +Perms: admin + +Inputs: +```json +[ + "1399aa04-2625-44b1-bad4-bd07b59b22c4", + true +] +``` + +Response: `{}` + ### StorageReportHealth diff --git a/documentation/en/api-v0-methods-worker.md b/documentation/en/api-v0-methods-worker.md index 55141c1b9..8f7c780bc 100644 --- a/documentation/en/api-v0-methods-worker.md +++ b/documentation/en/api-v0-methods-worker.md @@ -2131,7 +2131,7 @@ Perms: admin Inputs: ```json [ - "76f1988b-ef30-4d7e-b3ec-9a627f4ba5a8", + "1399aa04-2625-44b1-bad4-bd07b59b22c4", true ] ``` diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 2af074d0b..4cf7bc38e 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -2150,12 +2150,14 @@ DESCRIPTION: stored while moving through the sealing pipeline (references as 'seal'). COMMANDS: - attach attach local storage path - list list local storage paths - find find sector in the storage system - cleanup trigger cleanup actions - locks show active sector locks - help, h Shows a list of commands or help for one command + attach attach local storage path + detach detach local storage path + redeclare redeclare sectors in a local storage path + list list local storage paths + find find sector in the storage system + cleanup trigger cleanup actions + locks show active sector locks + help, h Shows a list of commands or help for one command OPTIONS: --help, -h show help (default: false) @@ -2201,6 +2203,34 @@ OPTIONS: ``` +### lotus-miner storage detach +``` +NAME: + lotus-miner storage detach - detach local storage path + +USAGE: + lotus-miner storage detach [command options] [path] + +OPTIONS: + --really-do-it (default: false) + +``` + +### lotus-miner storage redeclare +``` +NAME: + lotus-miner storage redeclare - redeclare sectors in a local storage path + +USAGE: + lotus-miner storage redeclare [command options] [arguments...] + +OPTIONS: + --all redeclare all storage paths (default: false) + --drop-missing Drop index entries with missing files (default: false) + --id value storage path ID + +``` + ### lotus-miner storage list ``` NAME: diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 6fa6fd25f..fe3706160 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -80,8 +80,10 @@ USAGE: lotus-worker storage command [command options] [arguments...] COMMANDS: - attach attach local storage path - help, h Shows a list of commands or help for one command + attach attach local storage path + detach detach local storage path + redeclare redeclare sectors in a local storage path + help, h Shows a list of commands or help for one command OPTIONS: --help, -h show help (default: false) @@ -107,6 +109,34 @@ OPTIONS: ``` +### lotus-worker storage detach +``` +NAME: + lotus-worker storage detach - detach local storage path + +USAGE: + lotus-worker storage detach [command options] [path] + +OPTIONS: + --really-do-it (default: false) + +``` + +### lotus-worker storage redeclare +``` +NAME: + lotus-worker storage redeclare - redeclare sectors in a local storage path + +USAGE: + lotus-worker storage redeclare [command options] [arguments...] + +OPTIONS: + --all redeclare all storage paths (default: false) + --drop-missing Drop index entries with missing files (default: false) + --id value storage path ID + +``` + ## lotus-worker set ``` NAME: diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 3b4e1e23e..341039f8c 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -1206,6 +1206,22 @@ func (sm *StorageMinerAPI) StorageAddLocal(ctx context.Context, path string) err return sm.StorageMgr.AddLocalStorage(ctx, path) } +func (sm *StorageMinerAPI) StorageDetachLocal(ctx context.Context, path string) error { + if sm.StorageMgr == nil { + return xerrors.Errorf("no storage manager") + } + + return sm.StorageMgr.DetachLocalStorage(ctx, path) +} + +func (sm *StorageMinerAPI) StorageRedeclareLocal(ctx context.Context, id *storiface.ID, dropMissing bool) error { + if sm.StorageMgr == nil { + return xerrors.Errorf("no storage manager") + } + + return sm.StorageMgr.RedeclareLocalStorage(ctx, id, false) +} + func (sm *StorageMinerAPI) PiecesListPieces(ctx context.Context) ([]cid.Cid, error) { return sm.PieceStore.ListPieceInfoKeys() } diff --git a/storage/sealer/manager.go b/storage/sealer/manager.go index 3e5e6032b..5eba5b7b2 100644 --- a/storage/sealer/manager.go +++ b/storage/sealer/manager.go @@ -235,6 +235,56 @@ func (m *Manager) AddLocalStorage(ctx context.Context, path string) error { return nil } +func (m *Manager) DetachLocalStorage(ctx context.Context, path string) error { + path, err := homedir.Expand(path) + if err != nil { + return xerrors.Errorf("expanding local path: %w", err) + } + + // check that we have the path opened + lps, err := m.localStore.Local(ctx) + if err != nil { + return xerrors.Errorf("getting local path list: %w", err) + } + + var localPath *storiface.StoragePath + for _, lp := range lps { + if lp.LocalPath == path { + localPath = &lp + break + } + } + if localPath == nil { + return xerrors.Errorf("no local paths match '%s'", path) + } + + // drop from the persisted storage.json + var found bool + if err := m.ls.SetStorage(func(sc *paths.StorageConfig) { + out := make([]paths.LocalPath, 0, len(sc.StoragePaths)) + for _, storagePath := range sc.StoragePaths { + if storagePath.Path != path { + out = append(out, storagePath) + return + } + found = true + } + }); err != nil { + return xerrors.Errorf("set storage config: %w", err) + } + if !found { + // maybe this is fine? + return xerrors.Errorf("path not found in storage.json") + } + + // unregister locally, drop from sector index + return m.localStore.ClosePath(ctx, localPath.ID) +} + +func (m *Manager) RedeclareLocalStorage(ctx context.Context, id *storiface.ID, dropMissing bool) error { + return m.localStore.Redeclare(ctx, id, dropMissing) +} + func (m *Manager) AddWorker(ctx context.Context, w Worker) error { sessID, err := w.Session(ctx) if err != nil {