mirror of
https://github.com/ipfs/kubo.git
synced 2025-07-01 10:49:24 +08:00
Merge pull request #1155 from ipfs/feat/peer-wantlist
let wantlist command show other peers wantlists
This commit is contained in:
@ -3,10 +3,12 @@ package commands
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io"
|
||||||
|
|
||||||
cmds "github.com/ipfs/go-ipfs/commands"
|
cmds "github.com/ipfs/go-ipfs/commands"
|
||||||
bitswap "github.com/ipfs/go-ipfs/exchange/bitswap"
|
bitswap "github.com/ipfs/go-ipfs/exchange/bitswap"
|
||||||
|
peer "github.com/ipfs/go-ipfs/p2p/peer"
|
||||||
u "github.com/ipfs/go-ipfs/util"
|
u "github.com/ipfs/go-ipfs/util"
|
||||||
"io"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var BitswapCmd = &cmds.Command{
|
var BitswapCmd = &cmds.Command{
|
||||||
@ -26,6 +28,9 @@ var showWantlistCmd = &cmds.Command{
|
|||||||
ShortDescription: `
|
ShortDescription: `
|
||||||
Print out all blocks currently on the bitswap wantlist for the local peer`,
|
Print out all blocks currently on the bitswap wantlist for the local peer`,
|
||||||
},
|
},
|
||||||
|
Options: []cmds.Option{
|
||||||
|
cmds.StringOption("peer", "p", "specify which peer to show wantlist for (default self)"),
|
||||||
|
},
|
||||||
Type: KeyList{},
|
Type: KeyList{},
|
||||||
Run: func(req cmds.Request, res cmds.Response) {
|
Run: func(req cmds.Request, res cmds.Response) {
|
||||||
nd, err := req.Context().GetNode()
|
nd, err := req.Context().GetNode()
|
||||||
@ -39,7 +44,21 @@ Print out all blocks currently on the bitswap wantlist for the local peer`,
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
res.SetOutput(&KeyList{bs.GetWantlist()})
|
pstr, found, err := req.Option("peer").String()
|
||||||
|
if err != nil {
|
||||||
|
res.SetError(err, cmds.ErrNormal)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if found {
|
||||||
|
pid, err := peer.IDB58Decode(pstr)
|
||||||
|
if err != nil {
|
||||||
|
res.SetError(err, cmds.ErrNormal)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
res.SetOutput(&KeyList{bs.WantlistForPeer(pid)})
|
||||||
|
} else {
|
||||||
|
res.SetOutput(&KeyList{bs.GetWantlist()})
|
||||||
|
}
|
||||||
},
|
},
|
||||||
Marshalers: cmds.MarshalerMap{
|
Marshalers: cmds.MarshalerMap{
|
||||||
cmds.Text: KeyListTextMarshaler,
|
cmds.Text: KeyListTextMarshaler,
|
||||||
|
@ -175,6 +175,14 @@ func (bs *Bitswap) GetBlock(parent context.Context, k u.Key) (*blocks.Block, err
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (bs *Bitswap) WantlistForPeer(p peer.ID) []u.Key {
|
||||||
|
var out []u.Key
|
||||||
|
for _, e := range bs.engine.WantlistForPeer(p) {
|
||||||
|
out = append(out, e.Key)
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
// GetBlocks returns a channel where the caller may receive blocks that
|
// GetBlocks returns a channel where the caller may receive blocks that
|
||||||
// correspond to the provided |keys|. Returns an error if BitSwap is unable to
|
// correspond to the provided |keys|. Returns an error if BitSwap is unable to
|
||||||
// begin this request within the deadline enforced by the context.
|
// begin this request within the deadline enforced by the context.
|
||||||
|
@ -96,6 +96,16 @@ func NewEngine(ctx context.Context, bs bstore.Blockstore) *Engine {
|
|||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (e *Engine) WantlistForPeer(p peer.ID) (out []wl.Entry) {
|
||||||
|
e.lock.Lock()
|
||||||
|
partner, ok := e.ledgerMap[p]
|
||||||
|
if ok {
|
||||||
|
out = partner.wantList.SortedEntries()
|
||||||
|
}
|
||||||
|
e.lock.Unlock()
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
func (e *Engine) taskWorker(ctx context.Context) {
|
func (e *Engine) taskWorker(ctx context.Context) {
|
||||||
defer close(e.outbox) // because taskWorker uses the channel exclusively
|
defer close(e.outbox) // because taskWorker uses the channel exclusively
|
||||||
for {
|
for {
|
||||||
|
Reference in New Issue
Block a user