52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
package retrieval
|
|
|
|
import (
|
|
"github.com/libp2p/go-libp2p-core/network"
|
|
|
|
"github.com/filecoin-project/go-lotus/chain/types"
|
|
"github.com/filecoin-project/go-lotus/lib/cborrpc"
|
|
"github.com/filecoin-project/go-lotus/storage/sectorblocks"
|
|
)
|
|
|
|
type Miner struct {
|
|
sectorBlocks *sectorblocks.SectorBlocks
|
|
}
|
|
|
|
func NewMiner(sblks *sectorblocks.SectorBlocks) *Miner {
|
|
return &Miner{
|
|
sectorBlocks: sblks,
|
|
}
|
|
}
|
|
|
|
func (m *Miner) HandleStream(stream network.Stream) {
|
|
defer stream.Close()
|
|
|
|
var query Query
|
|
if err := cborrpc.ReadCborRPC(stream, &query); err != nil {
|
|
log.Errorf("Retrieval query: ReadCborRPC: %s", err)
|
|
return
|
|
}
|
|
|
|
refs, err := m.sectorBlocks.GetRefs(query.Piece)
|
|
if err != nil {
|
|
log.Errorf("Retrieval query: GetRefs: %s", err)
|
|
return
|
|
}
|
|
|
|
answer := QueryResponse{
|
|
Status: Unavailable,
|
|
}
|
|
if len(refs) > 0 {
|
|
answer.Status = Available
|
|
|
|
// TODO: get price, look for already unsealed ref to reduce work
|
|
answer.MinPrice = types.NewInt(uint64(refs[0].Size) * 2) // TODO: Get this from somewhere
|
|
answer.Size = uint64(refs[0].Size) // TODO: verify on intermediate
|
|
}
|
|
|
|
if err := cborrpc.WriteCborRPC(stream, answer); err != nil {
|
|
log.Errorf("Retrieval query: WriteCborRPC: %s", err)
|
|
return
|
|
}
|
|
}
|