add command for power users to manually update sector state
This commit is contained in:
parent
a45fe8a7f9
commit
40be53c9f9
@ -67,6 +67,8 @@ type StorageMiner interface {
|
|||||||
|
|
||||||
SectorsRefs(context.Context) (map[string][]SealedRef, error)
|
SectorsRefs(context.Context) (map[string][]SealedRef, error)
|
||||||
|
|
||||||
|
SectorsUpdate(context.Context, uint64, SectorState) error
|
||||||
|
|
||||||
WorkerStats(context.Context) (sectorbuilder.WorkerStats, error)
|
WorkerStats(context.Context) (sectorbuilder.WorkerStats, error)
|
||||||
|
|
||||||
// WorkerQueue registers a remote worker
|
// WorkerQueue registers a remote worker
|
||||||
|
@ -2,6 +2,7 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/lib/sectorbuilder"
|
"github.com/filecoin-project/lotus/lib/sectorbuilder"
|
||||||
|
|
||||||
"github.com/ipfs/go-cid"
|
"github.com/ipfs/go-cid"
|
||||||
@ -138,6 +139,7 @@ type StorageMinerStruct struct {
|
|||||||
SectorsStatus func(context.Context, uint64) (SectorInfo, error) `perm:"read"`
|
SectorsStatus func(context.Context, uint64) (SectorInfo, error) `perm:"read"`
|
||||||
SectorsList func(context.Context) ([]uint64, error) `perm:"read"`
|
SectorsList func(context.Context) ([]uint64, error) `perm:"read"`
|
||||||
SectorsRefs func(context.Context) (map[string][]SealedRef, error) `perm:"read"`
|
SectorsRefs func(context.Context) (map[string][]SealedRef, error) `perm:"read"`
|
||||||
|
SectorsUpdate func(context.Context, uint64, SectorState) error `perm:"write"`
|
||||||
|
|
||||||
WorkerStats func(context.Context) (sectorbuilder.WorkerStats, error) `perm:"read"`
|
WorkerStats func(context.Context) (sectorbuilder.WorkerStats, error) `perm:"read"`
|
||||||
|
|
||||||
@ -512,6 +514,10 @@ func (c *StorageMinerStruct) SectorsRefs(ctx context.Context) (map[string][]Seal
|
|||||||
return c.Internal.SectorsRefs(ctx)
|
return c.Internal.SectorsRefs(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *StorageMinerStruct) SectorsUpdate(ctx context.Context, id uint64, state SectorState) error {
|
||||||
|
return c.Internal.SectorsUpdate(ctx, id, state)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *StorageMinerStruct) WorkerStats(ctx context.Context) (sectorbuilder.WorkerStats, error) {
|
func (c *StorageMinerStruct) WorkerStats(ctx context.Context) (sectorbuilder.WorkerStats, error) {
|
||||||
return c.Internal.WorkerStats(ctx)
|
return c.Internal.WorkerStats(ctx)
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"golang.org/x/xerrors"
|
||||||
"gopkg.in/urfave/cli.v2"
|
"gopkg.in/urfave/cli.v2"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
@ -32,6 +33,7 @@ var sectorsCmd = &cli.Command{
|
|||||||
sectorsStatusCmd,
|
sectorsStatusCmd,
|
||||||
sectorsListCmd,
|
sectorsListCmd,
|
||||||
sectorsRefsCmd,
|
sectorsRefsCmd,
|
||||||
|
sectorsUpdateCmd,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,6 +175,45 @@ var sectorsRefsCmd = &cli.Command{
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var sectorsUpdateCmd = &cli.Command{
|
||||||
|
Name: "update-state",
|
||||||
|
Usage: "ADVANCED: manually update the state of a sector, this may aid in error recovery",
|
||||||
|
Flags: []cli.Flag{
|
||||||
|
&cli.BoolFlag{
|
||||||
|
Name: "really-do-it",
|
||||||
|
Usage: "pass this flag if you know what you are doing",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Action: func(cctx *cli.Context) error {
|
||||||
|
if !cctx.Bool("really-do-it") {
|
||||||
|
return xerrors.Errorf("this is a command for advanced users, only us it if you are sure of what you are doing")
|
||||||
|
}
|
||||||
|
nodeApi, closer, err := lcli.GetStorageMinerAPI(cctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer closer()
|
||||||
|
ctx := lcli.ReqContext(cctx)
|
||||||
|
if cctx.Args().Len() < 2 {
|
||||||
|
return xerrors.Errorf("must pass sector ID and new state")
|
||||||
|
}
|
||||||
|
|
||||||
|
id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64)
|
||||||
|
if err != nil {
|
||||||
|
return xerrors.Errorf("could not parse sector ID: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var st api.SectorState
|
||||||
|
for i, s := range api.SectorStates {
|
||||||
|
if cctx.Args().Get(1) == s {
|
||||||
|
st = api.SectorState(i)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nodeApi.SectorsUpdate(ctx, id, st)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
func yesno(b bool) string {
|
func yesno(b bool) string {
|
||||||
if b {
|
if b {
|
||||||
return "YES"
|
return "YES"
|
||||||
|
@ -3,6 +3,12 @@ package impl
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"io"
|
||||||
|
"mime"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/filecoin-project/lotus/api"
|
"github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/address"
|
"github.com/filecoin-project/lotus/chain/address"
|
||||||
"github.com/filecoin-project/lotus/lib/sectorbuilder"
|
"github.com/filecoin-project/lotus/lib/sectorbuilder"
|
||||||
@ -12,11 +18,6 @@ import (
|
|||||||
"github.com/filecoin-project/lotus/storage/sectorblocks"
|
"github.com/filecoin-project/lotus/storage/sectorblocks"
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
files "github.com/ipfs/go-ipfs-files"
|
files "github.com/ipfs/go-ipfs-files"
|
||||||
"io"
|
|
||||||
"mime"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"path/filepath"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type StorageMinerAPI struct {
|
type StorageMinerAPI struct {
|
||||||
@ -201,6 +202,10 @@ func (sm *StorageMinerAPI) SectorsRefs(context.Context) (map[string][]api.Sealed
|
|||||||
return out, nil
|
return out, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (sm *StorageMinerAPI) SectorsUpdate(ctx context.Context, id uint64, state api.SectorState) error {
|
||||||
|
return sm.Miner.UpdateSectorState(ctx, id, state)
|
||||||
|
}
|
||||||
|
|
||||||
func (sm *StorageMinerAPI) WorkerQueue(ctx context.Context) (<-chan sectorbuilder.WorkerTask, error) {
|
func (sm *StorageMinerAPI) WorkerQueue(ctx context.Context) (<-chan sectorbuilder.WorkerTask, error) {
|
||||||
return sm.SectorBuilder.AddWorker(ctx)
|
return sm.SectorBuilder.AddWorker(ctx)
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,18 @@ func (u *sectorUpdate) to(newState api.SectorState) *sectorUpdate {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Miner) UpdateSectorState(ctx context.Context, sector uint64, state api.SectorState) error {
|
||||||
|
select {
|
||||||
|
case m.sectorUpdated <- sectorUpdate{
|
||||||
|
newState: state,
|
||||||
|
id: sector,
|
||||||
|
}:
|
||||||
|
return nil
|
||||||
|
case <-ctx.Done():
|
||||||
|
return ctx.Err()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Miner) sectorStateLoop(ctx context.Context) error {
|
func (m *Miner) sectorStateLoop(ctx context.Context) error {
|
||||||
trackedSectors, err := m.ListSectors()
|
trackedSectors, err := m.ListSectors()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user