Commit 00fa6646 authored by Jeromy's avatar Jeromy
Browse files

use peerstore for protocol preferencce storage

parent f21d06fb
...@@ -2,7 +2,6 @@ package basichost ...@@ -2,7 +2,6 @@ package basichost
import ( import (
"io" "io"
"sync"
peer "github.com/ipfs/go-libp2p-peer" peer "github.com/ipfs/go-libp2p-peer"
pstore "github.com/ipfs/go-libp2p-peerstore" pstore "github.com/ipfs/go-libp2p-peerstore"
...@@ -47,9 +46,6 @@ type BasicHost struct { ...@@ -47,9 +46,6 @@ type BasicHost struct {
relay *relay.RelayService relay *relay.RelayService
natmgr *natManager natmgr *natManager
protoPrefs map[peer.ID]map[protocol.ID]struct{}
prefsLk sync.Mutex
proc goprocess.Process proc goprocess.Process
bwc metrics.Reporter bwc metrics.Reporter
...@@ -58,10 +54,9 @@ type BasicHost struct { ...@@ -58,10 +54,9 @@ type BasicHost struct {
// New constructs and sets up a new *BasicHost with given Network // New constructs and sets up a new *BasicHost with given Network
func New(net inet.Network, opts ...interface{}) *BasicHost { func New(net inet.Network, opts ...interface{}) *BasicHost {
h := &BasicHost{ h := &BasicHost{
network: net, network: net,
mux: msmux.NewMultistreamMuxer(), mux: msmux.NewMultistreamMuxer(),
bwc: metrics.NewBandwidthCounter(), bwc: metrics.NewBandwidthCounter(),
protoPrefs: make(map[peer.ID]map[protocol.ID]struct{}),
} }
h.proc = goprocess.WithTeardown(func() error { h.proc = goprocess.WithTeardown(func() error {
...@@ -182,7 +177,11 @@ func (h *BasicHost) RemoveStreamHandler(pid protocol.ID) { ...@@ -182,7 +177,11 @@ func (h *BasicHost) RemoveStreamHandler(pid protocol.ID) {
// to create one. If ProtocolID is "", writes no header. // to create one. If ProtocolID is "", writes no header.
// (Threadsafe) // (Threadsafe)
func (h *BasicHost) NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (inet.Stream, error) { func (h *BasicHost) NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (inet.Stream, error) {
pref := h.preferredProtocol(p, pids) pref, err := h.preferredProtocol(p, pids)
if err != nil {
return nil, err
}
if pref != "" { if pref != "" {
return h.newStream(ctx, p, pref) return h.newStream(ctx, p, pref)
} }
...@@ -204,50 +203,31 @@ func (h *BasicHost) NewStream(ctx context.Context, p peer.ID, pids ...protocol.I ...@@ -204,50 +203,31 @@ func (h *BasicHost) NewStream(ctx context.Context, p peer.ID, pids ...protocol.I
} }
selpid := protocol.ID(selected) selpid := protocol.ID(selected)
s.SetProtocol(selpid) s.SetProtocol(selpid)
h.setPreferredProtocol(p, selpid) h.Peerstore().AddProtocols(p, selected)
return mstream.WrapStream(s, h.bwc), nil return mstream.WrapStream(s, h.bwc), nil
} }
func (h *BasicHost) preferredProtocol(p peer.ID, pids []protocol.ID) protocol.ID { func pidsToStrings(pids []protocol.ID) []string {
h.prefsLk.Lock() out := make([]string, len(pids))
defer h.prefsLk.Unlock() for i, p := range pids {
out[i] = string(p)
prefs, ok := h.protoPrefs[p]
if !ok {
supported, err := h.Peerstore().GetProtocols(p)
if err != nil {
log.Warningf("error getting protocol for peer %s: %s", p, err)
return ""
}
prefs = make(map[protocol.ID]struct{})
for _, proto := range supported {
prefs[protocol.ID(proto)] = struct{}{}
}
h.protoPrefs[p] = prefs
} }
return out
for _, pid := range pids {
if _, ok := prefs[pid]; ok {
return pid
}
}
return ""
} }
func (h *BasicHost) setPreferredProtocol(p peer.ID, proto protocol.ID) { func (h *BasicHost) preferredProtocol(p peer.ID, pids []protocol.ID) (protocol.ID, error) {
h.prefsLk.Lock() pidstrs := pidsToStrings(pids)
defer h.prefsLk.Unlock() supported, err := h.Peerstore().SupportsProtocols(p, pidstrs...)
if err != nil {
prefs, ok := h.protoPrefs[p] return "", err
if !ok {
prefs = make(map[protocol.ID]struct{})
h.protoPrefs[p] = prefs
} }
prefs[proto] = struct{}{} var out protocol.ID
if len(supported) > 0 {
out = protocol.ID(supported[0])
}
return out, nil
} }
func (h *BasicHost) newStream(ctx context.Context, p peer.ID, pid protocol.ID) (inet.Stream, error) { func (h *BasicHost) newStream(ctx context.Context, p peer.ID, pid protocol.ID) (inet.Stream, error) {
......
...@@ -54,9 +54,9 @@ ...@@ -54,9 +54,9 @@
"version": "0.0.0" "version": "0.0.0"
}, },
{ {
"hash": "QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR", "hash": "QmSpJByNKFX1sCsHBEp3R73FL4NF6FnQTEGyNAXHm2GS52",
"name": "go-log", "name": "go-log",
"version": "1.1.2" "version": "1.2.0"
}, },
{ {
"hash": "QmPpRcbNUXauP3zWZ1NJMLWpe4QnmEHrd2ba2D3yqWznw7", "hash": "QmPpRcbNUXauP3zWZ1NJMLWpe4QnmEHrd2ba2D3yqWznw7",
...@@ -147,21 +147,21 @@ ...@@ -147,21 +147,21 @@
}, },
{ {
"author": "whyrusleeping", "author": "whyrusleeping",
"hash": "QmenZRWtBU6n19k2wYDEwGWSs4Dh472t8xPp9JyYJjXmLj", "hash": "QmSVddpXhD2QziagxjdRs7eUeNypGugGxWqDsFeauv33XR",
"name": "go-libp2p-loggables", "name": "go-libp2p-loggables",
"version": "1.0.8" "version": "1.0.9"
}, },
{ {
"author": "whyrusleeping", "author": "whyrusleeping",
"hash": "QmbkwpCqdshmuq2T1RB78RzGiPczToJd5pC91r1qQnb3zn", "hash": "QmbP93111oShRbdjoWvP3NZCUApTLkaPXgaNDaXZPfHQHR",
"name": "go-libp2p-secio", "name": "go-libp2p-secio",
"version": "1.0.10" "version": "1.0.11"
}, },
{ {
"author": "whyrusleeping", "author": "whyrusleeping",
"hash": "QmezbDCPpw9hBtXdXHEajg6UEufALJLMtoQQ1YrZEMyMwf", "hash": "Qmep1A25MDNZxMno8oHZ5ForA5T2gw1EXAGdZzGCCpDD4n",
"name": "go-libp2p-transport", "name": "go-libp2p-transport",
"version": "1.3.3" "version": "1.3.4"
}, },
{ {
"author": "whyrusleeping", "author": "whyrusleeping",
...@@ -183,9 +183,9 @@ ...@@ -183,9 +183,9 @@
}, },
{ {
"author": "whyrusleeping", "author": "whyrusleeping",
"hash": "Qmcb7oW2zriXQSCn9GKKDbewm9qM2NF1mR551Zf1HfoQPZ", "hash": "QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d",
"name": "go-libp2p-peerstore", "name": "go-libp2p-peerstore",
"version": "1.2.1" "version": "1.2.2"
} }
], ],
"gxVersion": "0.4.0", "gxVersion": "0.4.0",
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment