Commit 51478358 authored by Aarsh Shah's avatar Aarsh Shah

get peer infos

parent 671b1a00
......@@ -9,8 +9,8 @@ import (
"github.com/libp2p/go-libp2p-core/peer"
)
// peerInfo holds all related information for a peer in the K-Bucket.
type peerInfo struct {
// PeerInfo holds all related information for a peer in the K-Bucket.
type PeerInfo struct {
Id peer.ID
// lastSuccessfulOutboundQuery is the time instant when we last made a successful
// outbound query to this peer
......@@ -37,10 +37,10 @@ func newBucket() *bucket {
// returns all peers in the bucket
// it is safe for the caller to modify the returned objects as it is a defensive copy
func (b *bucket) peers() []peerInfo {
var ps []peerInfo
func (b *bucket) peers() []PeerInfo {
var ps []PeerInfo
for e := b.list.Front(); e != nil; e = e.Next() {
p := e.Value.(*peerInfo)
p := e.Value.(*PeerInfo)
ps = append(ps, *p)
}
return ps
......@@ -50,7 +50,7 @@ func (b *bucket) peers() []peerInfo {
func (b *bucket) peerIds() []peer.ID {
ps := make([]peer.ID, 0, b.list.Len())
for e := b.list.Front(); e != nil; e = e.Next() {
p := e.Value.(*peerInfo)
p := e.Value.(*PeerInfo)
ps = append(ps, p.Id)
}
return ps
......@@ -58,10 +58,10 @@ func (b *bucket) peerIds() []peer.ID {
// returns the peer with the given Id if it exists
// returns nil if the peerId does not exist
func (b *bucket) getPeer(p peer.ID) *peerInfo {
func (b *bucket) getPeer(p peer.ID) *PeerInfo {
for e := b.list.Front(); e != nil; e = e.Next() {
if e.Value.(*peerInfo).Id == p {
return e.Value.(*peerInfo)
if e.Value.(*PeerInfo).Id == p {
return e.Value.(*PeerInfo)
}
}
return nil
......@@ -71,7 +71,7 @@ func (b *bucket) getPeer(p peer.ID) *peerInfo {
// returns true if successful, false otherwise.
func (b *bucket) remove(id peer.ID) bool {
for e := b.list.Front(); e != nil; e = e.Next() {
if e.Value.(*peerInfo).Id == id {
if e.Value.(*PeerInfo).Id == id {
b.list.Remove(e)
return true
}
......@@ -82,13 +82,13 @@ func (b *bucket) remove(id peer.ID) bool {
func (b *bucket) moveToFront(id peer.ID) {
for e := b.list.Front(); e != nil; e = e.Next() {
if e.Value.(*peerInfo).Id == id {
if e.Value.(*PeerInfo).Id == id {
b.list.MoveToFront(e)
}
}
}
func (b *bucket) pushFront(p *peerInfo) {
func (b *bucket) pushFront(p *PeerInfo) {
b.list.PushFront(p)
}
......@@ -105,7 +105,7 @@ func (b *bucket) split(cpl int, target ID) *bucket {
newbuck.list = out
e := b.list.Front()
for e != nil {
pDhtId := e.Value.(*peerInfo).dhtId
pDhtId := e.Value.(*PeerInfo).dhtId
peerCPL := CommonPrefixLen(pDhtId, target)
if peerCPL > cpl {
cur := e
......
......@@ -38,7 +38,7 @@ func (pds *peerDistanceSorter) appendPeer(p peer.ID, pDhtId ID) {
// Append the peer.ID values in the list to the sorter's slice. It may no longer be sorted.
func (pds *peerDistanceSorter) appendPeersFromList(l *list.List) {
for e := l.Front(); e != nil; e = e.Next() {
pds.appendPeer(e.Value.(*peerInfo).Id, e.Value.(*peerInfo).dhtId)
pds.appendPeer(e.Value.(*PeerInfo).Id, e.Value.(*PeerInfo).dhtId)
}
}
......
......@@ -129,7 +129,7 @@ func (rt *RoutingTable) addPeer(p peer.ID, queryPeer bool) (bool, error) {
// We have enough space in the bucket (whether spawned or grouped).
if bucket.len() < rt.bucketsize {
bucket.pushFront(&peerInfo{p, lastSuccessfulOutboundQuery, ConvertPeerID(p)})
bucket.pushFront(&PeerInfo{p, lastSuccessfulOutboundQuery, ConvertPeerID(p)})
rt.PeerAdded(p)
return true, nil
}
......@@ -143,7 +143,7 @@ func (rt *RoutingTable) addPeer(p peer.ID, queryPeer bool) (bool, error) {
// push the peer only if the bucket isn't overflowing after slitting
if bucket.len() < rt.bucketsize {
bucket.pushFront(&peerInfo{p, lastSuccessfulOutboundQuery, ConvertPeerID(p)})
bucket.pushFront(&PeerInfo{p, lastSuccessfulOutboundQuery, ConvertPeerID(p)})
rt.PeerAdded(p)
return true, nil
}
......@@ -156,7 +156,7 @@ func (rt *RoutingTable) addPeer(p peer.ID, queryPeer bool) (bool, error) {
if float64(time.Since(pc.lastSuccessfulOutboundQuery)) > rt.maxLastSuccessfulOutboundThreshold {
// let's evict it and add the new peer
if bucket.remove(pc.Id) {
bucket.pushFront(&peerInfo{p, lastSuccessfulOutboundQuery, ConvertPeerID(p)})
bucket.pushFront(&PeerInfo{p, lastSuccessfulOutboundQuery, ConvertPeerID(p)})
rt.PeerAdded(p)
return true, nil
}
......@@ -166,6 +166,20 @@ func (rt *RoutingTable) addPeer(p peer.ID, queryPeer bool) (bool, error) {
return false, ErrPeerRejectedNoCapacity
}
// GetPeerInfos returns the peer information that we've stored in the buckets
func (rt *RoutingTable) GetPeerInfos() []PeerInfo {
rt.tabLock.RLock()
defer rt.tabLock.RUnlock()
var pis []PeerInfo
for _, b := range rt.buckets {
for _, p := range b.peers() {
pis = append(pis, p)
}
}
return pis
}
// UpdateLastSuccessfulOutboundQuery updates the lastSuccessfulOutboundQuery time of the peer
// Returns true if the update was successful, false otherwise.
func (rt *RoutingTable) UpdateLastSuccessfulOutboundQuery(p peer.ID, t time.Time) bool {
......@@ -334,7 +348,7 @@ func (rt *RoutingTable) Print() {
fmt.Printf("\tbucket: %d\n", i)
for e := b.list.Front(); e != nil; e = e.Next() {
p := e.Value.(*peerInfo).Id
p := e.Value.(*PeerInfo).Id
fmt.Printf("\t\t- %s %s\n", p.Pretty(), rt.metrics.LatencyEWMA(p).String())
}
}
......
......@@ -33,7 +33,7 @@ func TestBucket(t *testing.T) {
peers := make([]peer.ID, 100)
for i := 0; i < 100; i++ {
peers[i] = test.RandPeerIDFatal(t)
b.pushFront(&peerInfo{peers[i], testTime1, ConvertPeerID(peers[i])})
b.pushFront(&PeerInfo{peers[i], testTime1, ConvertPeerID(peers[i])})
}
local := test.RandPeerIDFatal(t)
......@@ -59,7 +59,7 @@ func TestBucket(t *testing.T) {
spl := b.split(0, ConvertPeerID(local))
llist := b.list
for e := llist.Front(); e != nil; e = e.Next() {
p := ConvertPeerID(e.Value.(*peerInfo).Id)
p := ConvertPeerID(e.Value.(*PeerInfo).Id)
cpl := CommonPrefixLen(p, localID)
if cpl > 0 {
t.Fatalf("split failed. found id with cpl > 0 in 0 bucket")
......@@ -68,7 +68,7 @@ func TestBucket(t *testing.T) {
rlist := spl.list
for e := rlist.Front(); e != nil; e = e.Next() {
p := ConvertPeerID(e.Value.(*peerInfo).Id)
p := ConvertPeerID(e.Value.(*PeerInfo).Id)
cpl := CommonPrefixLen(p, localID)
if cpl == 0 {
t.Fatalf("split failed. found id with cpl == 0 in non 0 bucket")
......@@ -480,6 +480,37 @@ func TestTableMultithreaded(t *testing.T) {
<-done
}
func TestGetPeerInfos(t *testing.T) {
local := test.RandPeerIDFatal(t)
m := pstore.NewMetrics()
rt, err := NewRoutingTable(10, ConvertPeerID(local), time.Hour, m, NoOpThreshold)
require.NoError(t, err)
require.Empty(t, rt.GetPeerInfos())
p1 := test.RandPeerIDFatal(t)
p2 := test.RandPeerIDFatal(t)
b, err := rt.TryAddPeer(p1, false)
require.True(t, b)
require.NoError(t, err)
b, err = rt.TryAddPeer(p2, true)
require.True(t, b)
require.NoError(t, err)
ps := rt.GetPeerInfos()
require.Len(t, ps, 2)
ms := make(map[peer.ID]PeerInfo)
for _, p := range ps {
ms[p.Id] = p
}
require.Equal(t, p1, ms[p1].Id)
require.True(t, ms[p1].lastSuccessfulOutboundQuery.IsZero())
require.Equal(t, p2, ms[p2].Id)
require.False(t, ms[p2].lastSuccessfulOutboundQuery.IsZero())
}
func BenchmarkAddPeer(b *testing.B) {
b.StopTimer()
local := ConvertKey("localKey")
......
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