From 560a474777c069f76eaa8c1250560a77b89cc4cf Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 8 Aug 2014 19:58:42 -0700 Subject: [PATCH 01/76] moved routing table code into its own package --- LICENSE | 21 ------ README.md | 2 - bucket.go | 68 +++++++++++++++++++ table.go | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++ table_test.go | 126 ++++++++++++++++++++++++++++++++++ util.go | 82 ++++++++++++++++++++++ 6 files changed, 460 insertions(+), 23 deletions(-) delete mode 100644 LICENSE delete mode 100644 README.md create mode 100644 bucket.go create mode 100644 table.go create mode 100644 table_test.go create mode 100644 util.go diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 7789aab..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 libp2p - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 1f7dc95..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# go-libp2p-kbucket -A kbucket implementation for use as a routing table diff --git a/bucket.go b/bucket.go new file mode 100644 index 0000000..a56db74 --- /dev/null +++ b/bucket.go @@ -0,0 +1,68 @@ +package dht + +import ( + "container/list" + + peer "github.com/jbenet/go-ipfs/peer" +) +// Bucket holds a list of peers. +type Bucket list.List + +func (b *Bucket) Find(id peer.ID) *list.Element { + bucket_list := (*list.List)(b) + for e := bucket_list.Front(); e != nil; e = e.Next() { + if e.Value.(*peer.Peer).ID.Equal(id) { + return e + } + } + return nil +} + +func (b *Bucket) MoveToFront(e *list.Element) { + bucket_list := (*list.List)(b) + bucket_list.MoveToFront(e) +} + +func (b *Bucket) PushFront(p *peer.Peer) { + bucket_list := (*list.List)(b) + bucket_list.PushFront(p) +} + +func (b *Bucket) PopBack() *peer.Peer { + bucket_list := (*list.List)(b) + last := bucket_list.Back() + bucket_list.Remove(last) + return last.Value.(*peer.Peer) +} + +func (b *Bucket) Len() int { + bucket_list := (*list.List)(b) + return bucket_list.Len() +} + +// Splits a buckets peers into two buckets, the methods receiver will have +// peers with CPL equal to cpl, the returned bucket will have peers with CPL +// greater than cpl (returned bucket has closer peers) +func (b *Bucket) Split(cpl int, target ID) *Bucket { + bucket_list := (*list.List)(b) + out := list.New() + e := bucket_list.Front() + for e != nil { + peer_id := ConvertPeerID(e.Value.(*peer.Peer).ID) + peer_cpl := prefLen(peer_id, target) + if peer_cpl > cpl { + cur := e + out.PushBack(e.Value) + e = e.Next() + bucket_list.Remove(cur) + continue + } + e = e.Next() + } + return (*Bucket)(out) +} + +func (b *Bucket) getIter() *list.Element { + bucket_list := (*list.List)(b) + return bucket_list.Front() +} diff --git a/table.go b/table.go new file mode 100644 index 0000000..de971ea --- /dev/null +++ b/table.go @@ -0,0 +1,184 @@ +package dht + +import ( + "container/list" + "sort" + "sync" + + peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" +) + +// RoutingTable defines the routing table. +type RoutingTable struct { + + // ID of the local peer + local ID + + // Blanket lock, refine later for better performance + tabLock sync.RWMutex + + // kBuckets define all the fingers to other nodes. + Buckets []*Bucket + bucketsize int +} + +func NewRoutingTable(bucketsize int, local_id ID) *RoutingTable { + rt := new(RoutingTable) + rt.Buckets = []*Bucket{new(Bucket)} + rt.bucketsize = bucketsize + rt.local = local_id + return rt +} + +// Update adds or moves the given peer to the front of its respective bucket +// If a peer gets removed from a bucket, it is returned +func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { + rt.tabLock.Lock() + defer rt.tabLock.Unlock() + peer_id := ConvertPeerID(p.ID) + cpl := xor(peer_id, rt.local).commonPrefixLen() + + b_id := cpl + if b_id >= len(rt.Buckets) { + b_id = len(rt.Buckets) - 1 + } + + bucket := rt.Buckets[b_id] + e := bucket.Find(p.ID) + if e == nil { + // New peer, add to bucket + bucket.PushFront(p) + + // Are we past the max bucket size? + if bucket.Len() > rt.bucketsize { + if b_id == len(rt.Buckets) - 1 { + new_bucket := bucket.Split(b_id, rt.local) + rt.Buckets = append(rt.Buckets, new_bucket) + if new_bucket.Len() > rt.bucketsize { + // TODO: This is a very rare and annoying case + panic("Case not handled.") + } + + // If all elements were on left side of split... + if bucket.Len() > rt.bucketsize { + return bucket.PopBack() + } + } else { + // If the bucket cant split kick out least active node + return bucket.PopBack() + } + } + return nil + } else { + // If the peer is already in the table, move it to the front. + // This signifies that it it "more active" and the less active nodes + // Will as a result tend towards the back of the list + bucket.MoveToFront(e) + return nil + } +} + +// A helper struct to sort peers by their distance to the local node +type peerDistance struct { + p *peer.Peer + distance ID +} + +// peerSorterArr implements sort.Interface to sort peers by xor distance +type peerSorterArr []*peerDistance +func (p peerSorterArr) Len() int {return len(p)} +func (p peerSorterArr) Swap(a, b int) {p[a],p[b] = p[b],p[a]} +func (p peerSorterArr) Less(a, b int) bool { + return p[a].distance.Less(p[b].distance) +} +// + +func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { + for e := peerList.Front(); e != nil; e = e.Next() { + p := e.Value.(*peer.Peer) + p_id := ConvertPeerID(p.ID) + pd := peerDistance{ + p: p, + distance: xor(target, p_id), + } + peerArr = append(peerArr, &pd) + if e == nil { + u.POut("list element was nil.") + return peerArr + } + } + return peerArr +} + +// Returns a single peer that is nearest to the given ID +func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { + peers := rt.NearestPeers(id, 1) + if len(peers) > 0 { + return peers[0] + } else { + return nil + } +} + +// Returns a list of the 'count' closest peers to the given ID +func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { + rt.tabLock.RLock() + defer rt.tabLock.RUnlock() + cpl := prefLen(id, rt.local) + + // Get bucket at cpl index or last bucket + var bucket *Bucket + if cpl >= len(rt.Buckets) { + cpl = len(rt.Buckets) - 1 + } + bucket = rt.Buckets[cpl] + + var peerArr peerSorterArr + if bucket.Len() == 0 { + // In the case of an unusual split, one bucket may be empty. + // if this happens, search both surrounding buckets for nearest peer + if cpl > 0 { + plist := (*list.List)(rt.Buckets[cpl - 1]) + peerArr = copyPeersFromList(id, peerArr, plist) + } + + if cpl < len(rt.Buckets) - 1 { + plist := (*list.List)(rt.Buckets[cpl + 1]) + peerArr = copyPeersFromList(id, peerArr, plist) + } + } else { + plist := (*list.List)(bucket) + peerArr = copyPeersFromList(id, peerArr, plist) + } + + // Sort by distance to local peer + sort.Sort(peerArr) + + var out []*peer.Peer + for i := 0; i < count && i < peerArr.Len(); i++ { + out = append(out, peerArr[i].p) + } + + return out +} + +// Returns the total number of peers in the routing table +func (rt *RoutingTable) Size() int { + var tot int + for _,buck := range rt.Buckets { + tot += buck.Len() + } + return tot +} + +// NOTE: This is potentially unsafe... use at your own risk +func (rt *RoutingTable) Listpeers() []*peer.Peer { + var peers []*peer.Peer + for _,buck := range rt.Buckets { + for e := buck.getIter(); e != nil; e = e.Next() { + peers = append(peers, e.Value.(*peer.Peer)) + } + } + return peers +} diff --git a/table_test.go b/table_test.go new file mode 100644 index 0000000..4305d8d --- /dev/null +++ b/table_test.go @@ -0,0 +1,126 @@ +package dht + +import ( + crand "crypto/rand" + "crypto/sha256" + "math/rand" + "container/list" + "testing" + + peer "github.com/jbenet/go-ipfs/peer" +) + +func _randPeer() *peer.Peer { + p := new(peer.Peer) + p.ID = make(peer.ID, 16) + crand.Read(p.ID) + return p +} + +func _randID() ID { + buf := make([]byte, 16) + crand.Read(buf) + + hash := sha256.Sum256(buf) + return ID(hash[:]) +} + +// Test basic features of the bucket struct +func TestBucket(t *testing.T) { + b := new(Bucket) + + peers := make([]*peer.Peer, 100) + for i := 0; i < 100; i++ { + peers[i] = _randPeer() + b.PushFront(peers[i]) + } + + local := _randPeer() + local_id := ConvertPeerID(local.ID) + + i := rand.Intn(len(peers)) + e := b.Find(peers[i].ID) + if e == nil { + t.Errorf("Failed to find peer: %v", peers[i]) + } + + spl := b.Split(0, ConvertPeerID(local.ID)) + llist := (*list.List)(b) + for e := llist.Front(); e != nil; e = e.Next() { + p := ConvertPeerID(e.Value.(*peer.Peer).ID) + cpl := xor(p, local_id).commonPrefixLen() + if cpl > 0 { + t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") + } + } + + rlist := (*list.List)(spl) + for e := rlist.Front(); e != nil; e = e.Next() { + p := ConvertPeerID(e.Value.(*peer.Peer).ID) + cpl := xor(p, local_id).commonPrefixLen() + if cpl == 0 { + t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") + } + } +} + +// Right now, this just makes sure that it doesnt hang or crash +func TestTableUpdate(t *testing.T) { + local := _randPeer() + rt := NewRoutingTable(10, ConvertPeerID(local.ID)) + + peers := make([]*peer.Peer, 100) + for i := 0; i < 100; i++ { + peers[i] = _randPeer() + } + + // Testing Update + for i := 0; i < 10000; i++ { + p := rt.Update(peers[rand.Intn(len(peers))]) + if p != nil { + t.Log("evicted peer.") + } + } + + for i := 0; i < 100; i++ { + id := _randID() + ret := rt.NearestPeers(id, 5) + if len(ret) == 0 { + t.Fatal("Failed to find node near ID.") + } + } +} + +func TestTableFind(t *testing.T) { + local := _randPeer() + rt := NewRoutingTable(10, ConvertPeerID(local.ID)) + + peers := make([]*peer.Peer, 100) + for i := 0; i < 5; i++ { + peers[i] = _randPeer() + rt.Update(peers[i]) + } + + t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) + found := rt.NearestPeer(ConvertPeerID(peers[2].ID)) + if !found.ID.Equal(peers[2].ID) { + t.Fatalf("Failed to lookup known node...") + } +} + +func TestTableFindMultiple(t *testing.T) { + local := _randPeer() + rt := NewRoutingTable(20, ConvertPeerID(local.ID)) + + peers := make([]*peer.Peer, 100) + for i := 0; i < 18; i++ { + peers[i] = _randPeer() + rt.Update(peers[i]) + } + + t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) + found := rt.NearestPeers(ConvertPeerID(peers[2].ID), 15) + if len(found) != 15 { + t.Fatalf("Got back different number of peers than we expected.") + } +} diff --git a/util.go b/util.go new file mode 100644 index 0000000..095d0b0 --- /dev/null +++ b/util.go @@ -0,0 +1,82 @@ +package dht + +import ( + "bytes" + "crypto/sha256" + + peer "github.com/jbenet/go-ipfs/peer" + u "github.com/jbenet/go-ipfs/util" +) + +// ID for IpfsDHT should be a byte slice, to allow for simpler operations +// (xor). DHT ids are based on the peer.IDs. +// +// The type dht.ID signifies that its contents have been hashed from either a +// peer.ID or a util.Key. This unifies the keyspace +type ID []byte + +func (id ID) Equal(other ID) bool { + return bytes.Equal(id, other) +} + +func (id ID) Less(other interface{}) bool { + a, b := equalizeSizes(id, other.(ID)) + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + return a[i] < b[i] + } + } + return len(a) < len(b) +} + +func (id ID) commonPrefixLen() int { + for i := 0; i < len(id); i++ { + for j := 0; j < 8; j++ { + if (id[i]>>uint8(7-j))&0x1 != 0 { + return i*8 + j + } + } + } + return len(id)*8 - 1 +} + +func prefLen(a, b ID) int { + return xor(a, b).commonPrefixLen() +} + +func xor(a, b ID) ID { + a, b = equalizeSizes(a, b) + + c := make(ID, len(a)) + for i := 0; i < len(a); i++ { + c[i] = a[i] ^ b[i] + } + return c +} + +func equalizeSizes(a, b ID) (ID, ID) { + la := len(a) + lb := len(b) + + if la < lb { + na := make([]byte, lb) + copy(na, a) + a = na + } else if lb < la { + nb := make([]byte, la) + copy(nb, b) + b = nb + } + + return a, b +} + +func ConvertPeerID(id peer.ID) ID { + hash := sha256.Sum256(id) + return hash[:] +} + +func ConvertKey(id u.Key) ID { + hash := sha256.Sum256([]byte(id)) + return hash[:] +} From 534dbca4822a041d974c4b3e84646931a3e08119 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 9 Aug 2014 22:28:46 -0700 Subject: [PATCH 02/76] tiered put/get implemented --- bucket.go | 1 + table.go | 35 +++++++++++++++++++++++------------ table_test.go | 2 +- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/bucket.go b/bucket.go index a56db74..5abd2c9 100644 --- a/bucket.go +++ b/bucket.go @@ -5,6 +5,7 @@ import ( peer "github.com/jbenet/go-ipfs/peer" ) + // Bucket holds a list of peers. type Bucket list.List diff --git a/table.go b/table.go index de971ea..788d122 100644 --- a/table.go +++ b/table.go @@ -19,7 +19,7 @@ type RoutingTable struct { tabLock sync.RWMutex // kBuckets define all the fingers to other nodes. - Buckets []*Bucket + Buckets []*Bucket bucketsize int } @@ -52,7 +52,7 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { // Are we past the max bucket size? if bucket.Len() > rt.bucketsize { - if b_id == len(rt.Buckets) - 1 { + if b_id == len(rt.Buckets)-1 { new_bucket := bucket.Split(b_id, rt.local) rt.Buckets = append(rt.Buckets, new_bucket) if new_bucket.Len() > rt.bucketsize { @@ -81,25 +81,27 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { // A helper struct to sort peers by their distance to the local node type peerDistance struct { - p *peer.Peer + p *peer.Peer distance ID } // peerSorterArr implements sort.Interface to sort peers by xor distance type peerSorterArr []*peerDistance -func (p peerSorterArr) Len() int {return len(p)} -func (p peerSorterArr) Swap(a, b int) {p[a],p[b] = p[b],p[a]} + +func (p peerSorterArr) Len() int { return len(p) } +func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] } func (p peerSorterArr) Less(a, b int) bool { return p[a].distance.Less(p[b].distance) } + // func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { - for e := peerList.Front(); e != nil; e = e.Next() { + for e := peerList.Front(); e != nil; e = e.Next() { p := e.Value.(*peer.Peer) p_id := ConvertPeerID(p.ID) pd := peerDistance{ - p: p, + p: p, distance: xor(target, p_id), } peerArr = append(peerArr, &pd) @@ -111,6 +113,15 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe return peerArr } +// Find a specific peer by ID or return nil +func (rt *RoutingTable) Find(id peer.ID) *peer.Peer { + srch := rt.NearestPeers(ConvertPeerID(id), 1) + if len(srch) == 0 || !srch[0].ID.Equal(id) { + return nil + } + return srch[0] +} + // Returns a single peer that is nearest to the given ID func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { peers := rt.NearestPeers(id, 1) @@ -139,12 +150,12 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { // In the case of an unusual split, one bucket may be empty. // if this happens, search both surrounding buckets for nearest peer if cpl > 0 { - plist := (*list.List)(rt.Buckets[cpl - 1]) + plist := (*list.List)(rt.Buckets[cpl-1]) peerArr = copyPeersFromList(id, peerArr, plist) } - if cpl < len(rt.Buckets) - 1 { - plist := (*list.List)(rt.Buckets[cpl + 1]) + if cpl < len(rt.Buckets)-1 { + plist := (*list.List)(rt.Buckets[cpl+1]) peerArr = copyPeersFromList(id, peerArr, plist) } } else { @@ -166,7 +177,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { // Returns the total number of peers in the routing table func (rt *RoutingTable) Size() int { var tot int - for _,buck := range rt.Buckets { + for _, buck := range rt.Buckets { tot += buck.Len() } return tot @@ -175,7 +186,7 @@ func (rt *RoutingTable) Size() int { // NOTE: This is potentially unsafe... use at your own risk func (rt *RoutingTable) Listpeers() []*peer.Peer { var peers []*peer.Peer - for _,buck := range rt.Buckets { + for _, buck := range rt.Buckets { for e := buck.getIter(); e != nil; e = e.Next() { peers = append(peers, e.Value.(*peer.Peer)) } diff --git a/table_test.go b/table_test.go index 4305d8d..842c925 100644 --- a/table_test.go +++ b/table_test.go @@ -1,10 +1,10 @@ package dht import ( + "container/list" crand "crypto/rand" "crypto/sha256" "math/rand" - "container/list" "testing" peer "github.com/jbenet/go-ipfs/peer" From 2f8828de36de86c0840d8d4901ccfacee4b808f6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 10 Aug 2014 21:02:05 -0700 Subject: [PATCH 03/76] more work implementing coral type lookups --- util.go | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/util.go b/util.go index 095d0b0..32ff2c2 100644 --- a/util.go +++ b/util.go @@ -3,11 +3,16 @@ package dht import ( "bytes" "crypto/sha256" + "errors" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" ) +// Returned if a routing table query returns no results. This is NOT expected +// behaviour +var ErrLookupFailure = errors.New("failed to find any peer in table") + // ID for IpfsDHT should be a byte slice, to allow for simpler operations // (xor). DHT ids are based on the peer.IDs. // @@ -19,8 +24,8 @@ func (id ID) Equal(other ID) bool { return bytes.Equal(id, other) } -func (id ID) Less(other interface{}) bool { - a, b := equalizeSizes(id, other.(ID)) +func (id ID) Less(other ID) bool { + a, b := equalizeSizes(id, other) for i := 0; i < len(a); i++ { if a[i] != b[i] { return a[i] < b[i] @@ -80,3 +85,14 @@ func ConvertKey(id u.Key) ID { hash := sha256.Sum256([]byte(id)) return hash[:] } + +// Returns true if a is closer to key than b is +func Closer(a, b peer.ID, key u.Key) bool { + aid := ConvertPeerID(a) + bid := ConvertPeerID(b) + tgt := ConvertKey(key) + adist := xor(aid, tgt) + bdist := xor(bid, tgt) + + return adist.Less(bdist) +} From 9b286644ceb638b23b2290abdde38fb6bb900969 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 11 Aug 2014 20:11:23 -0700 Subject: [PATCH 04/76] more tests and add in table filtering by peer latency --- bucket.go | 54 +++++++++++++++++++++----------- table.go | 30 ++++++++++++++---- table_test.go | 87 ++++++++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 140 insertions(+), 31 deletions(-) diff --git a/bucket.go b/bucket.go index 5abd2c9..1a55a0f 100644 --- a/bucket.go +++ b/bucket.go @@ -2,16 +2,27 @@ package dht import ( "container/list" + "sync" peer "github.com/jbenet/go-ipfs/peer" ) // Bucket holds a list of peers. -type Bucket list.List +type Bucket struct { + lk sync.RWMutex + list *list.List +} + +func NewBucket() *Bucket { + b := new(Bucket) + b.list = list.New() + return b +} func (b *Bucket) Find(id peer.ID) *list.Element { - bucket_list := (*list.List)(b) - for e := bucket_list.Front(); e != nil; e = e.Next() { + b.lk.RLock() + defer b.lk.RUnlock() + for e := b.list.Front(); e != nil; e = e.Next() { if e.Value.(*peer.Peer).ID.Equal(id) { return e } @@ -20,34 +31,42 @@ func (b *Bucket) Find(id peer.ID) *list.Element { } func (b *Bucket) MoveToFront(e *list.Element) { - bucket_list := (*list.List)(b) - bucket_list.MoveToFront(e) + b.lk.Lock() + b.list.MoveToFront(e) + b.lk.Unlock() } func (b *Bucket) PushFront(p *peer.Peer) { - bucket_list := (*list.List)(b) - bucket_list.PushFront(p) + b.lk.Lock() + b.list.PushFront(p) + b.lk.Unlock() } func (b *Bucket) PopBack() *peer.Peer { - bucket_list := (*list.List)(b) - last := bucket_list.Back() - bucket_list.Remove(last) + b.lk.Lock() + defer b.lk.Unlock() + last := b.list.Back() + b.list.Remove(last) return last.Value.(*peer.Peer) } func (b *Bucket) Len() int { - bucket_list := (*list.List)(b) - return bucket_list.Len() + b.lk.RLock() + defer b.lk.RUnlock() + return b.list.Len() } // Splits a buckets peers into two buckets, the methods receiver will have // peers with CPL equal to cpl, the returned bucket will have peers with CPL // greater than cpl (returned bucket has closer peers) func (b *Bucket) Split(cpl int, target ID) *Bucket { - bucket_list := (*list.List)(b) + b.lk.Lock() + defer b.lk.Unlock() + out := list.New() - e := bucket_list.Front() + newbuck := NewBucket() + newbuck.list = out + e := b.list.Front() for e != nil { peer_id := ConvertPeerID(e.Value.(*peer.Peer).ID) peer_cpl := prefLen(peer_id, target) @@ -55,15 +74,14 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { cur := e out.PushBack(e.Value) e = e.Next() - bucket_list.Remove(cur) + b.list.Remove(cur) continue } e = e.Next() } - return (*Bucket)(out) + return newbuck } func (b *Bucket) getIter() *list.Element { - bucket_list := (*list.List)(b) - return bucket_list.Front() + return b.list.Front() } diff --git a/table.go b/table.go index 788d122..86a7031 100644 --- a/table.go +++ b/table.go @@ -2,8 +2,10 @@ package dht import ( "container/list" + "fmt" "sort" "sync" + "time" peer "github.com/jbenet/go-ipfs/peer" u "github.com/jbenet/go-ipfs/util" @@ -18,16 +20,20 @@ type RoutingTable struct { // Blanket lock, refine later for better performance tabLock sync.RWMutex + // Maximum acceptable latency for peers in this cluster + maxLatency time.Duration + // kBuckets define all the fingers to other nodes. Buckets []*Bucket bucketsize int } -func NewRoutingTable(bucketsize int, local_id ID) *RoutingTable { +func NewRoutingTable(bucketsize int, local_id ID, latency time.Duration) *RoutingTable { rt := new(RoutingTable) - rt.Buckets = []*Bucket{new(Bucket)} + rt.Buckets = []*Bucket{NewBucket()} rt.bucketsize = bucketsize rt.local = local_id + rt.maxLatency = latency return rt } @@ -48,6 +54,10 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { e := bucket.Find(p.ID) if e == nil { // New peer, add to bucket + if p.GetLatency() > rt.maxLatency { + // Connection doesnt meet requirements, skip! + return nil + } bucket.PushFront(p) // Are we past the max bucket size? @@ -150,17 +160,16 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { // In the case of an unusual split, one bucket may be empty. // if this happens, search both surrounding buckets for nearest peer if cpl > 0 { - plist := (*list.List)(rt.Buckets[cpl-1]) + plist := rt.Buckets[cpl-1].list peerArr = copyPeersFromList(id, peerArr, plist) } if cpl < len(rt.Buckets)-1 { - plist := (*list.List)(rt.Buckets[cpl+1]) + plist := rt.Buckets[cpl+1].list peerArr = copyPeersFromList(id, peerArr, plist) } } else { - plist := (*list.List)(bucket) - peerArr = copyPeersFromList(id, peerArr, plist) + peerArr = copyPeersFromList(id, peerArr, bucket.list) } // Sort by distance to local peer @@ -193,3 +202,12 @@ func (rt *RoutingTable) Listpeers() []*peer.Peer { } return peers } + +func (rt *RoutingTable) Print() { + fmt.Printf("Routing Table, bs = %d, Max latency = %d\n", rt.bucketsize, rt.maxLatency) + rt.tabLock.RLock() + peers := rt.Listpeers() + for i, p := range peers { + fmt.Printf("%d) %s %s\n", i, p.ID.Pretty(), p.GetLatency().String()) + } +} diff --git a/table_test.go b/table_test.go index 842c925..02d8f5e 100644 --- a/table_test.go +++ b/table_test.go @@ -1,11 +1,11 @@ package dht import ( - "container/list" crand "crypto/rand" "crypto/sha256" "math/rand" "testing" + "time" peer "github.com/jbenet/go-ipfs/peer" ) @@ -27,7 +27,7 @@ func _randID() ID { // Test basic features of the bucket struct func TestBucket(t *testing.T) { - b := new(Bucket) + b := NewBucket() peers := make([]*peer.Peer, 100) for i := 0; i < 100; i++ { @@ -45,7 +45,7 @@ func TestBucket(t *testing.T) { } spl := b.Split(0, ConvertPeerID(local.ID)) - llist := (*list.List)(b) + llist := b.list for e := llist.Front(); e != nil; e = e.Next() { p := ConvertPeerID(e.Value.(*peer.Peer).ID) cpl := xor(p, local_id).commonPrefixLen() @@ -54,7 +54,7 @@ func TestBucket(t *testing.T) { } } - rlist := (*list.List)(spl) + rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { p := ConvertPeerID(e.Value.(*peer.Peer).ID) cpl := xor(p, local_id).commonPrefixLen() @@ -67,7 +67,7 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID)) + rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 100; i++ { @@ -93,7 +93,7 @@ func TestTableUpdate(t *testing.T) { func TestTableFind(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID)) + rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 5; i++ { @@ -110,7 +110,7 @@ func TestTableFind(t *testing.T) { func TestTableFindMultiple(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(20, ConvertPeerID(local.ID)) + rt := NewRoutingTable(20, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 18; i++ { @@ -124,3 +124,76 @@ func TestTableFindMultiple(t *testing.T) { t.Fatalf("Got back different number of peers than we expected.") } } + +// Looks for race conditions in table operations. For a more 'certain' +// test, increase the loop counter from 1000 to a much higher number +// and set GOMAXPROCS above 1 +func TestTableMultithreaded(t *testing.T) { + local := peer.ID("localPeer") + tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) + var peers []*peer.Peer + for i := 0; i < 500; i++ { + peers = append(peers, _randPeer()) + } + + done := make(chan struct{}) + go func() { + for i := 0; i < 1000; i++ { + n := rand.Intn(len(peers)) + tab.Update(peers[n]) + } + done <- struct{}{} + }() + + go func() { + for i := 0; i < 1000; i++ { + n := rand.Intn(len(peers)) + tab.Update(peers[n]) + } + done <- struct{}{} + }() + + go func() { + for i := 0; i < 1000; i++ { + n := rand.Intn(len(peers)) + tab.Find(peers[n].ID) + } + done <- struct{}{} + }() + <-done + <-done + <-done +} + +func BenchmarkUpdates(b *testing.B) { + b.StopTimer() + local := ConvertKey("localKey") + tab := NewRoutingTable(20, local, time.Hour) + + var peers []*peer.Peer + for i := 0; i < b.N; i++ { + peers = append(peers, _randPeer()) + } + + b.StartTimer() + for i := 0; i < b.N; i++ { + tab.Update(peers[i]) + } +} + +func BenchmarkFinds(b *testing.B) { + b.StopTimer() + local := ConvertKey("localKey") + tab := NewRoutingTable(20, local, time.Hour) + + var peers []*peer.Peer + for i := 0; i < b.N; i++ { + peers = append(peers, _randPeer()) + tab.Update(peers[i]) + } + + b.StartTimer() + for i := 0; i < b.N; i++ { + tab.Find(peers[i].ID) + } +} From 8c879625666fe0b71c287641411b966084e4b121 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 16 Aug 2014 18:06:14 -0700 Subject: [PATCH 05/76] POut should not have a newline --- table.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/table.go b/table.go index 86a7031..d0137c6 100644 --- a/table.go +++ b/table.go @@ -116,7 +116,7 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe } peerArr = append(peerArr, &pd) if e == nil { - u.POut("list element was nil.") + u.POut("list element was nil.\n") return peerArr } } From 5244bf9dd6b1662efa803dd14638bdca4fcb5a0e Mon Sep 17 00:00:00 2001 From: Chas Leichner Date: Sat, 16 Aug 2014 23:03:36 -0700 Subject: [PATCH 06/76] Made the DHT module pass golint --- bucket.go | 22 +++++++-------- table.go | 76 +++++++++++++++++++++++++-------------------------- table_test.go | 38 +++++++++++++------------- util.go | 18 ++++++------ 4 files changed, 76 insertions(+), 78 deletions(-) diff --git a/bucket.go b/bucket.go index 1a55a0f..77ed596 100644 --- a/bucket.go +++ b/bucket.go @@ -13,13 +13,13 @@ type Bucket struct { list *list.List } -func NewBucket() *Bucket { +func newBucket() *Bucket { b := new(Bucket) b.list = list.New() return b } -func (b *Bucket) Find(id peer.ID) *list.Element { +func (b *Bucket) find(id peer.ID) *list.Element { b.lk.RLock() defer b.lk.RUnlock() for e := b.list.Front(); e != nil; e = e.Next() { @@ -30,19 +30,19 @@ func (b *Bucket) Find(id peer.ID) *list.Element { return nil } -func (b *Bucket) MoveToFront(e *list.Element) { +func (b *Bucket) moveToFront(e *list.Element) { b.lk.Lock() b.list.MoveToFront(e) b.lk.Unlock() } -func (b *Bucket) PushFront(p *peer.Peer) { +func (b *Bucket) pushFront(p *peer.Peer) { b.lk.Lock() b.list.PushFront(p) b.lk.Unlock() } -func (b *Bucket) PopBack() *peer.Peer { +func (b *Bucket) popBack() *peer.Peer { b.lk.Lock() defer b.lk.Unlock() last := b.list.Back() @@ -50,13 +50,13 @@ func (b *Bucket) PopBack() *peer.Peer { return last.Value.(*peer.Peer) } -func (b *Bucket) Len() int { +func (b *Bucket) len() int { b.lk.RLock() defer b.lk.RUnlock() return b.list.Len() } -// Splits a buckets peers into two buckets, the methods receiver will have +// Split splits a buckets peers into two buckets, the methods receiver will have // peers with CPL equal to cpl, the returned bucket will have peers with CPL // greater than cpl (returned bucket has closer peers) func (b *Bucket) Split(cpl int, target ID) *Bucket { @@ -64,13 +64,13 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { defer b.lk.Unlock() out := list.New() - newbuck := NewBucket() + newbuck := newBucket() newbuck.list = out e := b.list.Front() for e != nil { - peer_id := ConvertPeerID(e.Value.(*peer.Peer).ID) - peer_cpl := prefLen(peer_id, target) - if peer_cpl > cpl { + peerID := convertPeerID(e.Value.(*peer.Peer).ID) + peerCPL := prefLen(peerID, target) + if peerCPL > cpl { cur := e out.PushBack(e.Value) e = e.Next() diff --git a/table.go b/table.go index d0137c6..3bbd56d 100644 --- a/table.go +++ b/table.go @@ -28,11 +28,11 @@ type RoutingTable struct { bucketsize int } -func NewRoutingTable(bucketsize int, local_id ID, latency time.Duration) *RoutingTable { +func newRoutingTable(bucketsize int, localID ID, latency time.Duration) *RoutingTable { rt := new(RoutingTable) - rt.Buckets = []*Bucket{NewBucket()} + rt.Buckets = []*Bucket{newBucket()} rt.bucketsize = bucketsize - rt.local = local_id + rt.local = localID rt.maxLatency = latency return rt } @@ -42,51 +42,50 @@ func NewRoutingTable(bucketsize int, local_id ID, latency time.Duration) *Routin func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { rt.tabLock.Lock() defer rt.tabLock.Unlock() - peer_id := ConvertPeerID(p.ID) - cpl := xor(peer_id, rt.local).commonPrefixLen() + peerID := convertPeerID(p.ID) + cpl := xor(peerID, rt.local).commonPrefixLen() - b_id := cpl - if b_id >= len(rt.Buckets) { - b_id = len(rt.Buckets) - 1 + bucketID := cpl + if bucketID >= len(rt.Buckets) { + bucketID = len(rt.Buckets) - 1 } - bucket := rt.Buckets[b_id] - e := bucket.Find(p.ID) + bucket := rt.Buckets[bucketID] + e := bucket.find(p.ID) if e == nil { // New peer, add to bucket if p.GetLatency() > rt.maxLatency { // Connection doesnt meet requirements, skip! return nil } - bucket.PushFront(p) + bucket.pushFront(p) // Are we past the max bucket size? - if bucket.Len() > rt.bucketsize { - if b_id == len(rt.Buckets)-1 { - new_bucket := bucket.Split(b_id, rt.local) - rt.Buckets = append(rt.Buckets, new_bucket) - if new_bucket.Len() > rt.bucketsize { + if bucket.len() > rt.bucketsize { + if bucketID == len(rt.Buckets)-1 { + newBucket := bucket.Split(bucketID, rt.local) + rt.Buckets = append(rt.Buckets, newBucket) + if newBucket.len() > rt.bucketsize { // TODO: This is a very rare and annoying case panic("Case not handled.") } // If all elements were on left side of split... - if bucket.Len() > rt.bucketsize { - return bucket.PopBack() + if bucket.len() > rt.bucketsize { + return bucket.popBack() } } else { // If the bucket cant split kick out least active node - return bucket.PopBack() + return bucket.popBack() } } return nil - } else { - // If the peer is already in the table, move it to the front. - // This signifies that it it "more active" and the less active nodes - // Will as a result tend towards the back of the list - bucket.MoveToFront(e) - return nil } + // If the peer is already in the table, move it to the front. + // This signifies that it it "more active" and the less active nodes + // Will as a result tend towards the back of the list + bucket.moveToFront(e) + return nil } // A helper struct to sort peers by their distance to the local node @@ -101,7 +100,7 @@ type peerSorterArr []*peerDistance func (p peerSorterArr) Len() int { return len(p) } func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] } func (p peerSorterArr) Less(a, b int) bool { - return p[a].distance.Less(p[b].distance) + return p[a].distance.less(p[b].distance) } // @@ -109,10 +108,10 @@ func (p peerSorterArr) Less(a, b int) bool { func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { for e := peerList.Front(); e != nil; e = e.Next() { p := e.Value.(*peer.Peer) - p_id := ConvertPeerID(p.ID) + pID := convertPeerID(p.ID) pd := peerDistance{ p: p, - distance: xor(target, p_id), + distance: xor(target, pID), } peerArr = append(peerArr, &pd) if e == nil { @@ -125,24 +124,23 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe // Find a specific peer by ID or return nil func (rt *RoutingTable) Find(id peer.ID) *peer.Peer { - srch := rt.NearestPeers(ConvertPeerID(id), 1) + srch := rt.NearestPeers(convertPeerID(id), 1) if len(srch) == 0 || !srch[0].ID.Equal(id) { return nil } return srch[0] } -// Returns a single peer that is nearest to the given ID +// NearestPeer returns a single peer that is nearest to the given ID func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { peers := rt.NearestPeers(id, 1) if len(peers) > 0 { return peers[0] - } else { - return nil } + return nil } -// Returns a list of the 'count' closest peers to the given ID +// NearestPeers returns a list of the 'count' closest peers to the given ID func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { rt.tabLock.RLock() defer rt.tabLock.RUnlock() @@ -156,7 +154,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { bucket = rt.Buckets[cpl] var peerArr peerSorterArr - if bucket.Len() == 0 { + if bucket.len() == 0 { // In the case of an unusual split, one bucket may be empty. // if this happens, search both surrounding buckets for nearest peer if cpl > 0 { @@ -183,17 +181,17 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { return out } -// Returns the total number of peers in the routing table +// Size returns the total number of peers in the routing table func (rt *RoutingTable) Size() int { var tot int for _, buck := range rt.Buckets { - tot += buck.Len() + tot += buck.len() } return tot } // NOTE: This is potentially unsafe... use at your own risk -func (rt *RoutingTable) Listpeers() []*peer.Peer { +func (rt *RoutingTable) listPeers() []*peer.Peer { var peers []*peer.Peer for _, buck := range rt.Buckets { for e := buck.getIter(); e != nil; e = e.Next() { @@ -203,10 +201,10 @@ func (rt *RoutingTable) Listpeers() []*peer.Peer { return peers } -func (rt *RoutingTable) Print() { +func (rt *RoutingTable) print() { fmt.Printf("Routing Table, bs = %d, Max latency = %d\n", rt.bucketsize, rt.maxLatency) rt.tabLock.RLock() - peers := rt.Listpeers() + peers := rt.listPeers() for i, p := range peers { fmt.Printf("%d) %s %s\n", i, p.ID.Pretty(), p.GetLatency().String()) } diff --git a/table_test.go b/table_test.go index 02d8f5e..ba5baee 100644 --- a/table_test.go +++ b/table_test.go @@ -27,28 +27,28 @@ func _randID() ID { // Test basic features of the bucket struct func TestBucket(t *testing.T) { - b := NewBucket() + b := newBucket() peers := make([]*peer.Peer, 100) for i := 0; i < 100; i++ { peers[i] = _randPeer() - b.PushFront(peers[i]) + b.pushFront(peers[i]) } local := _randPeer() - local_id := ConvertPeerID(local.ID) + localID := convertPeerID(local.ID) i := rand.Intn(len(peers)) - e := b.Find(peers[i].ID) + e := b.find(peers[i].ID) if e == nil { t.Errorf("Failed to find peer: %v", peers[i]) } - spl := b.Split(0, ConvertPeerID(local.ID)) + spl := b.Split(0, convertPeerID(local.ID)) llist := b.list for e := llist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(*peer.Peer).ID) - cpl := xor(p, local_id).commonPrefixLen() + p := convertPeerID(e.Value.(*peer.Peer).ID) + cpl := xor(p, localID).commonPrefixLen() if cpl > 0 { t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") } @@ -56,8 +56,8 @@ func TestBucket(t *testing.T) { rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(*peer.Peer).ID) - cpl := xor(p, local_id).commonPrefixLen() + p := convertPeerID(e.Value.(*peer.Peer).ID) + cpl := xor(p, localID).commonPrefixLen() if cpl == 0 { t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") } @@ -67,7 +67,7 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) + rt := newRoutingTable(10, convertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 100; i++ { @@ -93,7 +93,7 @@ func TestTableUpdate(t *testing.T) { func TestTableFind(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) + rt := newRoutingTable(10, convertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 5; i++ { @@ -102,7 +102,7 @@ func TestTableFind(t *testing.T) { } t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) - found := rt.NearestPeer(ConvertPeerID(peers[2].ID)) + found := rt.NearestPeer(convertPeerID(peers[2].ID)) if !found.ID.Equal(peers[2].ID) { t.Fatalf("Failed to lookup known node...") } @@ -110,7 +110,7 @@ func TestTableFind(t *testing.T) { func TestTableFindMultiple(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(20, ConvertPeerID(local.ID), time.Hour) + rt := newRoutingTable(20, convertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 18; i++ { @@ -119,7 +119,7 @@ func TestTableFindMultiple(t *testing.T) { } t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) - found := rt.NearestPeers(ConvertPeerID(peers[2].ID), 15) + found := rt.NearestPeers(convertPeerID(peers[2].ID), 15) if len(found) != 15 { t.Fatalf("Got back different number of peers than we expected.") } @@ -130,7 +130,7 @@ func TestTableFindMultiple(t *testing.T) { // and set GOMAXPROCS above 1 func TestTableMultithreaded(t *testing.T) { local := peer.ID("localPeer") - tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) + tab := newRoutingTable(20, convertPeerID(local), time.Hour) var peers []*peer.Peer for i := 0; i < 500; i++ { peers = append(peers, _randPeer()) @@ -167,8 +167,8 @@ func TestTableMultithreaded(t *testing.T) { func BenchmarkUpdates(b *testing.B) { b.StopTimer() - local := ConvertKey("localKey") - tab := NewRoutingTable(20, local, time.Hour) + local := convertKey("localKey") + tab := newRoutingTable(20, local, time.Hour) var peers []*peer.Peer for i := 0; i < b.N; i++ { @@ -183,8 +183,8 @@ func BenchmarkUpdates(b *testing.B) { func BenchmarkFinds(b *testing.B) { b.StopTimer() - local := ConvertKey("localKey") - tab := NewRoutingTable(20, local, time.Hour) + local := convertKey("localKey") + tab := newRoutingTable(20, local, time.Hour) var peers []*peer.Peer for i := 0; i < b.N; i++ { diff --git a/util.go b/util.go index 32ff2c2..addd925 100644 --- a/util.go +++ b/util.go @@ -20,11 +20,11 @@ var ErrLookupFailure = errors.New("failed to find any peer in table") // peer.ID or a util.Key. This unifies the keyspace type ID []byte -func (id ID) Equal(other ID) bool { +func (id ID) equal(other ID) bool { return bytes.Equal(id, other) } -func (id ID) Less(other ID) bool { +func (id ID) less(other ID) bool { a, b := equalizeSizes(id, other) for i := 0; i < len(a); i++ { if a[i] != b[i] { @@ -76,23 +76,23 @@ func equalizeSizes(a, b ID) (ID, ID) { return a, b } -func ConvertPeerID(id peer.ID) ID { +func convertPeerID(id peer.ID) ID { hash := sha256.Sum256(id) return hash[:] } -func ConvertKey(id u.Key) ID { +func convertKey(id u.Key) ID { hash := sha256.Sum256([]byte(id)) return hash[:] } -// Returns true if a is closer to key than b is +// Closer returns true if a is closer to key than b is func Closer(a, b peer.ID, key u.Key) bool { - aid := ConvertPeerID(a) - bid := ConvertPeerID(b) - tgt := ConvertKey(key) + aid := convertPeerID(a) + bid := convertPeerID(b) + tgt := convertKey(key) adist := xor(aid, tgt) bdist := xor(bid, tgt) - return adist.Less(bdist) + return adist.less(bdist) } From 751f985c4c5d6c26b9d75fe1e8f553bfc4352a9e Mon Sep 17 00:00:00 2001 From: Chas Leichner Date: Sat, 16 Aug 2014 23:48:03 -0700 Subject: [PATCH 07/76] Made routing code pass golint. --- bucket.go | 2 +- table.go | 17 ++++++++++------- table_test.go | 28 ++++++++++++++-------------- util.go | 12 +++++++----- 4 files changed, 32 insertions(+), 27 deletions(-) diff --git a/bucket.go b/bucket.go index 77ed596..a4eb914 100644 --- a/bucket.go +++ b/bucket.go @@ -68,7 +68,7 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { newbuck.list = out e := b.list.Front() for e != nil { - peerID := convertPeerID(e.Value.(*peer.Peer).ID) + peerID := ConvertPeerID(e.Value.(*peer.Peer).ID) peerCPL := prefLen(peerID, target) if peerCPL > cpl { cur := e diff --git a/table.go b/table.go index 3bbd56d..5f1e5c8 100644 --- a/table.go +++ b/table.go @@ -28,7 +28,8 @@ type RoutingTable struct { bucketsize int } -func newRoutingTable(bucketsize int, localID ID, latency time.Duration) *RoutingTable { +// NewRoutingTable creates a new routing table with a given bucketsize, local ID, and latency tolerance. +func NewRoutingTable(bucketsize int, localID ID, latency time.Duration) *RoutingTable { rt := new(RoutingTable) rt.Buckets = []*Bucket{newBucket()} rt.bucketsize = bucketsize @@ -42,7 +43,7 @@ func newRoutingTable(bucketsize int, localID ID, latency time.Duration) *Routing func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { rt.tabLock.Lock() defer rt.tabLock.Unlock() - peerID := convertPeerID(p.ID) + peerID := ConvertPeerID(p.ID) cpl := xor(peerID, rt.local).commonPrefixLen() bucketID := cpl @@ -108,7 +109,7 @@ func (p peerSorterArr) Less(a, b int) bool { func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { for e := peerList.Front(); e != nil; e = e.Next() { p := e.Value.(*peer.Peer) - pID := convertPeerID(p.ID) + pID := ConvertPeerID(p.ID) pd := peerDistance{ p: p, distance: xor(target, pID), @@ -124,7 +125,7 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe // Find a specific peer by ID or return nil func (rt *RoutingTable) Find(id peer.ID) *peer.Peer { - srch := rt.NearestPeers(convertPeerID(id), 1) + srch := rt.NearestPeers(ConvertPeerID(id), 1) if len(srch) == 0 || !srch[0].ID.Equal(id) { return nil } @@ -190,8 +191,9 @@ func (rt *RoutingTable) Size() int { return tot } +// ListPeers takes a RoutingTable and returns a list of all peers from all buckets in the table. // NOTE: This is potentially unsafe... use at your own risk -func (rt *RoutingTable) listPeers() []*peer.Peer { +func (rt *RoutingTable) ListPeers() []*peer.Peer { var peers []*peer.Peer for _, buck := range rt.Buckets { for e := buck.getIter(); e != nil; e = e.Next() { @@ -201,10 +203,11 @@ func (rt *RoutingTable) listPeers() []*peer.Peer { return peers } -func (rt *RoutingTable) print() { +// Print prints a descriptive statement about the provided RoutingTable +func (rt *RoutingTable) Print() { fmt.Printf("Routing Table, bs = %d, Max latency = %d\n", rt.bucketsize, rt.maxLatency) rt.tabLock.RLock() - peers := rt.listPeers() + peers := rt.ListPeers() for i, p := range peers { fmt.Printf("%d) %s %s\n", i, p.ID.Pretty(), p.GetLatency().String()) } diff --git a/table_test.go b/table_test.go index ba5baee..13a55d1 100644 --- a/table_test.go +++ b/table_test.go @@ -36,7 +36,7 @@ func TestBucket(t *testing.T) { } local := _randPeer() - localID := convertPeerID(local.ID) + localID := ConvertPeerID(local.ID) i := rand.Intn(len(peers)) e := b.find(peers[i].ID) @@ -44,10 +44,10 @@ func TestBucket(t *testing.T) { t.Errorf("Failed to find peer: %v", peers[i]) } - spl := b.Split(0, convertPeerID(local.ID)) + spl := b.Split(0, ConvertPeerID(local.ID)) llist := b.list for e := llist.Front(); e != nil; e = e.Next() { - p := convertPeerID(e.Value.(*peer.Peer).ID) + p := ConvertPeerID(e.Value.(*peer.Peer).ID) cpl := xor(p, localID).commonPrefixLen() if cpl > 0 { t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") @@ -56,7 +56,7 @@ func TestBucket(t *testing.T) { rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { - p := convertPeerID(e.Value.(*peer.Peer).ID) + p := ConvertPeerID(e.Value.(*peer.Peer).ID) cpl := xor(p, localID).commonPrefixLen() if cpl == 0 { t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") @@ -67,7 +67,7 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { local := _randPeer() - rt := newRoutingTable(10, convertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 100; i++ { @@ -93,7 +93,7 @@ func TestTableUpdate(t *testing.T) { func TestTableFind(t *testing.T) { local := _randPeer() - rt := newRoutingTable(10, convertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 5; i++ { @@ -102,7 +102,7 @@ func TestTableFind(t *testing.T) { } t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) - found := rt.NearestPeer(convertPeerID(peers[2].ID)) + found := rt.NearestPeer(ConvertPeerID(peers[2].ID)) if !found.ID.Equal(peers[2].ID) { t.Fatalf("Failed to lookup known node...") } @@ -110,7 +110,7 @@ func TestTableFind(t *testing.T) { func TestTableFindMultiple(t *testing.T) { local := _randPeer() - rt := newRoutingTable(20, convertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(20, ConvertPeerID(local.ID), time.Hour) peers := make([]*peer.Peer, 100) for i := 0; i < 18; i++ { @@ -119,7 +119,7 @@ func TestTableFindMultiple(t *testing.T) { } t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) - found := rt.NearestPeers(convertPeerID(peers[2].ID), 15) + found := rt.NearestPeers(ConvertPeerID(peers[2].ID), 15) if len(found) != 15 { t.Fatalf("Got back different number of peers than we expected.") } @@ -130,7 +130,7 @@ func TestTableFindMultiple(t *testing.T) { // and set GOMAXPROCS above 1 func TestTableMultithreaded(t *testing.T) { local := peer.ID("localPeer") - tab := newRoutingTable(20, convertPeerID(local), time.Hour) + tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) var peers []*peer.Peer for i := 0; i < 500; i++ { peers = append(peers, _randPeer()) @@ -167,8 +167,8 @@ func TestTableMultithreaded(t *testing.T) { func BenchmarkUpdates(b *testing.B) { b.StopTimer() - local := convertKey("localKey") - tab := newRoutingTable(20, local, time.Hour) + local := ConvertKey("localKey") + tab := NewRoutingTable(20, local, time.Hour) var peers []*peer.Peer for i := 0; i < b.N; i++ { @@ -183,8 +183,8 @@ func BenchmarkUpdates(b *testing.B) { func BenchmarkFinds(b *testing.B) { b.StopTimer() - local := convertKey("localKey") - tab := newRoutingTable(20, local, time.Hour) + local := ConvertKey("localKey") + tab := NewRoutingTable(20, local, time.Hour) var peers []*peer.Peer for i := 0; i < b.N; i++ { diff --git a/util.go b/util.go index addd925..1195022 100644 --- a/util.go +++ b/util.go @@ -76,21 +76,23 @@ func equalizeSizes(a, b ID) (ID, ID) { return a, b } -func convertPeerID(id peer.ID) ID { +// ConvertPeerID creates a DHT ID by hashing a Peer ID (Multihash) +func ConvertPeerID(id peer.ID) ID { hash := sha256.Sum256(id) return hash[:] } -func convertKey(id u.Key) ID { +// ConvertKey creates a DHT ID by hashing a local key (String) +func ConvertKey(id u.Key) ID { hash := sha256.Sum256([]byte(id)) return hash[:] } // Closer returns true if a is closer to key than b is func Closer(a, b peer.ID, key u.Key) bool { - aid := convertPeerID(a) - bid := convertPeerID(b) - tgt := convertKey(key) + aid := ConvertPeerID(a) + bid := ConvertPeerID(b) + tgt := ConvertKey(key) adist := xor(aid, tgt) bdist := xor(bid, tgt) From 6aca2ab2aa3893f65cdee586f36eba92192a1763 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Aug 2014 12:01:03 -0700 Subject: [PATCH 08/76] fixing up some bitswap stuff after the PR --- table_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/table_test.go b/table_test.go index 13a55d1..dbb391f 100644 --- a/table_test.go +++ b/table_test.go @@ -78,7 +78,7 @@ func TestTableUpdate(t *testing.T) { for i := 0; i < 10000; i++ { p := rt.Update(peers[rand.Intn(len(peers))]) if p != nil { - t.Log("evicted peer.") + //t.Log("evicted peer.") } } From 7550fd11eeb1b153e830282ff43afadd0063e79e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Sep 2014 02:02:13 -0700 Subject: [PATCH 09/76] moved keyspace --- keyspace.go | 97 ++++++++++++++++++++++++++++++++++ xor.go | 74 ++++++++++++++++++++++++++ xor_test.go | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 318 insertions(+) create mode 100644 keyspace.go create mode 100644 xor.go create mode 100644 xor_test.go diff --git a/keyspace.go b/keyspace.go new file mode 100644 index 0000000..a385e9a --- /dev/null +++ b/keyspace.go @@ -0,0 +1,97 @@ +package keyspace + +import ( + "sort" + + "math/big" +) + +// Key represents an identifier in a KeySpace. It holds a reference to the +// associated KeySpace, as well references to both the Original identifier, +// as well as the new, KeySpace Adjusted one. +type Key struct { + + // Space is the KeySpace this Key is related to. + Space KeySpace + + // Original is the original value of the identifier + Original []byte + + // Adjusted is the new value of the identifier, in the KeySpace. + Adjusted []byte +} + +// Equal returns whether this key is equal to another. +func (k1 Key) Equal(k2 Key) bool { + if k1.Space != k2.Space { + panic("k1 and k2 not in same key space.") + } + return k1.Space.Equal(k1, k2) +} + +// Less returns whether this key comes before another. +func (k1 Key) Less(k2 Key) bool { + if k1.Space != k2.Space { + panic("k1 and k2 not in same key space.") + } + return k1.Space.Less(k1, k2) +} + +// Distance returns this key's distance to another +func (k1 Key) Distance(k2 Key) *big.Int { + if k1.Space != k2.Space { + panic("k1 and k2 not in same key space.") + } + return k1.Space.Distance(k1, k2) +} + +// KeySpace is an object used to do math on identifiers. Each keyspace has its +// own properties and rules. See XorKeySpace. +type KeySpace interface { + + // Key converts an identifier into a Key in this space. + Key([]byte) Key + + // Equal returns whether keys are equal in this key space + Equal(Key, Key) bool + + // Distance returns the distance metric in this key space + Distance(Key, Key) *big.Int + + // Less returns whether the first key is smaller than the second. + Less(Key, Key) bool +} + +// byDistanceToCenter is a type used to sort Keys by proximity to a center. +type byDistanceToCenter struct { + Center Key + Keys []Key +} + +func (s byDistanceToCenter) Len() int { + return len(s.Keys) +} + +func (s byDistanceToCenter) Swap(i, j int) { + s.Keys[i], s.Keys[j] = s.Keys[j], s.Keys[i] +} + +func (s byDistanceToCenter) Less(i, j int) bool { + a := s.Center.Distance(s.Keys[i]) + b := s.Center.Distance(s.Keys[j]) + return a.Cmp(b) == -1 +} + +// SortByDistance takes a KeySpace, a center Key, and a list of Keys toSort. +// It returns a new list, where the Keys toSort have been sorted by their +// distance to the center Key. +func SortByDistance(sp KeySpace, center Key, toSort []Key) []Key { + toSortCopy := make([]Key, len(toSort)) + copy(toSortCopy, toSort) + bdtc := &byDistanceToCenter{ + Center: center, + Keys: toSortCopy, // copy + } + sort.Sort(bdtc) + return bdtc.Keys +} diff --git a/xor.go b/xor.go new file mode 100644 index 0000000..8cbef30 --- /dev/null +++ b/xor.go @@ -0,0 +1,74 @@ +package keyspace + +import ( + "bytes" + "crypto/sha256" + "math/big" +) + +// XORKeySpace is a KeySpace which: +// - normalizes identifiers using a cryptographic hash (sha256) +// - measures distance by XORing keys together +var XORKeySpace = &xorKeySpace{} +var _ KeySpace = XORKeySpace // ensure it conforms + +type xorKeySpace struct{} + +// Key converts an identifier into a Key in this space. +func (s *xorKeySpace) Key(id []byte) Key { + hash := sha256.Sum256(id) + key := hash[:] + return Key{ + Space: s, + Original: id, + Adjusted: key, + } +} + +// Equal returns whether keys are equal in this key space +func (s *xorKeySpace) Equal(k1, k2 Key) bool { + return bytes.Equal(k1.Adjusted, k2.Adjusted) +} + +// Distance returns the distance metric in this key space +func (s *xorKeySpace) Distance(k1, k2 Key) *big.Int { + // XOR the keys + k3 := XOR(k1.Adjusted, k2.Adjusted) + + // interpret it as an integer + dist := big.NewInt(0).SetBytes(k3) + return dist +} + +// Less returns whether the first key is smaller than the second. +func (s *xorKeySpace) Less(k1, k2 Key) bool { + a := k1.Adjusted + b := k2.Adjusted + for i := 0; i < len(a); i++ { + if a[i] != b[i] { + return a[i] < b[i] + } + } + return true +} + +// XOR takes two byte slices, XORs them together, returns the resulting slice. +func XOR(a, b []byte) []byte { + c := make([]byte, len(a)) + for i := 0; i < len(a); i++ { + c[i] = a[i] ^ b[i] + } + return c +} + +// ZeroPrefixLen returns the number of consecutive zeroes in a byte slice. +func ZeroPrefixLen(id []byte) int { + for i := 0; i < len(id); i++ { + for j := 0; j < 8; j++ { + if (id[i]>>uint8(7-j))&0x1 != 0 { + return i*8 + j + } + } + } + return len(id) * 8 +} diff --git a/xor_test.go b/xor_test.go new file mode 100644 index 0000000..46757b7 --- /dev/null +++ b/xor_test.go @@ -0,0 +1,147 @@ +package keyspace + +import ( + "bytes" + "math/big" + "testing" +) + +func TestXOR(t *testing.T) { + cases := [][3][]byte{ + [3][]byte{ + []byte{0xFF, 0xFF, 0xFF}, + []byte{0xFF, 0xFF, 0xFF}, + []byte{0x00, 0x00, 0x00}, + }, + [3][]byte{ + []byte{0x00, 0xFF, 0x00}, + []byte{0xFF, 0xFF, 0xFF}, + []byte{0xFF, 0x00, 0xFF}, + }, + [3][]byte{ + []byte{0x55, 0x55, 0x55}, + []byte{0x55, 0xFF, 0xAA}, + []byte{0x00, 0xAA, 0xFF}, + }, + } + + for _, c := range cases { + r := XOR(c[0], c[1]) + if !bytes.Equal(r, c[2]) { + t.Error("XOR failed") + } + } +} + +func TestPrefixLen(t *testing.T) { + cases := [][]byte{ + []byte{0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00}, + []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + []byte{0x00, 0x58, 0xFF, 0x80, 0x00, 0x00, 0xF0}, + } + lens := []int{24, 56, 9} + + for i, c := range cases { + r := ZeroPrefixLen(c) + if r != lens[i] { + t.Errorf("ZeroPrefixLen failed: %v != %v", r, lens[i]) + } + } + +} + +func TestXorKeySpace(t *testing.T) { + + ids := [][]byte{ + []byte{0xFF, 0xFF, 0xFF, 0xFF}, + []byte{0x00, 0x00, 0x00, 0x00}, + []byte{0xFF, 0xFF, 0xFF, 0xF0}, + } + + ks := [][2]Key{ + [2]Key{XORKeySpace.Key(ids[0]), XORKeySpace.Key(ids[0])}, + [2]Key{XORKeySpace.Key(ids[1]), XORKeySpace.Key(ids[1])}, + [2]Key{XORKeySpace.Key(ids[2]), XORKeySpace.Key(ids[2])}, + } + + for i, set := range ks { + if !set[0].Equal(set[1]) { + t.Errorf("Key not eq. %v != %v", set[0], set[1]) + } + + if !bytes.Equal(set[0].Adjusted, set[1].Adjusted) { + t.Errorf("Key gen failed. %v != %v", set[0].Adjusted, set[1].Adjusted) + } + + if !bytes.Equal(set[0].Original, ids[i]) { + t.Errorf("ptrs to original. %v != %v", set[0].Original, ids[i]) + } + + if len(set[0].Adjusted) != 32 { + t.Errorf("key length incorrect. 32 != %d", len(set[0].Adjusted)) + } + } + + for i := 1; i < len(ks); i++ { + if ks[i][0].Less(ks[i-1][0]) == ks[i-1][0].Less(ks[i][0]) { + t.Errorf("less should be different.") + } + + if ks[i][0].Distance(ks[i-1][0]).Cmp(ks[i-1][0].Distance(ks[i][0])) != 0 { + t.Errorf("distance should be the same.") + } + + if ks[i][0].Equal(ks[i-1][0]) { + t.Errorf("Keys should not be eq. %v != %v", ks[i][0], ks[i-1][0]) + } + } +} + +func TestDistancesAndCenterSorting(t *testing.T) { + + adjs := [][]byte{ + []byte{173, 149, 19, 27, 192, 183, 153, 192, 177, 175, 71, 127, 177, 79, 207, 38, 166, 169, 247, 96, 121, 228, 139, 240, 144, 172, 183, 232, 54, 123, 253, 14}, + []byte{223, 63, 97, 152, 4, 169, 47, 219, 64, 87, 25, 45, 196, 61, 215, 72, 234, 119, 138, 220, 82, 188, 73, 140, 232, 5, 36, 192, 20, 184, 17, 25}, + []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 126}, + []byte{73, 0, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + } + + keys := make([]Key, len(adjs)) + for i, a := range adjs { + keys[i] = Key{Space: XORKeySpace, Adjusted: a} + } + + cmp := func(a int, b *big.Int) int { + return big.NewInt(int64(a)).Cmp(b) + } + + if 0 != cmp(0, keys[2].Distance(keys[3])) { + t.Errorf("distance calculation wrong: %v", keys[2].Distance(keys[3])) + } + + if 0 != cmp(1, keys[2].Distance(keys[4])) { + t.Errorf("distance calculation wrong: %v", keys[2].Distance(keys[4])) + } + + d1 := keys[2].Distance(keys[5]) + d2 := XOR(keys[2].Adjusted, keys[5].Adjusted) + d2 = d2[len(keys[2].Adjusted)-len(d1.Bytes()):] // skip empty space for big + if !bytes.Equal(d1.Bytes(), d2) { + t.Errorf("bytes should be the same. %v == %v", d1.Bytes(), d2) + } + + if -1 != cmp(2<<32, keys[2].Distance(keys[5])) { + t.Errorf("2<<32 should be smaller") + } + + keys2 := SortByDistance(XORKeySpace, keys[2], keys) + order := []int{2, 3, 4, 5, 1, 0} + for i, o := range order { + if !bytes.Equal(keys[o].Adjusted, keys2[i].Adjusted) { + t.Errorf("order is wrong. %d?? %v == %v", o, keys[o], keys2[i]) + } + } + +} From 955487f2e3c8ec44978d466f8e2b00d6c06184ce Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Sep 2014 02:02:44 -0700 Subject: [PATCH 10/76] kbucket use new keyspace --- bucket.go | 2 +- table.go | 4 ++-- table_test.go | 4 ++-- util.go | 54 ++++++++------------------------------------------- 4 files changed, 13 insertions(+), 51 deletions(-) diff --git a/bucket.go b/bucket.go index a4eb914..3a9c71f 100644 --- a/bucket.go +++ b/bucket.go @@ -69,7 +69,7 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { e := b.list.Front() for e != nil { peerID := ConvertPeerID(e.Value.(*peer.Peer).ID) - peerCPL := prefLen(peerID, target) + peerCPL := commonPrefixLen(peerID, target) if peerCPL > cpl { cur := e out.PushBack(e.Value) diff --git a/table.go b/table.go index 5f1e5c8..2a0f16d 100644 --- a/table.go +++ b/table.go @@ -44,7 +44,7 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { rt.tabLock.Lock() defer rt.tabLock.Unlock() peerID := ConvertPeerID(p.ID) - cpl := xor(peerID, rt.local).commonPrefixLen() + cpl := commonPrefixLen(peerID, rt.local) bucketID := cpl if bucketID >= len(rt.Buckets) { @@ -145,7 +145,7 @@ func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { rt.tabLock.RLock() defer rt.tabLock.RUnlock() - cpl := prefLen(id, rt.local) + cpl := commonPrefixLen(id, rt.local) // Get bucket at cpl index or last bucket var bucket *Bucket diff --git a/table_test.go b/table_test.go index dbb391f..49be52c 100644 --- a/table_test.go +++ b/table_test.go @@ -48,7 +48,7 @@ func TestBucket(t *testing.T) { llist := b.list for e := llist.Front(); e != nil; e = e.Next() { p := ConvertPeerID(e.Value.(*peer.Peer).ID) - cpl := xor(p, localID).commonPrefixLen() + cpl := commonPrefixLen(p, localID) if cpl > 0 { t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") } @@ -57,7 +57,7 @@ func TestBucket(t *testing.T) { rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { p := ConvertPeerID(e.Value.(*peer.Peer).ID) - cpl := xor(p, localID).commonPrefixLen() + cpl := commonPrefixLen(p, localID) if cpl == 0 { t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") } diff --git a/util.go b/util.go index 1195022..ded28bb 100644 --- a/util.go +++ b/util.go @@ -6,6 +6,7 @@ import ( "errors" peer "github.com/jbenet/go-ipfs/peer" + ks "github.com/jbenet/go-ipfs/routing/keyspace" u "github.com/jbenet/go-ipfs/util" ) @@ -13,8 +14,7 @@ import ( // behaviour var ErrLookupFailure = errors.New("failed to find any peer in table") -// ID for IpfsDHT should be a byte slice, to allow for simpler operations -// (xor). DHT ids are based on the peer.IDs. +// ID for IpfsDHT is in the XORKeySpace // // The type dht.ID signifies that its contents have been hashed from either a // peer.ID or a util.Key. This unifies the keyspace @@ -25,55 +25,17 @@ func (id ID) equal(other ID) bool { } func (id ID) less(other ID) bool { - a, b := equalizeSizes(id, other) - for i := 0; i < len(a); i++ { - if a[i] != b[i] { - return a[i] < b[i] - } - } - return len(a) < len(b) -} - -func (id ID) commonPrefixLen() int { - for i := 0; i < len(id); i++ { - for j := 0; j < 8; j++ { - if (id[i]>>uint8(7-j))&0x1 != 0 { - return i*8 + j - } - } - } - return len(id)*8 - 1 -} - -func prefLen(a, b ID) int { - return xor(a, b).commonPrefixLen() + a := ks.Key{Space: ks.XORKeySpace, Adjusted: id} + b := ks.Key{Space: ks.XORKeySpace, Adjusted: other} + return a.Less(b) } func xor(a, b ID) ID { - a, b = equalizeSizes(a, b) - - c := make(ID, len(a)) - for i := 0; i < len(a); i++ { - c[i] = a[i] ^ b[i] - } - return c + return ID(ks.XOR(a, b)) } -func equalizeSizes(a, b ID) (ID, ID) { - la := len(a) - lb := len(b) - - if la < lb { - na := make([]byte, lb) - copy(na, a) - a = na - } else if lb < la { - nb := make([]byte, la) - copy(nb, b) - b = nb - } - - return a, b +func commonPrefixLen(a, b ID) int { + return ks.ZeroPrefixLen(ks.XOR(a, b)) } // ConvertPeerID creates a DHT ID by hashing a Peer ID (Multihash) From a35399edd716a038484a666fd4d485ff389ea799 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Sep 2014 02:46:54 -0700 Subject: [PATCH 11/76] refactored keyspace Adjusted -> Bytes --- keyspace.go | 6 +++--- xor.go | 10 +++++----- xor_test.go | 16 ++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/keyspace.go b/keyspace.go index a385e9a..e26a0e6 100644 --- a/keyspace.go +++ b/keyspace.go @@ -8,7 +8,7 @@ import ( // Key represents an identifier in a KeySpace. It holds a reference to the // associated KeySpace, as well references to both the Original identifier, -// as well as the new, KeySpace Adjusted one. +// as well as the new, KeySpace Bytes one. type Key struct { // Space is the KeySpace this Key is related to. @@ -17,8 +17,8 @@ type Key struct { // Original is the original value of the identifier Original []byte - // Adjusted is the new value of the identifier, in the KeySpace. - Adjusted []byte + // Bytes is the new value of the identifier, in the KeySpace. + Bytes []byte } // Equal returns whether this key is equal to another. diff --git a/xor.go b/xor.go index 8cbef30..dbb7c68 100644 --- a/xor.go +++ b/xor.go @@ -21,19 +21,19 @@ func (s *xorKeySpace) Key(id []byte) Key { return Key{ Space: s, Original: id, - Adjusted: key, + Bytes: key, } } // Equal returns whether keys are equal in this key space func (s *xorKeySpace) Equal(k1, k2 Key) bool { - return bytes.Equal(k1.Adjusted, k2.Adjusted) + return bytes.Equal(k1.Bytes, k2.Bytes) } // Distance returns the distance metric in this key space func (s *xorKeySpace) Distance(k1, k2 Key) *big.Int { // XOR the keys - k3 := XOR(k1.Adjusted, k2.Adjusted) + k3 := XOR(k1.Bytes, k2.Bytes) // interpret it as an integer dist := big.NewInt(0).SetBytes(k3) @@ -42,8 +42,8 @@ func (s *xorKeySpace) Distance(k1, k2 Key) *big.Int { // Less returns whether the first key is smaller than the second. func (s *xorKeySpace) Less(k1, k2 Key) bool { - a := k1.Adjusted - b := k2.Adjusted + a := k1.Bytes + b := k2.Bytes for i := 0; i < len(a); i++ { if a[i] != b[i] { return a[i] < b[i] diff --git a/xor_test.go b/xor_test.go index 46757b7..d7d83af 100644 --- a/xor_test.go +++ b/xor_test.go @@ -69,16 +69,16 @@ func TestXorKeySpace(t *testing.T) { t.Errorf("Key not eq. %v != %v", set[0], set[1]) } - if !bytes.Equal(set[0].Adjusted, set[1].Adjusted) { - t.Errorf("Key gen failed. %v != %v", set[0].Adjusted, set[1].Adjusted) + if !bytes.Equal(set[0].Bytes, set[1].Bytes) { + t.Errorf("Key gen failed. %v != %v", set[0].Bytes, set[1].Bytes) } if !bytes.Equal(set[0].Original, ids[i]) { t.Errorf("ptrs to original. %v != %v", set[0].Original, ids[i]) } - if len(set[0].Adjusted) != 32 { - t.Errorf("key length incorrect. 32 != %d", len(set[0].Adjusted)) + if len(set[0].Bytes) != 32 { + t.Errorf("key length incorrect. 32 != %d", len(set[0].Bytes)) } } @@ -110,7 +110,7 @@ func TestDistancesAndCenterSorting(t *testing.T) { keys := make([]Key, len(adjs)) for i, a := range adjs { - keys[i] = Key{Space: XORKeySpace, Adjusted: a} + keys[i] = Key{Space: XORKeySpace, Bytes: a} } cmp := func(a int, b *big.Int) int { @@ -126,8 +126,8 @@ func TestDistancesAndCenterSorting(t *testing.T) { } d1 := keys[2].Distance(keys[5]) - d2 := XOR(keys[2].Adjusted, keys[5].Adjusted) - d2 = d2[len(keys[2].Adjusted)-len(d1.Bytes()):] // skip empty space for big + d2 := XOR(keys[2].Bytes, keys[5].Bytes) + d2 = d2[len(keys[2].Bytes)-len(d1.Bytes()):] // skip empty space for big if !bytes.Equal(d1.Bytes(), d2) { t.Errorf("bytes should be the same. %v == %v", d1.Bytes(), d2) } @@ -139,7 +139,7 @@ func TestDistancesAndCenterSorting(t *testing.T) { keys2 := SortByDistance(XORKeySpace, keys[2], keys) order := []int{2, 3, 4, 5, 1, 0} for i, o := range order { - if !bytes.Equal(keys[o].Adjusted, keys2[i].Adjusted) { + if !bytes.Equal(keys[o].Bytes, keys2[i].Bytes) { t.Errorf("order is wrong. %d?? %v == %v", o, keys[o], keys2[i]) } } From c498a1d26826512918a8454e34114e5222996c3f Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 17 Sep 2014 02:46:54 -0700 Subject: [PATCH 12/76] refactored keyspace Adjusted -> Bytes --- util.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util.go b/util.go index ded28bb..3aca06f 100644 --- a/util.go +++ b/util.go @@ -25,8 +25,8 @@ func (id ID) equal(other ID) bool { } func (id ID) less(other ID) bool { - a := ks.Key{Space: ks.XORKeySpace, Adjusted: id} - b := ks.Key{Space: ks.XORKeySpace, Adjusted: other} + a := ks.Key{Space: ks.XORKeySpace, Bytes: id} + b := ks.Key{Space: ks.XORKeySpace, Bytes: other} return a.Less(b) } From 706732d07cb019869a1eb576b28ad6e73b81791f Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 4 Oct 2014 19:29:08 +0000 Subject: [PATCH 13/76] fixed keyspace tests on 32 bit systems --- xor_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/xor_test.go b/xor_test.go index d7d83af..7963ea0 100644 --- a/xor_test.go +++ b/xor_test.go @@ -113,8 +113,8 @@ func TestDistancesAndCenterSorting(t *testing.T) { keys[i] = Key{Space: XORKeySpace, Bytes: a} } - cmp := func(a int, b *big.Int) int { - return big.NewInt(int64(a)).Cmp(b) + cmp := func(a int64, b *big.Int) int { + return big.NewInt(a).Cmp(b) } if 0 != cmp(0, keys[2].Distance(keys[3])) { From aea8c8b477a59fc3e4001033892af92b5ddbce55 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 7 Oct 2014 21:29:03 -0700 Subject: [PATCH 14/76] changed logging, in dht and elsewhere - use log.* instead of u.* - use automatic type conversions to .String() (Peer.String() prints nicely, and avoids calling b58 encoding until needed) --- table_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/table_test.go b/table_test.go index 49be52c..cc1cdfb 100644 --- a/table_test.go +++ b/table_test.go @@ -101,7 +101,7 @@ func TestTableFind(t *testing.T) { rt.Update(peers[i]) } - t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) + t.Logf("Searching for peer: '%s'", peers[2]) found := rt.NearestPeer(ConvertPeerID(peers[2].ID)) if !found.ID.Equal(peers[2].ID) { t.Fatalf("Failed to lookup known node...") @@ -118,7 +118,7 @@ func TestTableFindMultiple(t *testing.T) { rt.Update(peers[i]) } - t.Logf("Searching for peer: '%s'", peers[2].ID.Pretty()) + t.Logf("Searching for peer: '%s'", peers[2]) found := rt.NearestPeers(ConvertPeerID(peers[2].ID), 15) if len(found) != 15 { t.Fatalf("Got back different number of peers than we expected.") From 1e9aa6d8a112870d86739b1b8a44b3231b12f6e6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 8 Oct 2014 21:55:50 +0000 Subject: [PATCH 15/76] add in some extra debug logging, and increase routing table latencies --- table.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/table.go b/table.go index 2a0f16d..242546b 100644 --- a/table.go +++ b/table.go @@ -11,6 +11,8 @@ import ( u "github.com/jbenet/go-ipfs/util" ) +var log = u.Logger("table") + // RoutingTable defines the routing table. type RoutingTable struct { @@ -138,6 +140,8 @@ func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { if len(peers) > 0 { return peers[0] } + + log.Error("NearestPeer: Returning nil, table size = %d", rt.Size()) return nil } From 4935b4c77259a9459b62ac5a59ccd8f9c59c6ee1 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 9 Oct 2014 04:48:13 -0700 Subject: [PATCH 16/76] u.DOut -> log.Debug and other logging switches. I kept the u.PErr and u.POut in cli commands, as those do need to write raw output directly. --- table.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/table.go b/table.go index 242546b..45ffb3c 100644 --- a/table.go +++ b/table.go @@ -118,7 +118,7 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe } peerArr = append(peerArr, &pd) if e == nil { - u.POut("list element was nil.\n") + log.Debug("list element was nil.\n") return peerArr } } From 346c167fdec99dfe0beef28e9e03428fb31f8fa3 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 18 Oct 2014 05:52:24 -0700 Subject: [PATCH 17/76] moved XOR keyspace -> util --- xor.go | 13 +++---------- xor_test.go | 31 +++---------------------------- 2 files changed, 6 insertions(+), 38 deletions(-) diff --git a/xor.go b/xor.go index dbb7c68..7159f2c 100644 --- a/xor.go +++ b/xor.go @@ -4,6 +4,8 @@ import ( "bytes" "crypto/sha256" "math/big" + + u "github.com/jbenet/go-ipfs/util" ) // XORKeySpace is a KeySpace which: @@ -33,7 +35,7 @@ func (s *xorKeySpace) Equal(k1, k2 Key) bool { // Distance returns the distance metric in this key space func (s *xorKeySpace) Distance(k1, k2 Key) *big.Int { // XOR the keys - k3 := XOR(k1.Bytes, k2.Bytes) + k3 := u.XOR(k1.Bytes, k2.Bytes) // interpret it as an integer dist := big.NewInt(0).SetBytes(k3) @@ -52,15 +54,6 @@ func (s *xorKeySpace) Less(k1, k2 Key) bool { return true } -// XOR takes two byte slices, XORs them together, returns the resulting slice. -func XOR(a, b []byte) []byte { - c := make([]byte, len(a)) - for i := 0; i < len(a); i++ { - c[i] = a[i] ^ b[i] - } - return c -} - // ZeroPrefixLen returns the number of consecutive zeroes in a byte slice. func ZeroPrefixLen(id []byte) int { for i := 0; i < len(id); i++ { diff --git a/xor_test.go b/xor_test.go index 7963ea0..8db4b92 100644 --- a/xor_test.go +++ b/xor_test.go @@ -4,34 +4,9 @@ import ( "bytes" "math/big" "testing" -) - -func TestXOR(t *testing.T) { - cases := [][3][]byte{ - [3][]byte{ - []byte{0xFF, 0xFF, 0xFF}, - []byte{0xFF, 0xFF, 0xFF}, - []byte{0x00, 0x00, 0x00}, - }, - [3][]byte{ - []byte{0x00, 0xFF, 0x00}, - []byte{0xFF, 0xFF, 0xFF}, - []byte{0xFF, 0x00, 0xFF}, - }, - [3][]byte{ - []byte{0x55, 0x55, 0x55}, - []byte{0x55, 0xFF, 0xAA}, - []byte{0x00, 0xAA, 0xFF}, - }, - } - for _, c := range cases { - r := XOR(c[0], c[1]) - if !bytes.Equal(r, c[2]) { - t.Error("XOR failed") - } - } -} + u "github.com/jbenet/go-ipfs/util" +) func TestPrefixLen(t *testing.T) { cases := [][]byte{ @@ -126,7 +101,7 @@ func TestDistancesAndCenterSorting(t *testing.T) { } d1 := keys[2].Distance(keys[5]) - d2 := XOR(keys[2].Bytes, keys[5].Bytes) + d2 := u.XOR(keys[2].Bytes, keys[5].Bytes) d2 = d2[len(keys[2].Bytes)-len(d1.Bytes()):] // skip empty space for big if !bytes.Equal(d1.Bytes(), d2) { t.Errorf("bytes should be the same. %v == %v", d1.Bytes(), d2) From 4cb779ab6ed0cdec30fdea35b60fe66a71317b09 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 18 Oct 2014 20:00:13 -0700 Subject: [PATCH 18/76] keyspace XOR naming --- util.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/util.go b/util.go index 3aca06f..0299423 100644 --- a/util.go +++ b/util.go @@ -31,11 +31,11 @@ func (id ID) less(other ID) bool { } func xor(a, b ID) ID { - return ID(ks.XOR(a, b)) + return ID(u.XOR(a, b)) } func commonPrefixLen(a, b ID) int { - return ks.ZeroPrefixLen(ks.XOR(a, b)) + return ks.ZeroPrefixLen(u.XOR(a, b)) } // ConvertPeerID creates a DHT ID by hashing a Peer ID (Multihash) From 87a7984bde21dd96cb5a926e1d45b3a81e20f9b4 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 20 Oct 2014 03:26:44 -0700 Subject: [PATCH 19/76] peer.Peer is now an interface ![](http://m.memegen.com/77n7dk.jpg) --- bucket.go | 10 +++++----- table.go | 30 +++++++++++++++--------------- table_test.go | 49 ++++++++++++++++++++++++------------------------- 3 files changed, 44 insertions(+), 45 deletions(-) diff --git a/bucket.go b/bucket.go index 3a9c71f..b114f9e 100644 --- a/bucket.go +++ b/bucket.go @@ -23,7 +23,7 @@ func (b *Bucket) find(id peer.ID) *list.Element { b.lk.RLock() defer b.lk.RUnlock() for e := b.list.Front(); e != nil; e = e.Next() { - if e.Value.(*peer.Peer).ID.Equal(id) { + if e.Value.(peer.Peer).ID().Equal(id) { return e } } @@ -36,18 +36,18 @@ func (b *Bucket) moveToFront(e *list.Element) { b.lk.Unlock() } -func (b *Bucket) pushFront(p *peer.Peer) { +func (b *Bucket) pushFront(p peer.Peer) { b.lk.Lock() b.list.PushFront(p) b.lk.Unlock() } -func (b *Bucket) popBack() *peer.Peer { +func (b *Bucket) popBack() peer.Peer { b.lk.Lock() defer b.lk.Unlock() last := b.list.Back() b.list.Remove(last) - return last.Value.(*peer.Peer) + return last.Value.(peer.Peer) } func (b *Bucket) len() int { @@ -68,7 +68,7 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { newbuck.list = out e := b.list.Front() for e != nil { - peerID := ConvertPeerID(e.Value.(*peer.Peer).ID) + peerID := ConvertPeerID(e.Value.(peer.Peer).ID()) peerCPL := commonPrefixLen(peerID, target) if peerCPL > cpl { cur := e diff --git a/table.go b/table.go index 45ffb3c..6f37e94 100644 --- a/table.go +++ b/table.go @@ -42,10 +42,10 @@ func NewRoutingTable(bucketsize int, localID ID, latency time.Duration) *Routing // Update adds or moves the given peer to the front of its respective bucket // If a peer gets removed from a bucket, it is returned -func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { +func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { rt.tabLock.Lock() defer rt.tabLock.Unlock() - peerID := ConvertPeerID(p.ID) + peerID := ConvertPeerID(p.ID()) cpl := commonPrefixLen(peerID, rt.local) bucketID := cpl @@ -54,7 +54,7 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { } bucket := rt.Buckets[bucketID] - e := bucket.find(p.ID) + e := bucket.find(p.ID()) if e == nil { // New peer, add to bucket if p.GetLatency() > rt.maxLatency { @@ -93,7 +93,7 @@ func (rt *RoutingTable) Update(p *peer.Peer) *peer.Peer { // A helper struct to sort peers by their distance to the local node type peerDistance struct { - p *peer.Peer + p peer.Peer distance ID } @@ -110,8 +110,8 @@ func (p peerSorterArr) Less(a, b int) bool { func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { for e := peerList.Front(); e != nil; e = e.Next() { - p := e.Value.(*peer.Peer) - pID := ConvertPeerID(p.ID) + p := e.Value.(peer.Peer) + pID := ConvertPeerID(p.ID()) pd := peerDistance{ p: p, distance: xor(target, pID), @@ -126,16 +126,16 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe } // Find a specific peer by ID or return nil -func (rt *RoutingTable) Find(id peer.ID) *peer.Peer { +func (rt *RoutingTable) Find(id peer.ID) peer.Peer { srch := rt.NearestPeers(ConvertPeerID(id), 1) - if len(srch) == 0 || !srch[0].ID.Equal(id) { + if len(srch) == 0 || !srch[0].ID().Equal(id) { return nil } return srch[0] } // NearestPeer returns a single peer that is nearest to the given ID -func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { +func (rt *RoutingTable) NearestPeer(id ID) peer.Peer { peers := rt.NearestPeers(id, 1) if len(peers) > 0 { return peers[0] @@ -146,7 +146,7 @@ func (rt *RoutingTable) NearestPeer(id ID) *peer.Peer { } // NearestPeers returns a list of the 'count' closest peers to the given ID -func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { +func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.Peer { rt.tabLock.RLock() defer rt.tabLock.RUnlock() cpl := commonPrefixLen(id, rt.local) @@ -178,7 +178,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []*peer.Peer { // Sort by distance to local peer sort.Sort(peerArr) - var out []*peer.Peer + var out []peer.Peer for i := 0; i < count && i < peerArr.Len(); i++ { out = append(out, peerArr[i].p) } @@ -197,11 +197,11 @@ func (rt *RoutingTable) Size() int { // ListPeers takes a RoutingTable and returns a list of all peers from all buckets in the table. // NOTE: This is potentially unsafe... use at your own risk -func (rt *RoutingTable) ListPeers() []*peer.Peer { - var peers []*peer.Peer +func (rt *RoutingTable) ListPeers() []peer.Peer { + var peers []peer.Peer for _, buck := range rt.Buckets { for e := buck.getIter(); e != nil; e = e.Next() { - peers = append(peers, e.Value.(*peer.Peer)) + peers = append(peers, e.Value.(peer.Peer)) } } return peers @@ -213,6 +213,6 @@ func (rt *RoutingTable) Print() { rt.tabLock.RLock() peers := rt.ListPeers() for i, p := range peers { - fmt.Printf("%d) %s %s\n", i, p.ID.Pretty(), p.GetLatency().String()) + fmt.Printf("%d) %s %s\n", i, p.ID().Pretty(), p.GetLatency().String()) } } diff --git a/table_test.go b/table_test.go index cc1cdfb..2b45d15 100644 --- a/table_test.go +++ b/table_test.go @@ -10,11 +10,10 @@ import ( peer "github.com/jbenet/go-ipfs/peer" ) -func _randPeer() *peer.Peer { - p := new(peer.Peer) - p.ID = make(peer.ID, 16) - crand.Read(p.ID) - return p +func _randPeer() peer.Peer { + id := make(peer.ID, 16) + crand.Read(id) + return peer.WithID(id) } func _randID() ID { @@ -29,25 +28,25 @@ func _randID() ID { func TestBucket(t *testing.T) { b := newBucket() - peers := make([]*peer.Peer, 100) + peers := make([]peer.Peer, 100) for i := 0; i < 100; i++ { peers[i] = _randPeer() b.pushFront(peers[i]) } local := _randPeer() - localID := ConvertPeerID(local.ID) + localID := ConvertPeerID(local.ID()) i := rand.Intn(len(peers)) - e := b.find(peers[i].ID) + e := b.find(peers[i].ID()) if e == nil { t.Errorf("Failed to find peer: %v", peers[i]) } - spl := b.Split(0, ConvertPeerID(local.ID)) + spl := b.Split(0, ConvertPeerID(local.ID())) llist := b.list for e := llist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(*peer.Peer).ID) + p := ConvertPeerID(e.Value.(peer.Peer).ID()) cpl := commonPrefixLen(p, localID) if cpl > 0 { t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") @@ -56,7 +55,7 @@ func TestBucket(t *testing.T) { rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(*peer.Peer).ID) + p := ConvertPeerID(e.Value.(peer.Peer).ID()) cpl := commonPrefixLen(p, localID) if cpl == 0 { t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") @@ -67,9 +66,9 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) - peers := make([]*peer.Peer, 100) + peers := make([]peer.Peer, 100) for i := 0; i < 100; i++ { peers[i] = _randPeer() } @@ -93,33 +92,33 @@ func TestTableUpdate(t *testing.T) { func TestTableFind(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) - peers := make([]*peer.Peer, 100) + peers := make([]peer.Peer, 100) for i := 0; i < 5; i++ { peers[i] = _randPeer() rt.Update(peers[i]) } t.Logf("Searching for peer: '%s'", peers[2]) - found := rt.NearestPeer(ConvertPeerID(peers[2].ID)) - if !found.ID.Equal(peers[2].ID) { + found := rt.NearestPeer(ConvertPeerID(peers[2].ID())) + if !found.ID().Equal(peers[2].ID()) { t.Fatalf("Failed to lookup known node...") } } func TestTableFindMultiple(t *testing.T) { local := _randPeer() - rt := NewRoutingTable(20, ConvertPeerID(local.ID), time.Hour) + rt := NewRoutingTable(20, ConvertPeerID(local.ID()), time.Hour) - peers := make([]*peer.Peer, 100) + peers := make([]peer.Peer, 100) for i := 0; i < 18; i++ { peers[i] = _randPeer() rt.Update(peers[i]) } t.Logf("Searching for peer: '%s'", peers[2]) - found := rt.NearestPeers(ConvertPeerID(peers[2].ID), 15) + found := rt.NearestPeers(ConvertPeerID(peers[2].ID()), 15) if len(found) != 15 { t.Fatalf("Got back different number of peers than we expected.") } @@ -131,7 +130,7 @@ func TestTableFindMultiple(t *testing.T) { func TestTableMultithreaded(t *testing.T) { local := peer.ID("localPeer") tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) - var peers []*peer.Peer + var peers []peer.Peer for i := 0; i < 500; i++ { peers = append(peers, _randPeer()) } @@ -156,7 +155,7 @@ func TestTableMultithreaded(t *testing.T) { go func() { for i := 0; i < 1000; i++ { n := rand.Intn(len(peers)) - tab.Find(peers[n].ID) + tab.Find(peers[n].ID()) } done <- struct{}{} }() @@ -170,7 +169,7 @@ func BenchmarkUpdates(b *testing.B) { local := ConvertKey("localKey") tab := NewRoutingTable(20, local, time.Hour) - var peers []*peer.Peer + var peers []peer.Peer for i := 0; i < b.N; i++ { peers = append(peers, _randPeer()) } @@ -186,7 +185,7 @@ func BenchmarkFinds(b *testing.B) { local := ConvertKey("localKey") tab := NewRoutingTable(20, local, time.Hour) - var peers []*peer.Peer + var peers []peer.Peer for i := 0; i < b.N; i++ { peers = append(peers, _randPeer()) tab.Update(peers[i]) @@ -194,6 +193,6 @@ func BenchmarkFinds(b *testing.B) { b.StartTimer() for i := 0; i < b.N; i++ { - tab.Find(peers[i].ID) + tab.Find(peers[i].ID()) } } From 564b0ac1b12024b7226110d4806e7f3f4f4b1e71 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 22 Oct 2014 15:08:32 -0700 Subject: [PATCH 20/76] fix for #141, routing table segmentation --- table.go | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/table.go b/table.go index 6f37e94..5c3e048 100644 --- a/table.go +++ b/table.go @@ -65,18 +65,10 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { // Are we past the max bucket size? if bucket.len() > rt.bucketsize { + // If this bucket is the rightmost bucket, and its full + // we need to split it and create a new bucket if bucketID == len(rt.Buckets)-1 { - newBucket := bucket.Split(bucketID, rt.local) - rt.Buckets = append(rt.Buckets, newBucket) - if newBucket.len() > rt.bucketsize { - // TODO: This is a very rare and annoying case - panic("Case not handled.") - } - - // If all elements were on left side of split... - if bucket.len() > rt.bucketsize { - return bucket.popBack() - } + return rt.nextBucket() } else { // If the bucket cant split kick out least active node return bucket.popBack() @@ -91,6 +83,22 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { return nil } +func (rt *RoutingTable) nextBucket() peer.Peer { + bucket := rt.Buckets[len(rt.Buckets)-1] + newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) + rt.Buckets = append(rt.Buckets, newBucket) + if newBucket.len() > rt.bucketsize { + // TODO: This is a very rare and annoying case + return rt.nextBucket() + } + + // If all elements were on left side of split... + if bucket.len() > rt.bucketsize { + return bucket.popBack() + } + return nil +} + // A helper struct to sort peers by their distance to the local node type peerDistance struct { p peer.Peer From 6344102127e283d74b04b7c422c14107b93f7434 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 24 Oct 2014 18:32:28 -0700 Subject: [PATCH 21/76] rewrite findpeer and other dht tweaks --- table.go | 1 - 1 file changed, 1 deletion(-) diff --git a/table.go b/table.go index 5c3e048..7b9d88f 100644 --- a/table.go +++ b/table.go @@ -88,7 +88,6 @@ func (rt *RoutingTable) nextBucket() peer.Peer { newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) rt.Buckets = append(rt.Buckets, newBucket) if newBucket.len() > rt.bucketsize { - // TODO: This is a very rare and annoying case return rt.nextBucket() } From e50b5e73ff26a1351eba0f3703d71af7b082c705 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 25 Oct 2014 03:17:14 -0700 Subject: [PATCH 22/76] go-vet friendly codebase - distinguish log.Error and log.Errorf functions - Initialize structs with field names - A bit of unreachable code (defers) --- table.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/table.go b/table.go index 7b9d88f..491a06c 100644 --- a/table.go +++ b/table.go @@ -125,7 +125,7 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe } peerArr = append(peerArr, &pd) if e == nil { - log.Debug("list element was nil.\n") + log.Debug("list element was nil") return peerArr } } @@ -148,7 +148,7 @@ func (rt *RoutingTable) NearestPeer(id ID) peer.Peer { return peers[0] } - log.Error("NearestPeer: Returning nil, table size = %d", rt.Size()) + log.Errorf("NearestPeer: Returning nil, table size = %d", rt.Size()) return nil } From 2cc6e0b9da8298f622d798f834f9566d6eb98579 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 26 Oct 2014 08:01:33 +0000 Subject: [PATCH 23/76] benchmark secure channel --- table_test.go | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/table_test.go b/table_test.go index 2b45d15..cda6906 100644 --- a/table_test.go +++ b/table_test.go @@ -7,16 +7,12 @@ import ( "testing" "time" + tu "github.com/jbenet/go-ipfs/util/testutil" + peer "github.com/jbenet/go-ipfs/peer" ) -func _randPeer() peer.Peer { - id := make(peer.ID, 16) - crand.Read(id) - return peer.WithID(id) -} - -func _randID() ID { +func RandID() ID { buf := make([]byte, 16) crand.Read(buf) @@ -30,11 +26,11 @@ func TestBucket(t *testing.T) { peers := make([]peer.Peer, 100) for i := 0; i < 100; i++ { - peers[i] = _randPeer() + peers[i] = tu.RandPeer() b.pushFront(peers[i]) } - local := _randPeer() + local := tu.RandPeer() localID := ConvertPeerID(local.ID()) i := rand.Intn(len(peers)) @@ -65,12 +61,12 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { - local := _randPeer() + local := tu.RandPeer() rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) peers := make([]peer.Peer, 100) for i := 0; i < 100; i++ { - peers[i] = _randPeer() + peers[i] = tu.RandPeer() } // Testing Update @@ -82,7 +78,7 @@ func TestTableUpdate(t *testing.T) { } for i := 0; i < 100; i++ { - id := _randID() + id := RandID() ret := rt.NearestPeers(id, 5) if len(ret) == 0 { t.Fatal("Failed to find node near ID.") @@ -91,12 +87,12 @@ func TestTableUpdate(t *testing.T) { } func TestTableFind(t *testing.T) { - local := _randPeer() + local := tu.RandPeer() rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) peers := make([]peer.Peer, 100) for i := 0; i < 5; i++ { - peers[i] = _randPeer() + peers[i] = tu.RandPeer() rt.Update(peers[i]) } @@ -108,12 +104,12 @@ func TestTableFind(t *testing.T) { } func TestTableFindMultiple(t *testing.T) { - local := _randPeer() + local := tu.RandPeer() rt := NewRoutingTable(20, ConvertPeerID(local.ID()), time.Hour) peers := make([]peer.Peer, 100) for i := 0; i < 18; i++ { - peers[i] = _randPeer() + peers[i] = tu.RandPeer() rt.Update(peers[i]) } @@ -132,7 +128,7 @@ func TestTableMultithreaded(t *testing.T) { tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) var peers []peer.Peer for i := 0; i < 500; i++ { - peers = append(peers, _randPeer()) + peers = append(peers, tu.RandPeer()) } done := make(chan struct{}) @@ -171,7 +167,7 @@ func BenchmarkUpdates(b *testing.B) { var peers []peer.Peer for i := 0; i < b.N; i++ { - peers = append(peers, _randPeer()) + peers = append(peers, tu.RandPeer()) } b.StartTimer() @@ -187,7 +183,7 @@ func BenchmarkFinds(b *testing.B) { var peers []peer.Peer for i := 0; i < b.N; i++ { - peers = append(peers, _randPeer()) + peers = append(peers, tu.RandPeer()) tab.Update(peers[i]) } From 842efb9f31db1ac35405784d3a9dfa3e686562bd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 8 Nov 2014 13:43:43 -0800 Subject: [PATCH 24/76] write a few package doc strings to improve look of godoc --- bucket.go | 2 +- table.go | 3 ++- table_test.go | 2 +- util.go | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/bucket.go b/bucket.go index b114f9e..51f5249 100644 --- a/bucket.go +++ b/bucket.go @@ -1,4 +1,4 @@ -package dht +package kbucket import ( "container/list" diff --git a/table.go b/table.go index 491a06c..c144c19 100644 --- a/table.go +++ b/table.go @@ -1,4 +1,5 @@ -package dht +// package kbucket implements a kademlia 'k-bucket' routing table. +package kbucket import ( "container/list" diff --git a/table_test.go b/table_test.go index cda6906..85fc387 100644 --- a/table_test.go +++ b/table_test.go @@ -1,4 +1,4 @@ -package dht +package kbucket import ( crand "crypto/rand" diff --git a/util.go b/util.go index 0299423..4adac04 100644 --- a/util.go +++ b/util.go @@ -1,4 +1,4 @@ -package dht +package kbucket import ( "bytes" From 140df99dee4f58dbe41bca8109a4e7509368b13e Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Fri, 19 Dec 2014 12:19:56 -0800 Subject: [PATCH 25/76] peer change: peer.Peer -> peer.ID this is a major refactor of the entire codebase it changes the monolithic peer.Peer into using a peer.ID and a peer.Peerstore. Other changes: - removed handshake3. - testutil vastly simplified peer - secio bugfix + debugging logs - testutil: RandKeyPair - backpressure bugfix: w.o.w. - peer: added hex enc/dec - peer: added a PeerInfo struct PeerInfo is a small struct used to pass around a peer with a set of addresses and keys. This is not meant to be a complete view of the system, but rather to model updates to the peerstore. It is used by things like the routing system. - updated peer/queue + peerset - latency metrics - testutil: use crand for PeerID gen RandPeerID generates random "valid" peer IDs. it does not NEED to generate keys because it is as if we lost the key right away. fine to read some randomness and hash it. to generate proper keys and an ID, use: sk, pk, _ := testutil.RandKeyPair() id, _ := peer.IDFromPublicKey(pk) Also added RandPeerIDFatal helper - removed old spipe - updated seccat - core: cleanup initIdentity - removed old getFromPeerList --- bucket.go | 10 +++--- table.go | 52 ++++++++++++++++-------------- table_test.go | 88 ++++++++++++++++++++++++--------------------------- util.go | 2 +- 4 files changed, 76 insertions(+), 76 deletions(-) diff --git a/bucket.go b/bucket.go index 51f5249..2fa5586 100644 --- a/bucket.go +++ b/bucket.go @@ -23,7 +23,7 @@ func (b *Bucket) find(id peer.ID) *list.Element { b.lk.RLock() defer b.lk.RUnlock() for e := b.list.Front(); e != nil; e = e.Next() { - if e.Value.(peer.Peer).ID().Equal(id) { + if e.Value.(peer.ID) == id { return e } } @@ -36,18 +36,18 @@ func (b *Bucket) moveToFront(e *list.Element) { b.lk.Unlock() } -func (b *Bucket) pushFront(p peer.Peer) { +func (b *Bucket) pushFront(p peer.ID) { b.lk.Lock() b.list.PushFront(p) b.lk.Unlock() } -func (b *Bucket) popBack() peer.Peer { +func (b *Bucket) popBack() peer.ID { b.lk.Lock() defer b.lk.Unlock() last := b.list.Back() b.list.Remove(last) - return last.Value.(peer.Peer) + return last.Value.(peer.ID) } func (b *Bucket) len() int { @@ -68,7 +68,7 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { newbuck.list = out e := b.list.Front() for e != nil { - peerID := ConvertPeerID(e.Value.(peer.Peer).ID()) + peerID := ConvertPeerID(e.Value.(peer.ID)) peerCPL := commonPrefixLen(peerID, target) if peerCPL > cpl { cur := e diff --git a/table.go b/table.go index c144c19..da4c6e7 100644 --- a/table.go +++ b/table.go @@ -23,6 +23,9 @@ type RoutingTable struct { // Blanket lock, refine later for better performance tabLock sync.RWMutex + // latency metrics + metrics peer.Metrics + // Maximum acceptable latency for peers in this cluster maxLatency time.Duration @@ -32,21 +35,22 @@ type RoutingTable struct { } // NewRoutingTable creates a new routing table with a given bucketsize, local ID, and latency tolerance. -func NewRoutingTable(bucketsize int, localID ID, latency time.Duration) *RoutingTable { +func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m peer.Metrics) *RoutingTable { rt := new(RoutingTable) rt.Buckets = []*Bucket{newBucket()} rt.bucketsize = bucketsize rt.local = localID rt.maxLatency = latency + rt.metrics = m return rt } // Update adds or moves the given peer to the front of its respective bucket // If a peer gets removed from a bucket, it is returned -func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { +func (rt *RoutingTable) Update(p peer.ID) peer.ID { rt.tabLock.Lock() defer rt.tabLock.Unlock() - peerID := ConvertPeerID(p.ID()) + peerID := ConvertPeerID(p) cpl := commonPrefixLen(peerID, rt.local) bucketID := cpl @@ -55,12 +59,12 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { } bucket := rt.Buckets[bucketID] - e := bucket.find(p.ID()) + e := bucket.find(p) if e == nil { // New peer, add to bucket - if p.GetLatency() > rt.maxLatency { + if rt.metrics.LatencyEWMA(p) > rt.maxLatency { // Connection doesnt meet requirements, skip! - return nil + return "" } bucket.pushFront(p) @@ -75,16 +79,16 @@ func (rt *RoutingTable) Update(p peer.Peer) peer.Peer { return bucket.popBack() } } - return nil + return "" } // If the peer is already in the table, move it to the front. // This signifies that it it "more active" and the less active nodes // Will as a result tend towards the back of the list bucket.moveToFront(e) - return nil + return "" } -func (rt *RoutingTable) nextBucket() peer.Peer { +func (rt *RoutingTable) nextBucket() peer.ID { bucket := rt.Buckets[len(rt.Buckets)-1] newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) rt.Buckets = append(rt.Buckets, newBucket) @@ -96,12 +100,12 @@ func (rt *RoutingTable) nextBucket() peer.Peer { if bucket.len() > rt.bucketsize { return bucket.popBack() } - return nil + return "" } // A helper struct to sort peers by their distance to the local node type peerDistance struct { - p peer.Peer + p peer.ID distance ID } @@ -118,8 +122,8 @@ func (p peerSorterArr) Less(a, b int) bool { func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { for e := peerList.Front(); e != nil; e = e.Next() { - p := e.Value.(peer.Peer) - pID := ConvertPeerID(p.ID()) + p := e.Value.(peer.ID) + pID := ConvertPeerID(p) pd := peerDistance{ p: p, distance: xor(target, pID), @@ -134,27 +138,27 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe } // Find a specific peer by ID or return nil -func (rt *RoutingTable) Find(id peer.ID) peer.Peer { +func (rt *RoutingTable) Find(id peer.ID) peer.ID { srch := rt.NearestPeers(ConvertPeerID(id), 1) - if len(srch) == 0 || !srch[0].ID().Equal(id) { - return nil + if len(srch) == 0 || srch[0] != id { + return "" } return srch[0] } // NearestPeer returns a single peer that is nearest to the given ID -func (rt *RoutingTable) NearestPeer(id ID) peer.Peer { +func (rt *RoutingTable) NearestPeer(id ID) peer.ID { peers := rt.NearestPeers(id, 1) if len(peers) > 0 { return peers[0] } log.Errorf("NearestPeer: Returning nil, table size = %d", rt.Size()) - return nil + return "" } // NearestPeers returns a list of the 'count' closest peers to the given ID -func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.Peer { +func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { rt.tabLock.RLock() defer rt.tabLock.RUnlock() cpl := commonPrefixLen(id, rt.local) @@ -186,7 +190,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.Peer { // Sort by distance to local peer sort.Sort(peerArr) - var out []peer.Peer + var out []peer.ID for i := 0; i < count && i < peerArr.Len(); i++ { out = append(out, peerArr[i].p) } @@ -205,11 +209,11 @@ func (rt *RoutingTable) Size() int { // ListPeers takes a RoutingTable and returns a list of all peers from all buckets in the table. // NOTE: This is potentially unsafe... use at your own risk -func (rt *RoutingTable) ListPeers() []peer.Peer { - var peers []peer.Peer +func (rt *RoutingTable) ListPeers() []peer.ID { + var peers []peer.ID for _, buck := range rt.Buckets { for e := buck.getIter(); e != nil; e = e.Next() { - peers = append(peers, e.Value.(peer.Peer)) + peers = append(peers, e.Value.(peer.ID)) } } return peers @@ -221,6 +225,6 @@ func (rt *RoutingTable) Print() { rt.tabLock.RLock() peers := rt.ListPeers() for i, p := range peers { - fmt.Printf("%d) %s %s\n", i, p.ID().Pretty(), p.GetLatency().String()) + fmt.Printf("%d) %s %s\n", i, p.Pretty(), rt.metrics.LatencyEWMA(p).String()) } } diff --git a/table_test.go b/table_test.go index 85fc387..db93ddf 100644 --- a/table_test.go +++ b/table_test.go @@ -1,8 +1,6 @@ package kbucket import ( - crand "crypto/rand" - "crypto/sha256" "math/rand" "testing" "time" @@ -12,37 +10,29 @@ import ( peer "github.com/jbenet/go-ipfs/peer" ) -func RandID() ID { - buf := make([]byte, 16) - crand.Read(buf) - - hash := sha256.Sum256(buf) - return ID(hash[:]) -} - // Test basic features of the bucket struct func TestBucket(t *testing.T) { b := newBucket() - peers := make([]peer.Peer, 100) + peers := make([]peer.ID, 100) for i := 0; i < 100; i++ { - peers[i] = tu.RandPeer() + peers[i] = tu.RandPeerIDFatal(t) b.pushFront(peers[i]) } - local := tu.RandPeer() - localID := ConvertPeerID(local.ID()) + local := tu.RandPeerIDFatal(t) + localID := ConvertPeerID(local) i := rand.Intn(len(peers)) - e := b.find(peers[i].ID()) + e := b.find(peers[i]) if e == nil { t.Errorf("Failed to find peer: %v", peers[i]) } - spl := b.Split(0, ConvertPeerID(local.ID())) + spl := b.Split(0, ConvertPeerID(local)) llist := b.list for e := llist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(peer.Peer).ID()) + p := ConvertPeerID(e.Value.(peer.ID)) cpl := commonPrefixLen(p, localID) if cpl > 0 { t.Fatalf("Split failed. found id with cpl > 0 in 0 bucket") @@ -51,7 +41,7 @@ func TestBucket(t *testing.T) { rlist := spl.list for e := rlist.Front(); e != nil; e = e.Next() { - p := ConvertPeerID(e.Value.(peer.Peer).ID()) + p := ConvertPeerID(e.Value.(peer.ID)) cpl := commonPrefixLen(p, localID) if cpl == 0 { t.Fatalf("Split failed. found id with cpl == 0 in non 0 bucket") @@ -61,24 +51,25 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { - local := tu.RandPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) + local := tu.RandPeerIDFatal(t) + m := peer.NewMetrics() + rt := NewRoutingTable(10, ConvertPeerID(local), time.Hour, m) - peers := make([]peer.Peer, 100) + peers := make([]peer.ID, 100) for i := 0; i < 100; i++ { - peers[i] = tu.RandPeer() + peers[i] = tu.RandPeerIDFatal(t) } // Testing Update for i := 0; i < 10000; i++ { p := rt.Update(peers[rand.Intn(len(peers))]) - if p != nil { + if p != "" { //t.Log("evicted peer.") } } for i := 0; i < 100; i++ { - id := RandID() + id := ConvertPeerID(tu.RandPeerIDFatal(t)) ret := rt.NearestPeers(id, 5) if len(ret) == 0 { t.Fatal("Failed to find node near ID.") @@ -87,34 +78,36 @@ func TestTableUpdate(t *testing.T) { } func TestTableFind(t *testing.T) { - local := tu.RandPeer() - rt := NewRoutingTable(10, ConvertPeerID(local.ID()), time.Hour) + local := tu.RandPeerIDFatal(t) + m := peer.NewMetrics() + rt := NewRoutingTable(10, ConvertPeerID(local), time.Hour, m) - peers := make([]peer.Peer, 100) + peers := make([]peer.ID, 100) for i := 0; i < 5; i++ { - peers[i] = tu.RandPeer() + peers[i] = tu.RandPeerIDFatal(t) rt.Update(peers[i]) } t.Logf("Searching for peer: '%s'", peers[2]) - found := rt.NearestPeer(ConvertPeerID(peers[2].ID())) - if !found.ID().Equal(peers[2].ID()) { + found := rt.NearestPeer(ConvertPeerID(peers[2])) + if !(found == peers[2]) { t.Fatalf("Failed to lookup known node...") } } func TestTableFindMultiple(t *testing.T) { - local := tu.RandPeer() - rt := NewRoutingTable(20, ConvertPeerID(local.ID()), time.Hour) + local := tu.RandPeerIDFatal(t) + m := peer.NewMetrics() + rt := NewRoutingTable(20, ConvertPeerID(local), time.Hour, m) - peers := make([]peer.Peer, 100) + peers := make([]peer.ID, 100) for i := 0; i < 18; i++ { - peers[i] = tu.RandPeer() + peers[i] = tu.RandPeerIDFatal(t) rt.Update(peers[i]) } t.Logf("Searching for peer: '%s'", peers[2]) - found := rt.NearestPeers(ConvertPeerID(peers[2].ID()), 15) + found := rt.NearestPeers(ConvertPeerID(peers[2]), 15) if len(found) != 15 { t.Fatalf("Got back different number of peers than we expected.") } @@ -125,10 +118,11 @@ func TestTableFindMultiple(t *testing.T) { // and set GOMAXPROCS above 1 func TestTableMultithreaded(t *testing.T) { local := peer.ID("localPeer") - tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour) - var peers []peer.Peer + m := peer.NewMetrics() + tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour, m) + var peers []peer.ID for i := 0; i < 500; i++ { - peers = append(peers, tu.RandPeer()) + peers = append(peers, tu.RandPeerIDFatal(t)) } done := make(chan struct{}) @@ -151,7 +145,7 @@ func TestTableMultithreaded(t *testing.T) { go func() { for i := 0; i < 1000; i++ { n := rand.Intn(len(peers)) - tab.Find(peers[n].ID()) + tab.Find(peers[n]) } done <- struct{}{} }() @@ -163,11 +157,12 @@ func TestTableMultithreaded(t *testing.T) { func BenchmarkUpdates(b *testing.B) { b.StopTimer() local := ConvertKey("localKey") - tab := NewRoutingTable(20, local, time.Hour) + m := peer.NewMetrics() + tab := NewRoutingTable(20, local, time.Hour, m) - var peers []peer.Peer + var peers []peer.ID for i := 0; i < b.N; i++ { - peers = append(peers, tu.RandPeer()) + peers = append(peers, tu.RandPeerIDFatal(b)) } b.StartTimer() @@ -179,16 +174,17 @@ func BenchmarkUpdates(b *testing.B) { func BenchmarkFinds(b *testing.B) { b.StopTimer() local := ConvertKey("localKey") - tab := NewRoutingTable(20, local, time.Hour) + m := peer.NewMetrics() + tab := NewRoutingTable(20, local, time.Hour, m) - var peers []peer.Peer + var peers []peer.ID for i := 0; i < b.N; i++ { - peers = append(peers, tu.RandPeer()) + peers = append(peers, tu.RandPeerIDFatal(b)) tab.Update(peers[i]) } b.StartTimer() for i := 0; i < b.N; i++ { - tab.Find(peers[i].ID()) + tab.Find(peers[i]) } } diff --git a/util.go b/util.go index 4adac04..2d06b5f 100644 --- a/util.go +++ b/util.go @@ -40,7 +40,7 @@ func commonPrefixLen(a, b ID) int { // ConvertPeerID creates a DHT ID by hashing a Peer ID (Multihash) func ConvertPeerID(id peer.ID) ID { - hash := sha256.Sum256(id) + hash := sha256.Sum256([]byte(id)) return hash[:] } From 8bdc248ee986e665d9275fa34850b4624dbd754a Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 18:54:23 -0800 Subject: [PATCH 26/76] dht bugfix: unlock on print --- table.go | 1 + 1 file changed, 1 insertion(+) diff --git a/table.go b/table.go index da4c6e7..aaaa573 100644 --- a/table.go +++ b/table.go @@ -227,4 +227,5 @@ func (rt *RoutingTable) Print() { for i, p := range peers { fmt.Printf("%d) %s %s\n", i, p.Pretty(), rt.metrics.LatencyEWMA(p).String()) } + rt.tabLock.RUnlock() } From 53d644e2542593a71a180317533dd4a638e3c097 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Tue, 23 Dec 2014 22:05:55 -0800 Subject: [PATCH 27/76] routing table: better printing (see bkts) --- table.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/table.go b/table.go index aaaa573..bed7447 100644 --- a/table.go +++ b/table.go @@ -223,9 +223,16 @@ func (rt *RoutingTable) ListPeers() []peer.ID { func (rt *RoutingTable) Print() { fmt.Printf("Routing Table, bs = %d, Max latency = %d\n", rt.bucketsize, rt.maxLatency) rt.tabLock.RLock() - peers := rt.ListPeers() - for i, p := range peers { - fmt.Printf("%d) %s %s\n", i, p.Pretty(), rt.metrics.LatencyEWMA(p).String()) + + for i, b := range rt.Buckets { + fmt.Printf("\tbucket: %d\n", i) + + b.lk.RLock() + for e := b.list.Front(); e != nil; e = e.Next() { + p := e.Value.(peer.ID) + fmt.Printf("\t\t- %s %s\n", p.Pretty(), rt.metrics.LatencyEWMA(p).String()) + } + b.lk.RUnlock() } rt.tabLock.RUnlock() } From af02bbaf657119708505ed3e5a4e727937f35266 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 14 Dec 2014 00:50:49 +0000 Subject: [PATCH 28/76] rewrite of provides to better select peers to send RPCs to refactor test peer creation to be deterministic and reliable a bit of cleanup trying to figure out TestGetFailure add test to verify deterministic peer creation switch put RPC over to use getClosestPeers rm 0xDEADC0DE fix queries not searching peer if its not actually closer --- sorting.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ table.go | 35 -------------------------------- 2 files changed, 59 insertions(+), 35 deletions(-) create mode 100644 sorting.go diff --git a/sorting.go b/sorting.go new file mode 100644 index 0000000..a3a6876 --- /dev/null +++ b/sorting.go @@ -0,0 +1,59 @@ +package kbucket + +import ( + "container/list" + peer "github.com/jbenet/go-ipfs/peer" + "sort" +) + +// A helper struct to sort peers by their distance to the local node +type peerDistance struct { + p peer.ID + distance ID +} + +// peerSorterArr implements sort.Interface to sort peers by xor distance +type peerSorterArr []*peerDistance + +func (p peerSorterArr) Len() int { return len(p) } +func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] } +func (p peerSorterArr) Less(a, b int) bool { + return p[a].distance.less(p[b].distance) +} + +// + +func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { + for e := peerList.Front(); e != nil; e = e.Next() { + p := e.Value.(peer.ID) + pID := ConvertPeerID(p) + pd := peerDistance{ + p: p, + distance: xor(target, pID), + } + peerArr = append(peerArr, &pd) + if e == nil { + log.Debug("list element was nil") + return peerArr + } + } + return peerArr +} + +func SortClosestPeers(peers []peer.ID, target ID) []peer.ID { + var psarr peerSorterArr + for _, p := range peers { + pID := ConvertPeerID(p) + pd := &peerDistance{ + p: p, + distance: xor(target, pID), + } + psarr = append(psarr, pd) + } + sort.Sort(psarr) + var out []peer.ID + for _, p := range psarr { + out = append(out, p.p) + } + return out +} diff --git a/table.go b/table.go index bed7447..90ba655 100644 --- a/table.go +++ b/table.go @@ -2,7 +2,6 @@ package kbucket import ( - "container/list" "fmt" "sort" "sync" @@ -103,40 +102,6 @@ func (rt *RoutingTable) nextBucket() peer.ID { return "" } -// A helper struct to sort peers by their distance to the local node -type peerDistance struct { - p peer.ID - distance ID -} - -// peerSorterArr implements sort.Interface to sort peers by xor distance -type peerSorterArr []*peerDistance - -func (p peerSorterArr) Len() int { return len(p) } -func (p peerSorterArr) Swap(a, b int) { p[a], p[b] = p[b], p[a] } -func (p peerSorterArr) Less(a, b int) bool { - return p[a].distance.less(p[b].distance) -} - -// - -func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) peerSorterArr { - for e := peerList.Front(); e != nil; e = e.Next() { - p := e.Value.(peer.ID) - pID := ConvertPeerID(p) - pd := peerDistance{ - p: p, - distance: xor(target, pID), - } - peerArr = append(peerArr, &pd) - if e == nil { - log.Debug("list element was nil") - return peerArr - } - } - return peerArr -} - // Find a specific peer by ID or return nil func (rt *RoutingTable) Find(id peer.ID) peer.ID { srch := rt.NearestPeers(ConvertPeerID(id), 1) From e26510cee6f251d5eb72f7c0a7d64f5b9ec1c608 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 05:43:56 -0800 Subject: [PATCH 29/76] introducing p2p pkg I think it's time to move a lot of the peer-to-peer networking but-not-ipfs-specific things into its own package: p2p. This could in the future be split off into its own library. The first thing to go is the peer. --- bucket.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bucket.go b/bucket.go index 2fa5586..e158f70 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) // Bucket holds a list of peers. diff --git a/table.go b/table.go index 90ba655..62bfa06 100644 --- a/table.go +++ b/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" u "github.com/jbenet/go-ipfs/util" ) diff --git a/table_test.go b/table_test.go index db93ddf..3e44cf6 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/jbenet/go-ipfs/util/testutil" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index 2d06b5f..80c08de 100644 --- a/util.go +++ b/util.go @@ -5,7 +5,7 @@ import ( "crypto/sha256" "errors" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" ks "github.com/jbenet/go-ipfs/routing/keyspace" u "github.com/jbenet/go-ipfs/util" ) From fde200d81b1fb7a5cbc1075f1aaa3e2f9bc275a7 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 29 Dec 2014 05:45:55 -0800 Subject: [PATCH 30/76] crypto -> p2p/crypto The crypto package moves into p2p. Nothing in it so far is ipfs specific; everything is p2p-general. --- sorting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorting.go b/sorting.go index a3a6876..7995b39 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "github.com/jbenet/go-ipfs/peer" + peer "github.com/jbenet/go-ipfs/p2p/peer" "sort" ) From 76b4cb5b04f6ab7611af96d5eeafba0c06000468 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 24 Jan 2015 08:52:01 -0800 Subject: [PATCH 31/76] routing/dht: adjust routing table on peer conn/disc --- bucket.go | 10 ++++++++++ table.go | 17 +++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/bucket.go b/bucket.go index e158f70..7d4f87c 100644 --- a/bucket.go +++ b/bucket.go @@ -30,6 +30,16 @@ func (b *Bucket) find(id peer.ID) *list.Element { return nil } +func (b *Bucket) remove(id peer.ID) { + b.lk.RLock() + defer b.lk.RUnlock() + for e := b.list.Front(); e != nil; e = e.Next() { + if e.Value.(peer.ID) == id { + b.list.Remove(e) + } + } +} + func (b *Bucket) moveToFront(e *list.Element) { b.lk.Lock() b.list.MoveToFront(e) diff --git a/table.go b/table.go index 62bfa06..59b8128 100644 --- a/table.go +++ b/table.go @@ -87,6 +87,23 @@ func (rt *RoutingTable) Update(p peer.ID) peer.ID { return "" } +// Remove deletes a peer from the routing table. This is to be used +// when we are sure a node has disconnected completely. +func (rt *RoutingTable) Remove(p peer.ID) { + rt.tabLock.Lock() + defer rt.tabLock.Unlock() + peerID := ConvertPeerID(p) + cpl := commonPrefixLen(peerID, rt.local) + + bucketID := cpl + if bucketID >= len(rt.Buckets) { + bucketID = len(rt.Buckets) - 1 + } + + bucket := rt.Buckets[bucketID] + bucket.remove(p) +} + func (rt *RoutingTable) nextBucket() peer.ID { bucket := rt.Buckets[len(rt.Buckets)-1] newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) From b819b92ec4010102e05b0219c723e9cc4f6276e6 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 24 Jan 2015 09:45:07 -0800 Subject: [PATCH 32/76] dht/kbucket: race condition fix --- bucket.go | 15 +++++++++++---- table.go | 6 +++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/bucket.go b/bucket.go index e158f70..32bc863 100644 --- a/bucket.go +++ b/bucket.go @@ -19,6 +19,17 @@ func newBucket() *Bucket { return b } +func (b *Bucket) Peers() []peer.ID { + b.lk.RLock() + defer b.lk.RUnlock() + ps := make([]peer.ID, 0, b.list.Len()) + for e := b.list.Front(); e != nil; e = e.Next() { + id := e.Value.(peer.ID) + ps = append(ps, id) + } + return ps +} + func (b *Bucket) find(id peer.ID) *list.Element { b.lk.RLock() defer b.lk.RUnlock() @@ -81,7 +92,3 @@ func (b *Bucket) Split(cpl int, target ID) *Bucket { } return newbuck } - -func (b *Bucket) getIter() *list.Element { - return b.list.Front() -} diff --git a/table.go b/table.go index 62bfa06..4ec35b5 100644 --- a/table.go +++ b/table.go @@ -176,11 +176,11 @@ func (rt *RoutingTable) Size() int { // NOTE: This is potentially unsafe... use at your own risk func (rt *RoutingTable) ListPeers() []peer.ID { var peers []peer.ID + rt.tabLock.RLock() for _, buck := range rt.Buckets { - for e := buck.getIter(); e != nil; e = e.Next() { - peers = append(peers, e.Value.(peer.ID)) - } + peers = append(peers, buck.Peers()...) } + rt.tabLock.RUnlock() return peers } From c0f7104f0c83c2e1190427f5bfcdff3ad17f0240 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Mon, 26 Jan 2015 19:12:12 -0800 Subject: [PATCH 33/76] dropped down log.Errors --- table.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/table.go b/table.go index 8bc825f..dc5fb3d 100644 --- a/table.go +++ b/table.go @@ -135,7 +135,7 @@ func (rt *RoutingTable) NearestPeer(id ID) peer.ID { return peers[0] } - log.Errorf("NearestPeer: Returning nil, table size = %d", rt.Size()) + log.Debugf("NearestPeer: Returning nil, table size = %d", rt.Size()) return "" } From b2a3efb7accaff1fdbfc05144d6181319eea16c7 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 5 Feb 2015 04:53:23 -0800 Subject: [PATCH 34/76] kbucket: fix data race --- bucket.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bucket.go b/bucket.go index f6fcc0b..a8c6a07 100644 --- a/bucket.go +++ b/bucket.go @@ -42,8 +42,8 @@ func (b *Bucket) find(id peer.ID) *list.Element { } func (b *Bucket) remove(id peer.ID) { - b.lk.RLock() - defer b.lk.RUnlock() + b.lk.Lock() + defer b.lk.Unlock() for e := b.list.Front(); e != nil; e = e.Next() { if e.Value.(peer.ID) == id { b.list.Remove(e) From a1c198d12e677630dc51b0c2b0c42f7b5fb69ae2 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Thu, 5 Feb 2015 06:22:44 -0800 Subject: [PATCH 35/76] routing/kbucket: cleaner "public" interface for bucket --- bucket.go | 24 +++++++++++-------- table.go | 66 ++++++++++++++++++++++++++------------------------- table_test.go | 10 +++----- 3 files changed, 51 insertions(+), 49 deletions(-) diff --git a/bucket.go b/bucket.go index a8c6a07..d551cf8 100644 --- a/bucket.go +++ b/bucket.go @@ -30,18 +30,18 @@ func (b *Bucket) Peers() []peer.ID { return ps } -func (b *Bucket) find(id peer.ID) *list.Element { +func (b *Bucket) Has(id peer.ID) bool { b.lk.RLock() defer b.lk.RUnlock() for e := b.list.Front(); e != nil; e = e.Next() { if e.Value.(peer.ID) == id { - return e + return true } } - return nil + return false } -func (b *Bucket) remove(id peer.ID) { +func (b *Bucket) Remove(id peer.ID) { b.lk.Lock() defer b.lk.Unlock() for e := b.list.Front(); e != nil; e = e.Next() { @@ -51,19 +51,23 @@ func (b *Bucket) remove(id peer.ID) { } } -func (b *Bucket) moveToFront(e *list.Element) { +func (b *Bucket) MoveToFront(id peer.ID) { b.lk.Lock() - b.list.MoveToFront(e) - b.lk.Unlock() + defer b.lk.Unlock() + for e := b.list.Front(); e != nil; e = e.Next() { + if e.Value.(peer.ID) == id { + b.list.MoveToFront(e) + } + } } -func (b *Bucket) pushFront(p peer.ID) { +func (b *Bucket) PushFront(p peer.ID) { b.lk.Lock() b.list.PushFront(p) b.lk.Unlock() } -func (b *Bucket) popBack() peer.ID { +func (b *Bucket) PopBack() peer.ID { b.lk.Lock() defer b.lk.Unlock() last := b.list.Back() @@ -71,7 +75,7 @@ func (b *Bucket) popBack() peer.ID { return last.Value.(peer.ID) } -func (b *Bucket) len() int { +func (b *Bucket) Len() int { b.lk.RLock() defer b.lk.RUnlock() return b.list.Len() diff --git a/table.go b/table.go index dc5fb3d..a785bf8 100644 --- a/table.go +++ b/table.go @@ -46,7 +46,7 @@ func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m peer.M // Update adds or moves the given peer to the front of its respective bucket // If a peer gets removed from a bucket, it is returned -func (rt *RoutingTable) Update(p peer.ID) peer.ID { +func (rt *RoutingTable) Update(p peer.ID) { rt.tabLock.Lock() defer rt.tabLock.Unlock() peerID := ConvertPeerID(p) @@ -58,33 +58,35 @@ func (rt *RoutingTable) Update(p peer.ID) peer.ID { } bucket := rt.Buckets[bucketID] - e := bucket.find(p) - if e == nil { - // New peer, add to bucket - if rt.metrics.LatencyEWMA(p) > rt.maxLatency { - // Connection doesnt meet requirements, skip! - return "" - } - bucket.pushFront(p) - - // Are we past the max bucket size? - if bucket.len() > rt.bucketsize { - // If this bucket is the rightmost bucket, and its full - // we need to split it and create a new bucket - if bucketID == len(rt.Buckets)-1 { - return rt.nextBucket() - } else { - // If the bucket cant split kick out least active node - return bucket.popBack() - } + if bucket.Has(p) { + // If the peer is already in the table, move it to the front. + // This signifies that it it "more active" and the less active nodes + // Will as a result tend towards the back of the list + bucket.MoveToFront(p) + return + } + + if rt.metrics.LatencyEWMA(p) > rt.maxLatency { + // Connection doesnt meet requirements, skip! + return + } + + // New peer, add to bucket + bucket.PushFront(p) + + // Are we past the max bucket size? + if bucket.Len() > rt.bucketsize { + // If this bucket is the rightmost bucket, and its full + // we need to split it and create a new bucket + if bucketID == len(rt.Buckets)-1 { + rt.nextBucket() + return + } else { + // If the bucket cant split kick out least active node + bucket.PopBack() + return } - return "" } - // If the peer is already in the table, move it to the front. - // This signifies that it it "more active" and the less active nodes - // Will as a result tend towards the back of the list - bucket.moveToFront(e) - return "" } // Remove deletes a peer from the routing table. This is to be used @@ -101,20 +103,20 @@ func (rt *RoutingTable) Remove(p peer.ID) { } bucket := rt.Buckets[bucketID] - bucket.remove(p) + bucket.Remove(p) } func (rt *RoutingTable) nextBucket() peer.ID { bucket := rt.Buckets[len(rt.Buckets)-1] newBucket := bucket.Split(len(rt.Buckets)-1, rt.local) rt.Buckets = append(rt.Buckets, newBucket) - if newBucket.len() > rt.bucketsize { + if newBucket.Len() > rt.bucketsize { return rt.nextBucket() } // If all elements were on left side of split... - if bucket.len() > rt.bucketsize { - return bucket.popBack() + if bucket.Len() > rt.bucketsize { + return bucket.PopBack() } return "" } @@ -153,7 +155,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { bucket = rt.Buckets[cpl] var peerArr peerSorterArr - if bucket.len() == 0 { + if bucket.Len() == 0 { // In the case of an unusual split, one bucket may be empty. // if this happens, search both surrounding buckets for nearest peer if cpl > 0 { @@ -184,7 +186,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { func (rt *RoutingTable) Size() int { var tot int for _, buck := range rt.Buckets { - tot += buck.len() + tot += buck.Len() } return tot } diff --git a/table_test.go b/table_test.go index 3e44cf6..670342b 100644 --- a/table_test.go +++ b/table_test.go @@ -17,15 +17,14 @@ func TestBucket(t *testing.T) { peers := make([]peer.ID, 100) for i := 0; i < 100; i++ { peers[i] = tu.RandPeerIDFatal(t) - b.pushFront(peers[i]) + b.PushFront(peers[i]) } local := tu.RandPeerIDFatal(t) localID := ConvertPeerID(local) i := rand.Intn(len(peers)) - e := b.find(peers[i]) - if e == nil { + if !b.Has(peers[i]) { t.Errorf("Failed to find peer: %v", peers[i]) } @@ -62,10 +61,7 @@ func TestTableUpdate(t *testing.T) { // Testing Update for i := 0; i < 10000; i++ { - p := rt.Update(peers[rand.Intn(len(peers))]) - if p != "" { - //t.Log("evicted peer.") - } + rt.Update(peers[rand.Intn(len(peers))]) } for i := 0; i < 100; i++ { From 3f346ee2c0ddc466c0c2c53132b866e14ee0d1c0 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Wed, 4 Mar 2015 08:28:46 -0800 Subject: [PATCH 36/76] fixed dht kbucket race closes #836 --- table.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/table.go b/table.go index a785bf8..7b10d8d 100644 --- a/table.go +++ b/table.go @@ -185,9 +185,11 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { // Size returns the total number of peers in the routing table func (rt *RoutingTable) Size() int { var tot int + rt.tabLock.RLock() for _, buck := range rt.Buckets { tot += buck.Len() } + rt.tabLock.RUnlock() return tot } From ea04d1b32be572be5d1eb380ce32af7e359efd91 Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 37/76] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) --- xor.go | 2 +- xor_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xor.go b/xor.go index 7159f2c..8fae774 100644 --- a/xor.go +++ b/xor.go @@ -5,7 +5,7 @@ import ( "crypto/sha256" "math/big" - u "github.com/jbenet/go-ipfs/util" + u "github.com/ipfs/go-ipfs/util" ) // XORKeySpace is a KeySpace which: diff --git a/xor_test.go b/xor_test.go index 8db4b92..f90e8a5 100644 --- a/xor_test.go +++ b/xor_test.go @@ -5,7 +5,7 @@ import ( "math/big" "testing" - u "github.com/jbenet/go-ipfs/util" + u "github.com/ipfs/go-ipfs/util" ) func TestPrefixLen(t *testing.T) { From b0e10cbef41e605098e65f2d3f4f55f00a631490 Mon Sep 17 00:00:00 2001 From: Ho-Sheng Hsiao Date: Mon, 30 Mar 2015 20:04:32 -0700 Subject: [PATCH 38/76] Reorged imports from jbenet/go-ipfs to ipfs/go-ipfs - Modified Godeps/Godeps.json by hand - [TEST] Updated welcome docs hash to sharness - [TEST] Updated contact doc - [TEST] disabled breaking test (t0080-repo refs local) --- bucket.go | 2 +- sorting.go | 2 +- table.go | 4 ++-- table_test.go | 4 ++-- util.go | 6 +++--- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bucket.go b/bucket.go index d551cf8..35ceed3 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "github.com/jbenet/go-ipfs/p2p/peer" + peer "github.com/ipfs/go-ipfs/p2p/peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index 7995b39..31c6459 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "github.com/jbenet/go-ipfs/p2p/peer" + peer "github.com/ipfs/go-ipfs/p2p/peer" "sort" ) diff --git a/table.go b/table.go index 7b10d8d..87d9c9e 100644 --- a/table.go +++ b/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" - peer "github.com/jbenet/go-ipfs/p2p/peer" - u "github.com/jbenet/go-ipfs/util" + peer "github.com/ipfs/go-ipfs/p2p/peer" + u "github.com/ipfs/go-ipfs/util" ) var log = u.Logger("table") diff --git a/table_test.go b/table_test.go index 670342b..e5b01cc 100644 --- a/table_test.go +++ b/table_test.go @@ -5,9 +5,9 @@ import ( "testing" "time" - tu "github.com/jbenet/go-ipfs/util/testutil" + tu "github.com/ipfs/go-ipfs/util/testutil" - peer "github.com/jbenet/go-ipfs/p2p/peer" + peer "github.com/ipfs/go-ipfs/p2p/peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index 80c08de..e7c56f8 100644 --- a/util.go +++ b/util.go @@ -5,9 +5,9 @@ import ( "crypto/sha256" "errors" - peer "github.com/jbenet/go-ipfs/p2p/peer" - ks "github.com/jbenet/go-ipfs/routing/keyspace" - u "github.com/jbenet/go-ipfs/util" + peer "github.com/ipfs/go-ipfs/p2p/peer" + ks "github.com/ipfs/go-ipfs/routing/keyspace" + u "github.com/ipfs/go-ipfs/util" ) // Returned if a routing table query returns no results. This is NOT expected From 191c1d329f88b3b3bb88c0c6c5f4e834dfd83346 Mon Sep 17 00:00:00 2001 From: rht Date: Tue, 19 May 2015 00:42:21 +0700 Subject: [PATCH 39/76] Run 'gofmt -s -w' on these files --- xor_test.go | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/xor_test.go b/xor_test.go index f90e8a5..cac2742 100644 --- a/xor_test.go +++ b/xor_test.go @@ -10,9 +10,9 @@ import ( func TestPrefixLen(t *testing.T) { cases := [][]byte{ - []byte{0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00}, - []byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, - []byte{0x00, 0x58, 0xFF, 0x80, 0x00, 0x00, 0xF0}, + {0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, + {0x00, 0x58, 0xFF, 0x80, 0x00, 0x00, 0xF0}, } lens := []int{24, 56, 9} @@ -28,15 +28,15 @@ func TestPrefixLen(t *testing.T) { func TestXorKeySpace(t *testing.T) { ids := [][]byte{ - []byte{0xFF, 0xFF, 0xFF, 0xFF}, - []byte{0x00, 0x00, 0x00, 0x00}, - []byte{0xFF, 0xFF, 0xFF, 0xF0}, + {0xFF, 0xFF, 0xFF, 0xFF}, + {0x00, 0x00, 0x00, 0x00}, + {0xFF, 0xFF, 0xFF, 0xF0}, } ks := [][2]Key{ - [2]Key{XORKeySpace.Key(ids[0]), XORKeySpace.Key(ids[0])}, - [2]Key{XORKeySpace.Key(ids[1]), XORKeySpace.Key(ids[1])}, - [2]Key{XORKeySpace.Key(ids[2]), XORKeySpace.Key(ids[2])}, + {XORKeySpace.Key(ids[0]), XORKeySpace.Key(ids[0])}, + {XORKeySpace.Key(ids[1]), XORKeySpace.Key(ids[1])}, + {XORKeySpace.Key(ids[2]), XORKeySpace.Key(ids[2])}, } for i, set := range ks { @@ -75,12 +75,12 @@ func TestXorKeySpace(t *testing.T) { func TestDistancesAndCenterSorting(t *testing.T) { adjs := [][]byte{ - []byte{173, 149, 19, 27, 192, 183, 153, 192, 177, 175, 71, 127, 177, 79, 207, 38, 166, 169, 247, 96, 121, 228, 139, 240, 144, 172, 183, 232, 54, 123, 253, 14}, - []byte{223, 63, 97, 152, 4, 169, 47, 219, 64, 87, 25, 45, 196, 61, 215, 72, 234, 119, 138, 220, 82, 188, 73, 140, 232, 5, 36, 192, 20, 184, 17, 25}, - []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, - []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, - []byte{73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 126}, - []byte{73, 0, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + {173, 149, 19, 27, 192, 183, 153, 192, 177, 175, 71, 127, 177, 79, 207, 38, 166, 169, 247, 96, 121, 228, 139, 240, 144, 172, 183, 232, 54, 123, 253, 14}, + {223, 63, 97, 152, 4, 169, 47, 219, 64, 87, 25, 45, 196, 61, 215, 72, 234, 119, 138, 220, 82, 188, 73, 140, 232, 5, 36, 192, 20, 184, 17, 25}, + {73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + {73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, + {73, 176, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 126}, + {73, 0, 221, 176, 149, 143, 22, 42, 129, 124, 213, 114, 232, 95, 189, 154, 18, 3, 122, 132, 32, 199, 53, 185, 58, 157, 117, 78, 52, 146, 157, 127}, } keys := make([]Key, len(adjs)) From 995989a91bbe5d54355ba114b126863da625b49d Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 1 Jun 2015 16:10:08 -0700 Subject: [PATCH 40/76] move util.Key into its own package under blocks --- util.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/util.go b/util.go index e7c56f8..e37a701 100644 --- a/util.go +++ b/util.go @@ -5,6 +5,7 @@ import ( "crypto/sha256" "errors" + key "github.com/ipfs/go-ipfs/blocks/key" peer "github.com/ipfs/go-ipfs/p2p/peer" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "github.com/ipfs/go-ipfs/util" @@ -45,13 +46,13 @@ func ConvertPeerID(id peer.ID) ID { } // ConvertKey creates a DHT ID by hashing a local key (String) -func ConvertKey(id u.Key) ID { +func ConvertKey(id key.Key) ID { hash := sha256.Sum256([]byte(id)) return hash[:] } // Closer returns true if a is closer to key than b is -func Closer(a, b peer.ID, key u.Key) bool { +func Closer(a, b peer.ID, key key.Key) bool { aid := ConvertPeerID(a) bid := ConvertPeerID(b) tgt := ConvertKey(key) From 31cda683214c101f4aae2e57658d33e5eab2e416 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 14 Sep 2015 17:33:03 -0700 Subject: [PATCH 41/76] extract logging License: MIT Signed-off-by: Jeromy --- table.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/table.go b/table.go index 87d9c9e..45e4386 100644 --- a/table.go +++ b/table.go @@ -8,10 +8,10 @@ import ( "time" peer "github.com/ipfs/go-ipfs/p2p/peer" - u "github.com/ipfs/go-ipfs/util" + logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" ) -var log = u.Logger("table") +var log = logging.Logger("table") // RoutingTable defines the routing table. type RoutingTable struct { From ef7bd25d6eccc20995fab8221bab7aea41783260 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 1 Oct 2015 11:22:28 -0700 Subject: [PATCH 42/76] replace imports with absolute path instead of using symlink License: MIT Signed-off-by: Jeromy --- table.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/table.go b/table.go index 45e4386..ed3b6d3 100644 --- a/table.go +++ b/table.go @@ -8,7 +8,7 @@ import ( "time" peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/go-log-v1.0.0" + logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" ) var log = logging.Logger("table") From 59943a9d7b558a8c857dc752d96704d633dd9c80 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 27 Oct 2015 10:47:32 -0700 Subject: [PATCH 43/76] update code to use new logging changes License: MIT Signed-off-by: Jeromy --- table.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/table.go b/table.go index ed3b6d3..cbfddcf 100644 --- a/table.go +++ b/table.go @@ -8,7 +8,7 @@ import ( "time" peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/QmXJkcEXB6C9h6Ytb6rrUTFU56Ro62zxgrbxTT3dgjQGA8/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" ) var log = logging.Logger("table") From 5dfacc8c8c43d6683f4789af07768f8e383cbf87 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 29 Oct 2015 21:22:53 -0700 Subject: [PATCH 44/76] vendor logging lib update License: MIT Signed-off-by: Jeromy --- table.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/table.go b/table.go index cbfddcf..044d3a2 100644 --- a/table.go +++ b/table.go @@ -8,7 +8,7 @@ import ( "time" peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/QmTBXYb6y2ZcJmoXVKk3pf9rzSEjbCg7tQaJW7RSuH14nv/go-log" + logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" ) var log = logging.Logger("table") From 2fa2f79fa89f2e87938ca9f66756dd063012f9f3 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Fri, 13 Nov 2015 14:36:13 -0800 Subject: [PATCH 45/76] if bucket doesnt have enough peers, grab more elsewhere License: MIT Signed-off-by: Jeromy --- sorting.go | 4 ---- table.go | 9 ++++----- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/sorting.go b/sorting.go index 31c6459..875b822 100644 --- a/sorting.go +++ b/sorting.go @@ -32,10 +32,6 @@ func copyPeersFromList(target ID, peerArr peerSorterArr, peerList *list.List) pe distance: xor(target, pID), } peerArr = append(peerArr, &pd) - if e == nil { - log.Debug("list element was nil") - return peerArr - } } return peerArr } diff --git a/table.go b/table.go index 044d3a2..d4cf051 100644 --- a/table.go +++ b/table.go @@ -155,9 +155,10 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { bucket = rt.Buckets[cpl] var peerArr peerSorterArr - if bucket.Len() == 0 { - // In the case of an unusual split, one bucket may be empty. - // if this happens, search both surrounding buckets for nearest peer + peerArr = copyPeersFromList(id, peerArr, bucket.list) + if len(peerArr) < count { + // In the case of an unusual split, one bucket may be short or empty. + // if this happens, search both surrounding buckets for nearby peers if cpl > 0 { plist := rt.Buckets[cpl-1].list peerArr = copyPeersFromList(id, peerArr, plist) @@ -167,8 +168,6 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { plist := rt.Buckets[cpl+1].list peerArr = copyPeersFromList(id, peerArr, plist) } - } else { - peerArr = copyPeersFromList(id, peerArr, bucket.list) } // Sort by distance to local peer From ddb5ee65049faef10de9486c937c0c172345cba7 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 27 Jan 2016 14:28:34 -0800 Subject: [PATCH 46/76] initial vendoring of libp2p outside of the repo with gx License: MIT Signed-off-by: Jeromy --- bucket.go | 2 +- sorting.go | 2 +- table.go | 4 ++-- table_test.go | 2 +- util.go | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bucket.go b/bucket.go index 35ceed3..df8f92e 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "github.com/ipfs/go-ipfs/p2p/peer" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index 875b822..0daae3b 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "github.com/ipfs/go-ipfs/p2p/peer" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" "sort" ) diff --git a/table.go b/table.go index d4cf051..8dd3ff3 100644 --- a/table.go +++ b/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" - peer "github.com/ipfs/go-ipfs/p2p/peer" - logging "github.com/ipfs/go-ipfs/vendor/QmQg1J6vikuXF9oDvm4wpdeAUvvkVEKW1EYDw9HhTMnP2b/go-log" + logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("table") diff --git a/table_test.go b/table_test.go index e5b01cc..eb16167 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/util/testutil" - peer "github.com/ipfs/go-ipfs/p2p/peer" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index e37a701..be477ff 100644 --- a/util.go +++ b/util.go @@ -6,9 +6,9 @@ import ( "errors" key "github.com/ipfs/go-ipfs/blocks/key" - peer "github.com/ipfs/go-ipfs/p2p/peer" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "github.com/ipfs/go-ipfs/util" + peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected From e659727a06664da84b46e9d4e5de172166510b72 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 09:43:06 -0800 Subject: [PATCH 47/76] go-keyspace dep from libp2p added License: MIT Signed-off-by: Jeromy --- bucket.go | 2 +- sorting.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bucket.go b/bucket.go index df8f92e..77fd6db 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index 0daae3b..33b6a44 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" "sort" ) diff --git a/table.go b/table.go index 8dd3ff3..2386fd1 100644 --- a/table.go +++ b/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" ) var log = logging.Logger("table") diff --git a/table_test.go b/table_test.go index eb16167..1c9db10 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index be477ff..a0c6347 100644 --- a/util.go +++ b/util.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmY3NAw959vbE1oJooP9HchcRdBsbxhgQsEZTRhKgvoSuC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected From d4c73fe0e31c77c93477e70025279a55304e28ae Mon Sep 17 00:00:00 2001 From: Jeromy Date: Thu, 28 Jan 2016 10:07:26 -0800 Subject: [PATCH 48/76] correct go-log dep License: MIT Signed-off-by: Jeromy --- table.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/table.go b/table.go index 2386fd1..e849ed3 100644 --- a/table.go +++ b/table.go @@ -8,7 +8,7 @@ import ( "time" peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" - logging "gx/ipfs/QmaPaGNE2GqnfJjRRpQuQuFHuJn4FZvsrGxdik4kgxCkBi/go-log" + logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) var log = logging.Logger("table") From 3d1458c7c8758b63b7d698800d141ecdf273732b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 31 Jan 2016 10:19:50 -0800 Subject: [PATCH 49/76] update libp2p dep License: MIT Signed-off-by: Jeromy --- bucket.go | 2 +- sorting.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bucket.go b/bucket.go index 77fd6db..494f448 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index 33b6a44..ae3d136 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" "sort" ) diff --git a/table.go b/table.go index e849ed3..2464251 100644 --- a/table.go +++ b/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/table_test.go b/table_test.go index 1c9db10..083e172 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index a0c6347..50c17c3 100644 --- a/util.go +++ b/util.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmZxtCsPRgCnCXwVPUjcBiFckkG5NMYM4Pthwe6X4C8uQq/go-libp2p/p2p/peer" + peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected From 8ac6e9e3185f9a44654f175da900b34c0046fa5b Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sun, 31 Jan 2016 15:37:39 -0800 Subject: [PATCH 50/76] do that last thing again License: MIT Signed-off-by: Jeromy --- bucket.go | 2 +- sorting.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bucket.go b/bucket.go index 494f448..8924a63 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index ae3d136..e1e0a1b 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" "sort" ) diff --git a/table.go b/table.go index 2464251..5128b78 100644 --- a/table.go +++ b/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/table_test.go b/table_test.go index 083e172..13f02df 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/util/testutil" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index 50c17c3..73602d1 100644 --- a/util.go +++ b/util.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "github.com/ipfs/go-ipfs/util" - peer "gx/ipfs/QmQQCBoWhMZtStYuAAo2uDNNLit9n7yX5ANBecfjKq4XBn/go-libp2p/p2p/peer" + peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected From b7759d6147283d071b6ad83b7644439e91b260f9 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 51/76] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy --- table_test.go | 2 +- util.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/table_test.go b/table_test.go index 13f02df..a023dba 100644 --- a/table_test.go +++ b/table_test.go @@ -5,7 +5,7 @@ import ( "testing" "time" - tu "github.com/ipfs/go-ipfs/util/testutil" + tu "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) diff --git a/util.go b/util.go index 73602d1..df32378 100644 --- a/util.go +++ b/util.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) From 86ad96b45f5a4eef61a64e96269fa6af3e49d657 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 9 Feb 2016 10:56:19 -0800 Subject: [PATCH 52/76] Use gx vendored go-ipfs-utils where possible For the rest of the packages in util, move them to thirdparty and update the references. util is gone! License: MIT Signed-off-by: Jeromy --- xor.go | 2 +- xor_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xor.go b/xor.go index 8fae774..fd96fd6 100644 --- a/xor.go +++ b/xor.go @@ -5,7 +5,7 @@ import ( "crypto/sha256" "math/big" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) // XORKeySpace is a KeySpace which: diff --git a/xor_test.go b/xor_test.go index cac2742..a461c09 100644 --- a/xor_test.go +++ b/xor_test.go @@ -5,7 +5,7 @@ import ( "math/big" "testing" - u "github.com/ipfs/go-ipfs/util" + u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) func TestPrefixLen(t *testing.T) { From 901bcb332d80a4862f5475859250b8b62c2eb7d8 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 9 Mar 2016 09:53:19 -0800 Subject: [PATCH 53/76] update libp2p dep License: MIT Signed-off-by: Jeromy --- bucket.go | 2 +- sorting.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bucket.go b/bucket.go index 8924a63..e12fe56 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index e1e0a1b..f96170e 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" "sort" ) diff --git a/table.go b/table.go index 5128b78..b627d68 100644 --- a/table.go +++ b/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/table_test.go b/table_test.go index a023dba..9be348c 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index df32378..8b00531 100644 --- a/util.go +++ b/util.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" + peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmUBogf4nUefBjmYjn6jfsfPJRkmDGSeMhNj4usRKq69f4/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected From bcde6c4d3b578a474e7ea96e982f023087ed5764 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 29 Mar 2016 19:18:14 -0700 Subject: [PATCH 54/76] update utp and cleanup more godeps along the way License: MIT Signed-off-by: Jeromy --- bucket.go | 2 +- sorting.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bucket.go b/bucket.go index e12fe56..7ce83a0 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index f96170e..a190120 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" "sort" ) diff --git a/table.go b/table.go index b627d68..15b0ed7 100644 --- a/table.go +++ b/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/table_test.go b/table_test.go index 9be348c..ce11e67 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index 8b00531..2b055e7 100644 --- a/util.go +++ b/util.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmNefBbWHR9JEiP3KDVqZsBLQVRmH3GBG2D2Ke24SsFqfW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) From f6916df9ec28680e4639ac40a780e351979a88e6 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 6 Apr 2016 15:42:06 -0700 Subject: [PATCH 55/76] switch to new libp2p with mss crypto License: MIT Signed-off-by: Jeromy --- bucket.go | 2 +- sorting.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bucket.go b/bucket.go index 7ce83a0..b061a67 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index a190120..8b1dada 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" "sort" ) diff --git a/table.go b/table.go index 15b0ed7..e0e398e 100644 --- a/table.go +++ b/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/table_test.go b/table_test.go index ce11e67..4c50577 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index 2b055e7..1d6fe05 100644 --- a/util.go +++ b/util.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmSN2ELGRp4T9kjqiSsSNJRUeR9JKXzQEgwe1HH3tdSGbC/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) From 3466d43098ed3a20defe04a969d34876ebdb90b4 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Mon, 11 Apr 2016 12:52:54 -0700 Subject: [PATCH 56/76] update libp2p dep to fix hanging listeners problem License: MIT Signed-off-by: Jeromy --- bucket.go | 2 +- sorting.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bucket.go b/bucket.go index b061a67..aebb4e5 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index 8b1dada..d188554 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" "sort" ) diff --git a/table.go b/table.go index e0e398e..336fc3d 100644 --- a/table.go +++ b/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("table") diff --git a/table_test.go b/table_test.go index 4c50577..90f1781 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index 1d6fe05..b81c4c0 100644 --- a/util.go +++ b/util.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmZMehXD2w81qeVJP6r1mmocxwsD7kqAvuzGm2QWDw1H88/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected From 5ef5c7c0a06fd7228cbd13b0737d54654206b8b6 Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Sat, 16 Apr 2016 21:23:47 -0700 Subject: [PATCH 57/76] Update go-libp2p License: MIT Signed-off-by: Lars Gierth --- bucket.go | 2 +- sorting.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bucket.go b/bucket.go index aebb4e5..6ec1fcd 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index d188554..c23b49e 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" "sort" ) diff --git a/table.go b/table.go index 336fc3d..c6cce4c 100644 --- a/table.go +++ b/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) var log = logging.Logger("table") diff --git a/table_test.go b/table_test.go index 90f1781..b6b44ed 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index b81c4c0..4588702 100644 --- a/util.go +++ b/util.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" + peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmccGfZs3rzku8Bv6sTPH3bMUKD1EVod8srgRjt5csdmva/go-libp2p/p2p/peer" ) // Returned if a routing table query returns no results. This is NOT expected From 155efe21b2445782e1599bc3388f68c3ddaa2a5d Mon Sep 17 00:00:00 2001 From: Lars Gierth Date: Sat, 16 Apr 2016 21:38:22 -0700 Subject: [PATCH 58/76] Use extracted go-libp2p-crypto, -secio, -peer packages License: MIT Signed-off-by: Lars Gierth --- bucket.go | 2 +- sorting.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bucket.go b/bucket.go index 6ec1fcd..30126d3 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index c23b49e..1ff7acc 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" "sort" ) diff --git a/table.go b/table.go index c6cce4c..d8dd434 100644 --- a/table.go +++ b/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" ) diff --git a/table_test.go b/table_test.go index b6b44ed..caa9997 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index 4588702..e2c610f 100644 --- a/util.go +++ b/util.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmYgaiNVVL7f2nydijAwpDRunRkmxfu3PoK87Y3pH84uAW/go-libp2p/p2p/peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" ) // Returned if a routing table query returns no results. This is NOT expected From 9ce09df7c4c5d0cffda78dd5afbf34953874fd82 Mon Sep 17 00:00:00 2001 From: Hector Sanjuan Date: Wed, 4 May 2016 22:56:39 +0200 Subject: [PATCH 59/76] Update go-log to 1.1.0 and fix calls to go-log.Uuid License: MIT Signed-off-by: Hector Sanjuan --- table.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/table.go b/table.go index d8dd434..1d41da7 100644 --- a/table.go +++ b/table.go @@ -8,7 +8,7 @@ import ( "time" peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" - logging "gx/ipfs/Qmazh5oNUVsDZTs2g59rq8aYQqwpss8tcUWQzor5sCCEuH/go-log" + logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("table") From 1f80f5976a5c9dbd70527ed28b9c7456397e324a Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 10 May 2016 16:06:28 -0700 Subject: [PATCH 60/76] update libp2p with go-multiaddr and go-stream-muxer updates License: MIT Signed-off-by: Jeromy --- bucket.go | 2 +- sorting.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bucket.go b/bucket.go index 30126d3..37b7cb8 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index 1ff7acc..6d282e0 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" "sort" ) diff --git a/table.go b/table.go index 1d41da7..7c22fec 100644 --- a/table.go +++ b/table.go @@ -7,7 +7,7 @@ import ( "sync" "time" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) diff --git a/table_test.go b/table_test.go index caa9997..4ac3a2a 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index e2c610f..8653c7e 100644 --- a/util.go +++ b/util.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZwZjMVGss5rqYsJVGy18gNbkTJffFyq2x1uJ4e4p3ZAt/go-libp2p-peer" + peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" ) // Returned if a routing table query returns no results. This is NOT expected From 9c04bb92cb30e22ea69fe18ac9a97d9b4fe77dfd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Tue, 17 May 2016 10:23:10 -0700 Subject: [PATCH 61/76] update go-libp2p 3.2.2, nil maddr fixes License: MIT Signed-off-by: Jeromy --- bucket.go | 2 +- sorting.go | 2 +- table.go | 2 +- table_test.go | 2 +- util.go | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bucket.go b/bucket.go index 37b7cb8..96c0a68 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index 6d282e0..5d0c834 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" "sort" ) diff --git a/table.go b/table.go index 7c22fec..3787415 100644 --- a/table.go +++ b/table.go @@ -7,8 +7,8 @@ import ( "sync" "time" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("table") diff --git a/table_test.go b/table_test.go index 4ac3a2a..85c579c 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index 8653c7e..107dbf4 100644 --- a/util.go +++ b/util.go @@ -8,7 +8,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmZpD74pUj6vuxTp1o6LhA3JavC2Bvh9fsWPPVvHnD9sE7/go-libp2p-peer" + peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Returned if a routing table query returns no results. This is NOT expected From 13a2c032b42e58364a5470391f6766878305cf63 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Wed, 1 Jun 2016 15:51:39 -0700 Subject: [PATCH 62/76] update libp2p to v3.3.1 License: MIT Signed-off-by: Jeromy --- bucket.go | 2 +- sorting.go | 2 +- table.go | 7 ++++--- table_test.go | 15 ++++++++------- util.go | 2 +- 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/bucket.go b/bucket.go index 96c0a68..1f887bd 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index 5d0c834..8b4fce8 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" "sort" ) diff --git a/table.go b/table.go index 3787415..fc9c096 100644 --- a/table.go +++ b/table.go @@ -7,8 +7,9 @@ import ( "sync" "time" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) var log = logging.Logger("table") @@ -23,7 +24,7 @@ type RoutingTable struct { tabLock sync.RWMutex // latency metrics - metrics peer.Metrics + metrics pstore.Metrics // Maximum acceptable latency for peers in this cluster maxLatency time.Duration @@ -34,7 +35,7 @@ type RoutingTable struct { } // NewRoutingTable creates a new routing table with a given bucketsize, local ID, and latency tolerance. -func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m peer.Metrics) *RoutingTable { +func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m pstore.Metrics) *RoutingTable { rt := new(RoutingTable) rt.Buckets = []*Bucket{newBucket()} rt.bucketsize = bucketsize diff --git a/table_test.go b/table_test.go index 85c579c..271b798 100644 --- a/table_test.go +++ b/table_test.go @@ -7,7 +7,8 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" ) // Test basic features of the bucket struct @@ -51,7 +52,7 @@ func TestBucket(t *testing.T) { // Right now, this just makes sure that it doesnt hang or crash func TestTableUpdate(t *testing.T) { local := tu.RandPeerIDFatal(t) - m := peer.NewMetrics() + m := pstore.NewMetrics() rt := NewRoutingTable(10, ConvertPeerID(local), time.Hour, m) peers := make([]peer.ID, 100) @@ -75,7 +76,7 @@ func TestTableUpdate(t *testing.T) { func TestTableFind(t *testing.T) { local := tu.RandPeerIDFatal(t) - m := peer.NewMetrics() + m := pstore.NewMetrics() rt := NewRoutingTable(10, ConvertPeerID(local), time.Hour, m) peers := make([]peer.ID, 100) @@ -93,7 +94,7 @@ func TestTableFind(t *testing.T) { func TestTableFindMultiple(t *testing.T) { local := tu.RandPeerIDFatal(t) - m := peer.NewMetrics() + m := pstore.NewMetrics() rt := NewRoutingTable(20, ConvertPeerID(local), time.Hour, m) peers := make([]peer.ID, 100) @@ -114,7 +115,7 @@ func TestTableFindMultiple(t *testing.T) { // and set GOMAXPROCS above 1 func TestTableMultithreaded(t *testing.T) { local := peer.ID("localPeer") - m := peer.NewMetrics() + m := pstore.NewMetrics() tab := NewRoutingTable(20, ConvertPeerID(local), time.Hour, m) var peers []peer.ID for i := 0; i < 500; i++ { @@ -153,7 +154,7 @@ func TestTableMultithreaded(t *testing.T) { func BenchmarkUpdates(b *testing.B) { b.StopTimer() local := ConvertKey("localKey") - m := peer.NewMetrics() + m := pstore.NewMetrics() tab := NewRoutingTable(20, local, time.Hour, m) var peers []peer.ID @@ -170,7 +171,7 @@ func BenchmarkUpdates(b *testing.B) { func BenchmarkFinds(b *testing.B) { b.StopTimer() local := ConvertKey("localKey") - m := peer.NewMetrics() + m := pstore.NewMetrics() tab := NewRoutingTable(20, local, time.Hour, m) var peers []peer.ID diff --git a/util.go b/util.go index 107dbf4..ad3fe49 100644 --- a/util.go +++ b/util.go @@ -7,8 +7,8 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" + peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" - peer "gx/ipfs/QmbyvM8zRFDkbFdYyt1MnevUMJ62SiSGbfDFZ3Z8nkrzr4/go-libp2p-peer" ) // Returned if a routing table query returns no results. This is NOT expected From b26439adb1bdcafcaca640be38705577838c7721 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Thu, 9 Jun 2016 22:12:52 +0200 Subject: [PATCH 63/76] Update go-log https://github.com/ipfs/go-log/pull/3 License: MIT Signed-off-by: Jakub Sztandera --- table.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/table.go b/table.go index fc9c096..2d57c56 100644 --- a/table.go +++ b/table.go @@ -8,8 +8,8 @@ import ( "time" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" - logging "gx/ipfs/QmaDNZ4QMdBdku1YZWBysufYyoQt1negQGNav6PLYarbY8/go-log" ) var log = logging.Logger("table") From 0ee12a20e9cca9e0854962fb17666e983fb4ca12 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 11 Jun 2016 10:33:44 -0700 Subject: [PATCH 64/76] pull in libp2p updates with utp fixes License: MIT Signed-off-by: Jeromy --- table.go | 2 +- table_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/table.go b/table.go index 2d57c56..ff77275 100644 --- a/table.go +++ b/table.go @@ -8,8 +8,8 @@ import ( "time" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" ) var log = logging.Logger("table") diff --git a/table_test.go b/table_test.go index 271b798..67c2d19 100644 --- a/table_test.go +++ b/table_test.go @@ -8,7 +8,7 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmZ62t46e9p7vMYqCmptwQC1RhRv5cpQ5cwoqYspedaXyq/go-libp2p-peerstore" + pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" ) // Test basic features of the bucket struct From b7641d6c1e43e3730cdfb9a708cd350ee9a1c5fd Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 11 Jun 2016 17:08:34 -0700 Subject: [PATCH 65/76] a few small changes to make the dht more efficient License: MIT Signed-off-by: Jeromy --- table.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/table.go b/table.go index ff77275..49a8b74 100644 --- a/table.go +++ b/table.go @@ -48,11 +48,11 @@ func NewRoutingTable(bucketsize int, localID ID, latency time.Duration, m pstore // Update adds or moves the given peer to the front of its respective bucket // If a peer gets removed from a bucket, it is returned func (rt *RoutingTable) Update(p peer.ID) { - rt.tabLock.Lock() - defer rt.tabLock.Unlock() peerID := ConvertPeerID(p) cpl := commonPrefixLen(peerID, rt.local) + rt.tabLock.Lock() + defer rt.tabLock.Unlock() bucketID := cpl if bucketID >= len(rt.Buckets) { bucketID = len(rt.Buckets) - 1 From 9ad0b6c3ec5853f417914621fe4e4ad78558e931 Mon Sep 17 00:00:00 2001 From: Jeromy Date: Sat, 11 Jun 2016 23:07:06 -0700 Subject: [PATCH 66/76] sort peers outside of locks License: MIT Signed-off-by: Jeromy --- table.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/table.go b/table.go index 49a8b74..0dfdff4 100644 --- a/table.go +++ b/table.go @@ -144,10 +144,10 @@ func (rt *RoutingTable) NearestPeer(id ID) peer.ID { // NearestPeers returns a list of the 'count' closest peers to the given ID func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { - rt.tabLock.RLock() - defer rt.tabLock.RUnlock() cpl := commonPrefixLen(id, rt.local) + rt.tabLock.RLock() + // Get bucket at cpl index or last bucket var bucket *Bucket if cpl >= len(rt.Buckets) { @@ -170,6 +170,7 @@ func (rt *RoutingTable) NearestPeers(id ID, count int) []peer.ID { peerArr = copyPeersFromList(id, peerArr, plist) } } + rt.tabLock.RUnlock() // Sort by distance to local peer sort.Sort(peerArr) From 163ddd5fe6007c5914fd27d2098b96cecfee4443 Mon Sep 17 00:00:00 2001 From: Jakub Sztandera Date: Fri, 24 Jun 2016 18:38:07 +0200 Subject: [PATCH 67/76] Update go-log in whole dependency tree (#2898) * Update golog in go-ipfs License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-secio for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-crypto for go-log License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p-peer for go-log License: MIT Signed-off-by: Jakub Sztandera * Import peersore, it wasn't imported License: MIT Signed-off-by: Jakub Sztandera * Update peerstore License: MIT Signed-off-by: Jakub Sztandera * Update peer License: MIT Signed-off-by: Jakub Sztandera * Update secio License: MIT Signed-off-by: Jakub Sztandera * Update go-libp2p License: MIT Signed-off-by: Jakub Sztandera --- bucket.go | 2 +- sorting.go | 2 +- table.go | 6 +++--- table_test.go | 4 ++-- util.go | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bucket.go b/bucket.go index 1f887bd..d835e24 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/sorting.go b/sorting.go index 8b4fce8..ff9dc3d 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" "sort" ) diff --git a/table.go b/table.go index 0dfdff4..3898af4 100644 --- a/table.go +++ b/table.go @@ -7,9 +7,9 @@ import ( "sync" "time" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" - logging "gx/ipfs/QmYtB7Qge8cJpXc4irsEp8zRqfnZMBeB7aTrMEkPk67DRv/go-log" + logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ) var log = logging.Logger("table") diff --git a/table_test.go b/table_test.go index 67c2d19..6a0c75e 100644 --- a/table_test.go +++ b/table_test.go @@ -7,8 +7,8 @@ import ( tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" - pstore "gx/ipfs/QmXHUpFsnpCmanRnacqYkFoLoFfEq5yS2nUgGkAjJ1Nj9j/go-libp2p-peerstore" + pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index ad3fe49..f9fbed0 100644 --- a/util.go +++ b/util.go @@ -7,7 +7,7 @@ import ( key "github.com/ipfs/go-ipfs/blocks/key" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmQGwpJy9P4yXZySmqkZEXCmbBpJUb8xntCv8Ca4taZwDC/go-libp2p-peer" + peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" ) From 9c00a966026da8f7f11891ff94232ac2fd4a92e4 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Thu, 25 Aug 2016 13:17:52 +0100 Subject: [PATCH 68/76] Add docs --- LICENSE | 21 +++++++++++++++++++++ README.md | 2 ++ 2 files changed, 23 insertions(+) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9ce9744 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Juan Batiz-Benet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..95ab806 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# go-key +A string representation of [multihash](https://github.com/multiformats/go-multihash) for use with maps. \ No newline at end of file From 138396b487c43ff10bce4a6a92d96c3eff3cf2e3 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Thu, 25 Aug 2016 13:19:53 +0100 Subject: [PATCH 69/76] Undo gx rewrites --- bucket.go | 2 +- package.json | 38 ++++++++++++++++++++++++++++++++++++++ sorting.go | 2 +- table.go | 6 +++--- table_test.go | 5 ++--- util.go | 6 +++--- 6 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 package.json diff --git a/bucket.go b/bucket.go index d835e24..7a4ff21 100644 --- a/bucket.go +++ b/bucket.go @@ -4,7 +4,7 @@ import ( "container/list" "sync" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + peer "github.com/ipfs/go-libp2p-peer" ) // Bucket holds a list of peers. diff --git a/package.json b/package.json new file mode 100644 index 0000000..d0522d7 --- /dev/null +++ b/package.json @@ -0,0 +1,38 @@ +{ + "bugs": { + "url": "https://github.com/libp2p/go-libp2p-kbucket" + }, + "gx": { + "dvcsimport": "github.com/libp2p/go-libp2p-kbucket", + "goversion": "1.5.2" + }, + "gxDependencies": [ + { + "hash": "QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR", + "name": "go-log", + "version": "1.1.2" + }, + { + "author": "whyrusleeping", + "hash": "QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs", + "name": "go-libp2p-peer", + "version": "1.0.8" + }, + { + "author": "whyrusleeping", + "hash": "QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P", + "name": "go-libp2p-peerstore", + "version": "1.1.2" + }, + { + "hash": "QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1", + "name": "go-ipfs-util", + "version": "1.0.0" + } + ], + "gxVersion": "0.4.0", + "language": "go", + "license": "MIT", + "name": "go-libp2p-kbucket", + "version": "0.0.0" +} diff --git a/sorting.go b/sorting.go index ff9dc3d..e3a5241 100644 --- a/sorting.go +++ b/sorting.go @@ -2,7 +2,7 @@ package kbucket import ( "container/list" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + peer "github.com/ipfs/go-libp2p-peer" "sort" ) diff --git a/table.go b/table.go index 3898af4..4ed563e 100644 --- a/table.go +++ b/table.go @@ -7,9 +7,9 @@ import ( "sync" "time" - logging "gx/ipfs/QmNQynaz7qfriSUJkiEZUrm2Wen1u3Kj9goZzWtrPyu7XR/go-log" - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + peer "github.com/ipfs/go-libp2p-peer" + pstore "github.com/ipfs/go-libp2p-peerstore" + logging "github.com/ipfs/go-log" ) var log = logging.Logger("table") diff --git a/table_test.go b/table_test.go index 6a0c75e..563c115 100644 --- a/table_test.go +++ b/table_test.go @@ -6,9 +6,8 @@ import ( "time" tu "github.com/ipfs/go-ipfs/thirdparty/testutil" - - pstore "gx/ipfs/QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P/go-libp2p-peerstore" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" + peer "github.com/ipfs/go-libp2p-peer" + pstore "github.com/ipfs/go-libp2p-peerstore" ) // Test basic features of the bucket struct diff --git a/util.go b/util.go index f9fbed0..8227b01 100644 --- a/util.go +++ b/util.go @@ -5,10 +5,10 @@ import ( "crypto/sha256" "errors" - key "github.com/ipfs/go-ipfs/blocks/key" + u "github.com/ipfs/go-ipfs-util" ks "github.com/ipfs/go-ipfs/routing/keyspace" - peer "gx/ipfs/QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs/go-libp2p-peer" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + key "github.com/ipfs/go-key" + peer "github.com/ipfs/go-libp2p-peer" ) // Returned if a routing table query returns no results. This is NOT expected From 826baf22068b0eed43ac7ca1836151eb4d401d39 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Thu, 25 Aug 2016 13:20:09 +0100 Subject: [PATCH 70/76] Add travis-ci --- .travis.yml | 24 ++++++++++++++++++++++++ Makefile | 9 +++++++++ 2 files changed, 33 insertions(+) create mode 100644 .travis.yml create mode 100644 Makefile diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..3173bb8 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,24 @@ +os: + - linux + - osx + +language: go + +go: + - 1.5.2 + +env: + - GO15VENDOREXPERIMENT=1 + +install: true + +script: + - make deps + - go test ./... + +cache: + directories: + - $GOPATH/src/gx + +notifications: + email: false \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a89e6d0 --- /dev/null +++ b/Makefile @@ -0,0 +1,9 @@ +export IPFS_API ?= v04x.ipfs.io + +gx: + go get -u github.com/whyrusleeping/gx + go get -u github.com/whyrusleeping/gx-go + +deps: gx + gx --verbose install --global + gx-go rewrite \ No newline at end of file From 5add21a2a51a50f77b3c07efb41699290499102e Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 26 Aug 2016 17:05:56 +0100 Subject: [PATCH 71/76] Undo gx rewrites --- keyspace/xor.go | 2 +- keyspace/xor_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/keyspace/xor.go b/keyspace/xor.go index fd96fd6..2cb1a94 100644 --- a/keyspace/xor.go +++ b/keyspace/xor.go @@ -5,7 +5,7 @@ import ( "crypto/sha256" "math/big" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + u "github.com/ipfs/go-ipfs-util" ) // XORKeySpace is a KeySpace which: diff --git a/keyspace/xor_test.go b/keyspace/xor_test.go index a461c09..6dd71dd 100644 --- a/keyspace/xor_test.go +++ b/keyspace/xor_test.go @@ -5,7 +5,7 @@ import ( "math/big" "testing" - u "gx/ipfs/QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1/go-ipfs-util" + u "github.com/ipfs/go-ipfs-util" ) func TestPrefixLen(t *testing.T) { From 9055fe38086d1ea7e07df1c09606636099d48a61 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 26 Aug 2016 17:08:55 +0100 Subject: [PATCH 72/76] Fix docs --- LICENSE | 2 +- README.md | 28 ++++++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/LICENSE b/LICENSE index 9ce9744..55a2d03 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016 Juan Batiz-Benet +Copyright (c) 2016 Protocol Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 95ab806..a398f38 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,26 @@ -# go-key -A string representation of [multihash](https://github.com/multiformats/go-multihash) for use with maps. \ No newline at end of file +# go-libp2p-kbucket + +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) +[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/) +[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) +[![standard-readme compliant](https://img.shields.io/badge/standard--readme-OK-green.svg?style=flat-square)](https://github.com/RichardLitt/standard-readme) + +> A kbucket implementation for use as a routing table + +## Documenation + +See https://godoc.org/github.com/libp2p/go-libp2p-kbucket. + +## Contribute + +Feel free to join in. All welcome. Open an [issue](https://github.com/ipfs/go-key/issues)! + +This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). + +### Want to hack on IPFS? + +[![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) + +## License + +MIT \ No newline at end of file From 6d2cddd6196ad7e9dbf385685d4f3ebf4918b373 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Fri, 26 Aug 2016 17:10:43 +0100 Subject: [PATCH 73/76] Fix ks package --- util.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/util.go b/util.go index 8227b01..414b782 100644 --- a/util.go +++ b/util.go @@ -6,9 +6,9 @@ import ( "errors" u "github.com/ipfs/go-ipfs-util" - ks "github.com/ipfs/go-ipfs/routing/keyspace" key "github.com/ipfs/go-key" peer "github.com/ipfs/go-libp2p-peer" + ks "github.com/libp2p/go-libp2p-kbucket/keyspace" ) // Returned if a routing table query returns no results. This is NOT expected From 9968b7d03267e47eb57f55f5e7b435f9ac2875e2 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Wed, 31 Aug 2016 16:59:26 +0100 Subject: [PATCH 74/76] Use latest gx versions --- package.json | 18 ++++++++++++++---- table_test.go | 2 +- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index d0522d7..a3211a3 100644 --- a/package.json +++ b/package.json @@ -14,20 +14,30 @@ }, { "author": "whyrusleeping", - "hash": "QmRBqJF7hb8ZSpRcMwUt8hNhydWcxGEhtk81HKq6oUwKvs", + "hash": "QmWtbQU15LaB5B1JC2F7TV9P4K88vD3PpA4AJrwfCjhML8", "name": "go-libp2p-peer", - "version": "1.0.8" + "version": "2.0.3" }, { "author": "whyrusleeping", - "hash": "QmQdnfvZQuhdT93LNc5bos52wAmdr3G2p6G8teLJMEN32P", + "hash": "QmSZi9ygLohBUGyHMqE5N6eToPwqcg7bZQTULeVLFu7Q6d", "name": "go-libp2p-peerstore", - "version": "1.1.2" + "version": "1.2.2" }, { "hash": "QmZNVWh8LLjAavuQ2JXuFmuYH3C11xo988vSgp7UQrTRj1", "name": "go-ipfs-util", "version": "1.0.0" + }, + { + "hash": "QmU8398icxBKnBm9Rbkfg1AUF5N8LbMj8BxbWh7EJ54XcU", + "name": "go-testutil", + "version": "1.0.0" + }, + { + "hash": "QmT9tw9haE1UjSYu51uUxQ8bEqefMdRLKJQcryBEAM7Zuq", + "name": "go-key", + "version": "1.0.0" } ], "gxVersion": "0.4.0", diff --git a/table_test.go b/table_test.go index 563c115..eb82cb7 100644 --- a/table_test.go +++ b/table_test.go @@ -5,9 +5,9 @@ import ( "testing" "time" - tu "github.com/ipfs/go-ipfs/thirdparty/testutil" peer "github.com/ipfs/go-libp2p-peer" pstore "github.com/ipfs/go-libp2p-peerstore" + tu "github.com/libp2p/go-testutil" ) // Test basic features of the bucket struct From d401aca3ac8726e9832e02b5cc2131ce89bd6994 Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Wed, 31 Aug 2016 16:59:57 +0100 Subject: [PATCH 75/76] Publish gx v1.0.0 --- .gx/lastpubver | 1 + package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 .gx/lastpubver diff --git a/.gx/lastpubver b/.gx/lastpubver new file mode 100644 index 0000000..fa2097e --- /dev/null +++ b/.gx/lastpubver @@ -0,0 +1 @@ +1.0.0: QmbS7NcH4KqZL71ZwzVZAt1CpVpAtUBaHXuDenjnXF78Wa diff --git a/package.json b/package.json index a3211a3..a6187fc 100644 --- a/package.json +++ b/package.json @@ -44,5 +44,5 @@ "language": "go", "license": "MIT", "name": "go-libp2p-kbucket", - "version": "0.0.0" + "version": "1.0.0" } From e8919b206f085f75f272883b2daa3e7eb4d1056a Mon Sep 17 00:00:00 2001 From: George Antoniadis Date: Wed, 31 Aug 2016 17:05:19 +0100 Subject: [PATCH 76/76] Move to go 1.7 --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3173bb8..6ccdbf6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ os: language: go go: - - 1.5.2 + - 1.7 env: - GO15VENDOREXPERIMENT=1