Merge pull request #2040 from jsign/jsign/minerretrieval
Miner QueryOffer API & non local-discovery retrieval CLI support
This commit is contained in:
commit
4d0df5d599
@ -118,6 +118,7 @@ type FullNode interface {
|
|||||||
ClientListDeals(ctx context.Context) ([]DealInfo, error)
|
ClientListDeals(ctx context.Context) ([]DealInfo, error)
|
||||||
ClientHasLocal(ctx context.Context, root cid.Cid) (bool, error)
|
ClientHasLocal(ctx context.Context, root cid.Cid) (bool, error)
|
||||||
ClientFindData(ctx context.Context, root cid.Cid) ([]QueryOffer, error)
|
ClientFindData(ctx context.Context, root cid.Cid) ([]QueryOffer, error)
|
||||||
|
ClientMinerQueryOffer(ctx context.Context, root cid.Cid, miner address.Address) (QueryOffer, error)
|
||||||
ClientRetrieve(ctx context.Context, order RetrievalOrder, ref *FileRef) error
|
ClientRetrieve(ctx context.Context, order RetrievalOrder, ref *FileRef) error
|
||||||
ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.SignedStorageAsk, error)
|
ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.SignedStorageAsk, error)
|
||||||
ClientCalcCommP(ctx context.Context, inpath string, miner address.Address) (*CommPRet, error)
|
ClientCalcCommP(ctx context.Context, inpath string, miner address.Address) (*CommPRet, error)
|
||||||
|
@ -110,6 +110,7 @@ type FullNodeStruct struct {
|
|||||||
ClientListImports func(ctx context.Context) ([]api.Import, error) `perm:"write"`
|
ClientListImports func(ctx context.Context) ([]api.Import, error) `perm:"write"`
|
||||||
ClientHasLocal func(ctx context.Context, root cid.Cid) (bool, error) `perm:"write"`
|
ClientHasLocal func(ctx context.Context, root cid.Cid) (bool, error) `perm:"write"`
|
||||||
ClientFindData func(ctx context.Context, root cid.Cid) ([]api.QueryOffer, error) `perm:"read"`
|
ClientFindData func(ctx context.Context, root cid.Cid) ([]api.QueryOffer, error) `perm:"read"`
|
||||||
|
ClientMinerQueryOffer func(ctx context.Context, root cid.Cid, miner address.Address) (api.QueryOffer, error) `perm:"read"`
|
||||||
ClientStartDeal func(ctx context.Context, params *api.StartDealParams) (*cid.Cid, error) `perm:"admin"`
|
ClientStartDeal func(ctx context.Context, params *api.StartDealParams) (*cid.Cid, error) `perm:"admin"`
|
||||||
ClientGetDealInfo func(context.Context, cid.Cid) (*api.DealInfo, error) `perm:"read"`
|
ClientGetDealInfo func(context.Context, cid.Cid) (*api.DealInfo, error) `perm:"read"`
|
||||||
ClientListDeals func(ctx context.Context) ([]api.DealInfo, error) `perm:"write"`
|
ClientListDeals func(ctx context.Context) ([]api.DealInfo, error) `perm:"write"`
|
||||||
@ -318,6 +319,10 @@ func (c *FullNodeStruct) ClientFindData(ctx context.Context, root cid.Cid) ([]ap
|
|||||||
return c.Internal.ClientFindData(ctx, root)
|
return c.Internal.ClientFindData(ctx, root)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *FullNodeStruct) ClientMinerQueryOffer(ctx context.Context, root cid.Cid, miner address.Address) (api.QueryOffer, error) {
|
||||||
|
return c.Internal.ClientMinerQueryOffer(ctx, root, miner)
|
||||||
|
}
|
||||||
|
|
||||||
func (c *FullNodeStruct) ClientStartDeal(ctx context.Context, params *api.StartDealParams) (*cid.Cid, error) {
|
func (c *FullNodeStruct) ClientStartDeal(ctx context.Context, params *api.StartDealParams) (*cid.Cid, error) {
|
||||||
return c.Internal.ClientStartDeal(ctx, params)
|
return c.Internal.ClientStartDeal(ctx, params)
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ import (
|
|||||||
"github.com/filecoin-project/specs-actors/actors/abi"
|
"github.com/filecoin-project/specs-actors/actors/abi"
|
||||||
"github.com/filecoin-project/specs-actors/actors/builtin/market"
|
"github.com/filecoin-project/specs-actors/actors/builtin/market"
|
||||||
|
|
||||||
|
"github.com/filecoin-project/lotus/api"
|
||||||
lapi "github.com/filecoin-project/lotus/api"
|
lapi "github.com/filecoin-project/lotus/api"
|
||||||
"github.com/filecoin-project/lotus/chain/types"
|
"github.com/filecoin-project/lotus/chain/types"
|
||||||
)
|
)
|
||||||
@ -391,6 +392,10 @@ var clientRetrieveCmd = &cli.Command{
|
|||||||
Name: "car",
|
Name: "car",
|
||||||
Usage: "export to a car file instead of a regular file",
|
Usage: "export to a car file instead of a regular file",
|
||||||
},
|
},
|
||||||
|
&cli.StringFlag{
|
||||||
|
Name: "miner",
|
||||||
|
Usage: "miner address for retrieval, if not present it'll use local discovery",
|
||||||
|
},
|
||||||
},
|
},
|
||||||
Action: func(cctx *cli.Context) error {
|
Action: func(cctx *cli.Context) error {
|
||||||
if cctx.NArg() != 2 {
|
if cctx.NArg() != 2 {
|
||||||
@ -398,7 +403,7 @@ var clientRetrieveCmd = &cli.Command{
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
api, closer, err := GetFullNodeAPI(cctx)
|
fapi, closer, err := GetFullNodeAPI(cctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -409,7 +414,7 @@ var clientRetrieveCmd = &cli.Command{
|
|||||||
if cctx.String("address") != "" {
|
if cctx.String("address") != "" {
|
||||||
payer, err = address.NewFromString(cctx.String("address"))
|
payer, err = address.NewFromString(cctx.String("address"))
|
||||||
} else {
|
} else {
|
||||||
payer, err = api.WalletDefaultAddress(ctx)
|
payer, err = fapi.WalletDefaultAddress(ctx)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -432,23 +437,36 @@ var clientRetrieveCmd = &cli.Command{
|
|||||||
return nil
|
return nil
|
||||||
}*/ // TODO: fix
|
}*/ // TODO: fix
|
||||||
|
|
||||||
offers, err := api.ClientFindData(ctx, file)
|
var offer api.QueryOffer
|
||||||
|
minerStrAddr := cctx.String("miner")
|
||||||
|
if minerStrAddr == "" { // Local discovery
|
||||||
|
offers, err := fapi.ClientFindData(ctx, file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: parse offer strings from `client find`, make this smarter
|
// TODO: parse offer strings from `client find`, make this smarter
|
||||||
|
|
||||||
if len(offers) < 1 {
|
if len(offers) < 1 {
|
||||||
fmt.Println("Failed to find file")
|
fmt.Println("Failed to find file")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
offer = offers[0]
|
||||||
|
} else { // Directed retrieval
|
||||||
|
minerAddr, err := address.NewFromString(minerStrAddr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
offer, err = fapi.ClientMinerQueryOffer(ctx, file, minerAddr)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ref := &lapi.FileRef{
|
ref := &lapi.FileRef{
|
||||||
Path: cctx.Args().Get(1),
|
Path: cctx.Args().Get(1),
|
||||||
IsCAR: cctx.Bool("car"),
|
IsCAR: cctx.Bool("car"),
|
||||||
}
|
}
|
||||||
if err := api.ClientRetrieve(ctx, offers[0].Order(payer), ref); err != nil {
|
if err := fapi.ClientRetrieve(ctx, offer.Order(payer), ref); err != nil {
|
||||||
return xerrors.Errorf("Retrieval Failed: %w", err)
|
return xerrors.Errorf("Retrieval Failed: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,23 +201,39 @@ func (a *API) ClientFindData(ctx context.Context, root cid.Cid) ([]api.QueryOffe
|
|||||||
|
|
||||||
out := make([]api.QueryOffer, len(peers))
|
out := make([]api.QueryOffer, len(peers))
|
||||||
for k, p := range peers {
|
for k, p := range peers {
|
||||||
queryResponse, err := a.Retrieval.Query(ctx, p, root, retrievalmarket.QueryParams{})
|
out[k] = a.makeRetrievalQuery(ctx, p, root, retrievalmarket.QueryParams{})
|
||||||
|
}
|
||||||
|
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) ClientMinerQueryOffer(ctx context.Context, payload cid.Cid, miner address.Address) (api.QueryOffer, error) {
|
||||||
|
mi, err := a.StateMinerInfo(ctx, miner, types.EmptyTSK)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
out[k] = api.QueryOffer{Err: err.Error(), Miner: p.Address, MinerPeerID: p.ID}
|
return api.QueryOffer{}, err
|
||||||
} else {
|
}
|
||||||
out[k] = api.QueryOffer{
|
rp := retrievalmarket.RetrievalPeer{
|
||||||
Root: root,
|
Address: miner,
|
||||||
|
ID: mi.PeerId,
|
||||||
|
}
|
||||||
|
return a.makeRetrievalQuery(ctx, rp, payload, retrievalmarket.QueryParams{}), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *API) makeRetrievalQuery(ctx context.Context, rp retrievalmarket.RetrievalPeer, payload cid.Cid, qp retrievalmarket.QueryParams) api.QueryOffer {
|
||||||
|
queryResponse, err := a.Retrieval.Query(ctx, rp, payload, qp)
|
||||||
|
if err != nil {
|
||||||
|
return api.QueryOffer{Err: err.Error(), Miner: rp.Address, MinerPeerID: rp.ID}
|
||||||
|
}
|
||||||
|
|
||||||
|
return api.QueryOffer{
|
||||||
|
Root: payload,
|
||||||
Size: queryResponse.Size,
|
Size: queryResponse.Size,
|
||||||
MinPrice: queryResponse.PieceRetrievalPrice(),
|
MinPrice: queryResponse.PieceRetrievalPrice(),
|
||||||
PaymentInterval: queryResponse.MaxPaymentInterval,
|
PaymentInterval: queryResponse.MaxPaymentInterval,
|
||||||
PaymentIntervalIncrease: queryResponse.MaxPaymentIntervalIncrease,
|
PaymentIntervalIncrease: queryResponse.MaxPaymentIntervalIncrease,
|
||||||
Miner: queryResponse.PaymentAddress, // TODO: check
|
Miner: queryResponse.PaymentAddress, // TODO: check
|
||||||
MinerPeerID: p.ID,
|
MinerPeerID: rp.ID,
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return out, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *API) ClientImport(ctx context.Context, ref api.FileRef) (cid.Cid, error) {
|
func (a *API) ClientImport(ctx context.Context, ref api.FileRef) (cid.Cid, error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user