From cd2735b8b517ed99993b122597866e46a681a64d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rau=CC=81l=20Kripalani?= Date: Wed, 29 Aug 2018 15:12:41 +0100 Subject: [PATCH 01/18] refactor peerstore (+) 1. Create interface.go with abstract interfaces. 2. Extract memory-based keybook into file. 3. Spin off PeerMetadata interface. --- p2p/host/peerstore/addr_manager.go | 8 +- p2p/host/peerstore/addr_manager_test.go | 1 - .../addr_manager.go} | 50 ++-- p2p/host/peerstore/ds/peerstore.go | 20 ++ p2p/host/peerstore/interface.go | 93 +++++++ p2p/host/peerstore/keybook.go | 91 +++++++ p2p/host/peerstore/metadata.go | 43 ++++ p2p/host/peerstore/peerinfo.go | 2 +- p2p/host/peerstore/peerstore.go | 242 ++---------------- p2p/host/peerstore/peerstore_test.go | 3 +- 10 files changed, 310 insertions(+), 243 deletions(-) rename p2p/host/peerstore/{addr_manager_ds.go => ds/addr_manager.go} (83%) create mode 100644 p2p/host/peerstore/ds/peerstore.go create mode 100644 p2p/host/peerstore/interface.go create mode 100644 p2p/host/peerstore/keybook.go create mode 100644 p2p/host/peerstore/metadata.go diff --git a/p2p/host/peerstore/addr_manager.go b/p2p/host/peerstore/addr_manager.go index c20e54cbb3..b0db2b60e9 100644 --- a/p2p/host/peerstore/addr_manager.go +++ b/p2p/host/peerstore/addr_manager.go @@ -7,11 +7,14 @@ import ( "sync" "time" + logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-peer" "github.com/libp2p/go-libp2p-peerstore/addr" ma "github.com/multiformats/go-multiaddr" ) +var log = logging.Logger("peerstore") + var ( // TempAddrTTL is the ttl used for a short lived address @@ -54,6 +57,8 @@ func (e *expiringAddr) ExpiredBy(t time.Time) bool { type addrSlice []expiringAddr +var _ AddrBook = (*AddrManager)(nil) + // AddrManager manages addresses. // The zero-value is ready to be used. type AddrManager struct { @@ -74,7 +79,7 @@ func (mgr *AddrManager) init() { } } -func (mgr *AddrManager) Peers() []peer.ID { +func (mgr *AddrManager) AddrsPeers() []peer.ID { mgr.addrmu.Lock() defer mgr.addrmu.Unlock() if mgr.addrs == nil { @@ -197,6 +202,7 @@ func (mgr *AddrManager) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time } exp := time.Now().Add(newTTL) + // TODO: RK - Shorthand. for i := range addrs { aexp := &addrs[i] if oldTTL == aexp.TTL { diff --git a/p2p/host/peerstore/addr_manager_test.go b/p2p/host/peerstore/addr_manager_test.go index 8498bc9368..50eda9bc08 100644 --- a/p2p/host/peerstore/addr_manager_test.go +++ b/p2p/host/peerstore/addr_manager_test.go @@ -8,7 +8,6 @@ import ( "time" "github.com/ipfs/go-datastore" - "github.com/ipfs/go-ds-badger" "github.com/libp2p/go-libp2p-peer" ma "github.com/multiformats/go-multiaddr" ) diff --git a/p2p/host/peerstore/addr_manager_ds.go b/p2p/host/peerstore/ds/addr_manager.go similarity index 83% rename from p2p/host/peerstore/addr_manager_ds.go rename to p2p/host/peerstore/ds/addr_manager.go index a5b71abcab..e00023de50 100644 --- a/p2p/host/peerstore/addr_manager_ds.go +++ b/p2p/host/peerstore/ds/addr_manager.go @@ -1,4 +1,4 @@ -package peerstore +package ds import ( "context" @@ -8,43 +8,49 @@ import ( "github.com/hashicorp/golang-lru" ds "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/query" + logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" ma "github.com/multiformats/go-multiaddr" mh "github.com/multiformats/go-multihash" ) +var log = logging.Logger("peerstore/ds") + // Number of times to retry transactional writes var dsWriteRetries = 5 -// DatastoreAddrManager is an address manager backed by a Datastore with both an +var _ pstore.AddrBook = (*addrManager)(nil) + +// addrManager is an address manager backed by a Datastore with both an // in-memory TTL manager and an in-memory address stream manager. -type DatastoreAddrManager struct { +type addrManager struct { cache *lru.ARCCache ds ds.Batching ttlManager *ttlmanager - subsManager *AddrSubManager + subsManager *pstore.AddrSubManager } -// NewDatastoreAddrManager initializes a new DatastoreAddrManager given a -// Datastore instance, a context for managing the TTL manager, and the interval -// at which the TTL manager should sweep the Datastore. -func NewDatastoreAddrManager(ctx context.Context, ds ds.Batching, ttlInterval time.Duration) (*DatastoreAddrManager, error) { +// NewAddrManager initializes a new address manager given a +// Datastore instance, a context for managing the TTL manager, +// and the interval at which the TTL manager should sweep the Datastore. +func NewAddrManager(ctx context.Context, ds ds.Batching, ttlInterval time.Duration) (*addrManager, error) { cache, err := lru.NewARC(1024) if err != nil { return nil, err } - mgr := &DatastoreAddrManager{ + mgr := &addrManager{ cache: cache, ds: ds, ttlManager: newTTLManager(ctx, ds, cache, ttlInterval), - subsManager: NewAddrSubManager(), + subsManager: pstore.NewAddrSubManager(), } return mgr, nil } // Stop will signal the TTL manager to stop and block until it returns. -func (mgr *DatastoreAddrManager) Stop() { +func (mgr *addrManager) Stop() { mgr.ttlManager.cancel() } @@ -62,12 +68,12 @@ func peerIDFromKey(key ds.Key) (peer.ID, error) { } // AddAddr will add a new address if it's not already in the AddrBook. -func (mgr *DatastoreAddrManager) AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { +func (mgr *addrManager) AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { mgr.AddAddrs(p, []ma.Multiaddr{addr}, ttl) } // AddAddrs will add many new addresses if they're not already in the AddrBook. -func (mgr *DatastoreAddrManager) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { +func (mgr *addrManager) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { if ttl <= 0 { return } @@ -76,16 +82,16 @@ func (mgr *DatastoreAddrManager) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl t } // SetAddr will add or update the TTL of an address in the AddrBook. -func (mgr *DatastoreAddrManager) SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { +func (mgr *addrManager) SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { mgr.SetAddrs(p, []ma.Multiaddr{addr}, ttl) } // SetAddrs will add or update the TTLs of addresses in the AddrBook. -func (mgr *DatastoreAddrManager) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { +func (mgr *addrManager) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { mgr.setAddrs(p, addrs, ttl, false) } -func (mgr *DatastoreAddrManager) setAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration, add bool) { +func (mgr *addrManager) setAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration, add bool) { for i := 0; i < dsWriteRetries; i++ { // keys to add to the TTL manager var keys []ds.Key @@ -145,13 +151,13 @@ func (mgr *DatastoreAddrManager) setAddrs(p peer.ID, addrs []ma.Multiaddr, ttl t // UpdateAddrs will update any addresses for a given peer and TTL combination to // have a new TTL. -func (mgr *DatastoreAddrManager) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) { +func (mgr *addrManager) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) { prefix := ds.NewKey(p.Pretty()) mgr.ttlManager.updateTTLs(prefix, oldTTL, newTTL) } // Addrs Returns all of the non-expired addresses for a given peer. -func (mgr *DatastoreAddrManager) Addrs(p peer.ID) []ma.Multiaddr { +func (mgr *addrManager) Addrs(p peer.ID) []ma.Multiaddr { prefix := ds.NewKey(p.Pretty()) q := query.Query{Prefix: prefix.String(), KeysOnly: true} results, err := mgr.ds.Query(q) @@ -185,7 +191,7 @@ func (mgr *DatastoreAddrManager) Addrs(p peer.ID) []ma.Multiaddr { } // Peers returns all of the peer IDs for which the AddrBook has addresses. -func (mgr *DatastoreAddrManager) Peers() []peer.ID { +func (mgr *addrManager) AddrsPeers() []peer.ID { q := query.Query{KeysOnly: true} results, err := mgr.ds.Query(q) if err != nil { @@ -212,13 +218,13 @@ func (mgr *DatastoreAddrManager) Peers() []peer.ID { // AddrStream returns a channel on which all new addresses discovered for a // given peer ID will be published. -func (mgr *DatastoreAddrManager) AddrStream(ctx context.Context, p peer.ID) <-chan ma.Multiaddr { +func (mgr *addrManager) AddrStream(ctx context.Context, p peer.ID) <-chan ma.Multiaddr { initial := mgr.Addrs(p) return mgr.subsManager.AddrStream(ctx, p, initial) } // ClearAddrs will delete all known addresses for a peer ID. -func (mgr *DatastoreAddrManager) ClearAddrs(p peer.ID) { +func (mgr *addrManager) ClearAddrs(p peer.ID) { prefix := ds.NewKey(p.Pretty()) for i := 0; i < dsWriteRetries; i++ { q := query.Query{Prefix: prefix.String(), KeysOnly: true} @@ -254,8 +260,6 @@ func (mgr *DatastoreAddrManager) ClearAddrs(p peer.ID) { log.Errorf("failed to clear addresses for peer %s after %d attempts\n", p.Pretty(), dsWriteRetries) } -// ttlmanager - type ttlentry struct { TTL time.Duration ExpiresAt time.Time diff --git a/p2p/host/peerstore/ds/peerstore.go b/p2p/host/peerstore/ds/peerstore.go new file mode 100644 index 0000000000..f48263379b --- /dev/null +++ b/p2p/host/peerstore/ds/peerstore.go @@ -0,0 +1,20 @@ +package ds + +import ( + "context" + "time" + + "github.com/ipfs/go-datastore" + pstore "github.com/libp2p/go-libp2p-peerstore" +) + +// NewPeerstore creates a peerstore backed by the provided persistent datastore. +func NewPeerstore(ctx context.Context, ds datastore.Batching) (pstore.Peerstore, error) { + addrBook, err := NewAddrManager(ctx, ds, time.Second) + if err != nil { + return nil, err + } + + ps := pstore.NewPeerstoreWith(pstore.NewKeybook(), addrBook, pstore.NewPeerMetadata()) + return ps, nil +} diff --git a/p2p/host/peerstore/interface.go b/p2p/host/peerstore/interface.go new file mode 100644 index 0000000000..e0c0a6233c --- /dev/null +++ b/p2p/host/peerstore/interface.go @@ -0,0 +1,93 @@ +package peerstore + +import ( + "context" + "time" + + "gx/ipfs/QmVmDhyTTUcQXFD1rRQ64fGLMSAoaQvNH3hwuaCFAPq2hy/errors" + + ic "github.com/libp2p/go-libp2p-crypto" + "github.com/libp2p/go-libp2p-peer" + ma "github.com/multiformats/go-multiaddr" +) + +var ErrNotFound = errors.New("item not found") + +// Peerstore provides a threadsafe store of Peer related +// information. +type Peerstore interface { + AddrBook + KeyBook + PeerMetadata + Metrics + + // PeerInfo returns a peer.PeerInfo struct for given peer.ID. + // This is a small slice of the information Peerstore has on + // that peer, useful to other services. + PeerInfo(peer.ID) PeerInfo + + GetProtocols(peer.ID) ([]string, error) + AddProtocols(peer.ID, ...string) error + SetProtocols(peer.ID, ...string) error + SupportsProtocols(peer.ID, ...string) ([]string, error) + + // Peers returns all of the peer IDs stored across all inner stores. + Peers() []peer.ID +} + +type PeerMetadata interface { + // Get/Put is a simple registry for other peer-related key/value pairs. + // if we find something we use often, it should become its own set of + // methods. this is a last resort. + Get(p peer.ID, key string) (interface{}, error) + Put(p peer.ID, key string, val interface{}) error +} + +// AddrBook is an interface that fits the new AddrManager. I'm patching +// it up in here to avoid changing a ton of the codebase. +type AddrBook interface { + + // AddAddr calls AddAddrs(p, []ma.Multiaddr{addr}, ttl) + AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) + + // AddAddrs gives AddrManager addresses to use, with a given ttl + // (time-to-live), after which the address is no longer valid. + // If the manager has a longer TTL, the operation is a no-op for that address + AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) + + // SetAddr calls mgr.SetAddrs(p, addr, ttl) + SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) + + // SetAddrs sets the ttl on addresses. This clears any TTL there previously. + // This is used when we receive the best estimate of the validity of an address. + SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) + + // UpdateAddrs updates the addresses associated with the given peer that have + // the given oldTTL to have the given newTTL. + UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) + + // Addresses returns all known (and valid) addresses for a given peer + Addrs(p peer.ID) []ma.Multiaddr + + // AddrStream returns a channel that gets all addresses for a given + // peer sent on it. If new addresses are added after the call is made + // they will be sent along through the channel as well. + AddrStream(context.Context, peer.ID) <-chan ma.Multiaddr + + // ClearAddresses removes all previously stored addresses + ClearAddrs(p peer.ID) + + // Peers returns all of the peer IDs stored in the AddrBook + AddrsPeers() []peer.ID +} + +// KeyBook tracks the Public keys of Peers. +type KeyBook interface { + KeyBookPeers() []peer.ID + + PubKey(peer.ID) ic.PubKey + AddPubKey(peer.ID, ic.PubKey) error + + PrivKey(peer.ID) ic.PrivKey + AddPrivKey(peer.ID, ic.PrivKey) error +} diff --git a/p2p/host/peerstore/keybook.go b/p2p/host/peerstore/keybook.go new file mode 100644 index 0000000000..1a9e6b95b8 --- /dev/null +++ b/p2p/host/peerstore/keybook.go @@ -0,0 +1,91 @@ +package peerstore + +import ( + "errors" + "sync" + + ic "github.com/libp2p/go-libp2p-crypto" + "github.com/libp2p/go-libp2p-peer" +) + +type memoryKeyBook struct { + sync.RWMutex // same lock. wont happen a ton. + pks map[peer.ID]ic.PubKey + sks map[peer.ID]ic.PrivKey +} + +var _ KeyBook = (*memoryKeyBook)(nil) + +// noop new, but in the future we may want to do some init work. +func NewKeybook() KeyBook { + return &memoryKeyBook{ + pks: map[peer.ID]ic.PubKey{}, + sks: map[peer.ID]ic.PrivKey{}, + } +} + +func (mkb *memoryKeyBook) KeyBookPeers() []peer.ID { + mkb.RLock() + ps := make([]peer.ID, 0, len(mkb.pks)+len(mkb.sks)) + for p := range mkb.pks { + ps = append(ps, p) + } + for p := range mkb.sks { + if _, found := mkb.pks[p]; !found { + ps = append(ps, p) + } + } + mkb.RUnlock() + return ps +} + +func (mkb *memoryKeyBook) PubKey(p peer.ID) ic.PubKey { + mkb.RLock() + pk := mkb.pks[p] + mkb.RUnlock() + if pk != nil { + return pk + } + pk, err := p.ExtractPublicKey() + if err == nil && pk != nil { + mkb.Lock() + mkb.pks[p] = pk + mkb.Unlock() + } + return pk +} + +func (mkb *memoryKeyBook) AddPubKey(p peer.ID, pk ic.PubKey) error { + // check it's correct first + if !p.MatchesPublicKey(pk) { + return errors.New("ID does not match PublicKey") + } + + mkb.Lock() + mkb.pks[p] = pk + mkb.Unlock() + return nil +} + +func (mkb *memoryKeyBook) PrivKey(p peer.ID) ic.PrivKey { + mkb.RLock() + sk := mkb.sks[p] + mkb.RUnlock() + return sk +} + +func (mkb *memoryKeyBook) AddPrivKey(p peer.ID, sk ic.PrivKey) error { + if sk == nil { + return errors.New("sk is nil (PrivKey)") + } + + // check it's correct first + if !p.MatchesPrivateKey(sk) { + return errors.New("ID does not match PrivateKey") + } + + mkb.Lock() + mkb.sks[p] = sk + mkb.Unlock() + return nil +} diff --git a/p2p/host/peerstore/metadata.go b/p2p/host/peerstore/metadata.go new file mode 100644 index 0000000000..1f6f5ce3de --- /dev/null +++ b/p2p/host/peerstore/metadata.go @@ -0,0 +1,43 @@ +package peerstore + +import ( + "sync" + + "github.com/libp2p/go-libp2p-peer" +) + +type memoryPeerMetadata struct { + // store other data, like versions + //ds ds.ThreadSafeDatastore + // TODO: use a datastore for this + ds map[string]interface{} + dslock sync.Mutex +} + +func NewPeerMetadata() PeerMetadata { + return &memoryPeerMetadata{ + ds: make(map[string]interface{}), + } +} + +func (ps *memoryPeerMetadata) Put(p peer.ID, key string, val interface{}) error { + //dsk := ds.NewKey(string(p) + "/" + key) + //return ps.ds.Put(dsk, val) + ps.dslock.Lock() + defer ps.dslock.Unlock() + ps.ds[string(p)+"/"+key] = val + return nil +} + +func (ps *memoryPeerMetadata) Get(p peer.ID, key string) (interface{}, error) { + //dsk := ds.NewKey(string(p) + "/" + key) + //return ps.ds.Get(dsk) + + ps.dslock.Lock() + defer ps.dslock.Unlock() + i, ok := ps.ds[string(p)+"/"+key] + if !ok { + return nil, ErrNotFound + } + return i, nil +} diff --git a/p2p/host/peerstore/peerinfo.go b/p2p/host/peerstore/peerinfo.go index cb216264b5..f41b9f85ad 100644 --- a/p2p/host/peerstore/peerinfo.go +++ b/p2p/host/peerstore/peerinfo.go @@ -58,7 +58,7 @@ func InfoFromP2pAddr(m ma.Multiaddr) (*PeerInfo, error) { } func InfoToP2pAddrs(pi *PeerInfo) ([]ma.Multiaddr, error) { - addrs := []ma.Multiaddr{} + var addrs []ma.Multiaddr tpl := "/" + ma.ProtocolWithCode(ma.P_IPFS).Name + "/" for _, addr := range pi.Addrs { p2paddr, err := ma.NewMultiaddr(tpl + peer.IDB58Encode(pi.ID)) diff --git a/p2p/host/peerstore/peerstore.go b/p2p/host/peerstore/peerstore.go index 84f1a68211..b127c4e30e 100644 --- a/p2p/host/peerstore/peerstore.go +++ b/p2p/host/peerstore/peerstore.go @@ -1,254 +1,64 @@ package peerstore import ( - "context" - "errors" "fmt" "sync" "time" - ic "github.com/libp2p/go-libp2p-crypto" - - //ds "github.com/jbenet/go-datastore" - //dssync "github.com/jbenet/go-datastore/sync" - "github.com/ipfs/go-datastore" - logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-peer" - ma "github.com/multiformats/go-multiaddr" ) -var log = logging.Logger("peerstore") - const ( // AddressTTL is the expiration time of addresses. AddressTTL = time.Hour ) -// Peerstore provides a threadsafe store of Peer related -// information. -type Peerstore interface { - AddrBook - KeyBook - Metrics - - // PeerInfo returns a peer.PeerInfo struct for given peer.ID. - // This is a small slice of the information Peerstore has on - // that peer, useful to other services. - PeerInfo(peer.ID) PeerInfo - - // Get/Put is a simple registry for other peer-related key/value pairs. - // if we find something we use often, it should become its own set of - // methods. this is a last resort. - Get(id peer.ID, key string) (interface{}, error) - Put(id peer.ID, key string, val interface{}) error - - GetProtocols(peer.ID) ([]string, error) - AddProtocols(peer.ID, ...string) error - SetProtocols(peer.ID, ...string) error - SupportsProtocols(peer.ID, ...string) ([]string, error) -} - -// AddrBook is an interface that fits the new AddrManager. I'm patching -// it up in here to avoid changing a ton of the codebase. -type AddrBook interface { - - // AddAddr calls AddAddrs(p, []ma.Multiaddr{addr}, ttl) - AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) - - // AddAddrs gives AddrManager addresses to use, with a given ttl - // (time-to-live), after which the address is no longer valid. - // If the manager has a longer TTL, the operation is a no-op for that address - AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) - - // SetAddr calls mgr.SetAddrs(p, addr, ttl) - SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) - - // SetAddrs sets the ttl on addresses. This clears any TTL there previously. - // This is used when we receive the best estimate of the validity of an address. - SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) - - // UpdateAddrs updates the addresses associated with the given peer that have - // the given oldTTL to have the given newTTL. - UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) - - // Addresses returns all known (and valid) addresses for a given peer - Addrs(p peer.ID) []ma.Multiaddr - - // AddrStream returns a channel that gets all addresses for a given - // peer sent on it. If new addresses are added after the call is made - // they will be sent along through the channel as well. - AddrStream(context.Context, peer.ID) <-chan ma.Multiaddr - - // ClearAddresses removes all previously stored addresses - ClearAddrs(p peer.ID) - - // Peers returns all of the peer IDs stored in the AddrBook - Peers() []peer.ID -} - -// KeyBook tracks the Public keys of Peers. -type KeyBook interface { - PubKey(peer.ID) ic.PubKey - AddPubKey(peer.ID, ic.PubKey) error - - PrivKey(peer.ID) ic.PrivKey - AddPrivKey(peer.ID, ic.PrivKey) error -} - -type keybook struct { - pks map[peer.ID]ic.PubKey - sks map[peer.ID]ic.PrivKey - - sync.RWMutex // same lock. wont happen a ton. -} - -func newKeybook() *keybook { - return &keybook{ - pks: map[peer.ID]ic.PubKey{}, - sks: map[peer.ID]ic.PrivKey{}, - } -} - -func (kb *keybook) Peers() []peer.ID { - kb.RLock() - ps := make([]peer.ID, 0, len(kb.pks)+len(kb.sks)) - for p := range kb.pks { - ps = append(ps, p) - } - for p := range kb.sks { - if _, found := kb.pks[p]; !found { - ps = append(ps, p) - } - } - kb.RUnlock() - return ps -} - -func (kb *keybook) PubKey(p peer.ID) ic.PubKey { - kb.RLock() - pk := kb.pks[p] - kb.RUnlock() - if pk != nil { - return pk - } - pk, err := p.ExtractPublicKey() - if err == nil && pk != nil { - kb.Lock() - kb.pks[p] = pk - kb.Unlock() - } - return pk -} - -func (kb *keybook) AddPubKey(p peer.ID, pk ic.PubKey) error { - - // check it's correct first - if !p.MatchesPublicKey(pk) { - return errors.New("ID does not match PublicKey") - } - - kb.Lock() - kb.pks[p] = pk - kb.Unlock() - return nil -} - -func (kb *keybook) PrivKey(p peer.ID) ic.PrivKey { - kb.RLock() - sk := kb.sks[p] - kb.RUnlock() - return sk -} - -func (kb *keybook) AddPrivKey(p peer.ID, sk ic.PrivKey) error { - - if sk == nil { - return errors.New("sk is nil (PrivKey)") - } - - // check it's correct first - if !p.MatchesPrivateKey(sk) { - return errors.New("ID does not match PrivateKey") - } - - kb.Lock() - kb.sks[p] = sk - kb.Unlock() - return nil -} +var _ Peerstore = (*peerstore)(nil) type peerstore struct { - *keybook - *metrics - AddrBook + Metrics - // store other data, like versions - //ds ds.ThreadSafeDatastore - // TODO: use a datastore for this - ds map[string]interface{} - dslock sync.Mutex + KeyBook + AddrBook + PeerMetadata // lock for protocol information, separate from datastore lock protolock sync.Mutex } // NewPeerstore creates a threadsafe collection of peers. +// +// TODO: (RK) move in-memory AddrBook, KeyBook and PeerMetadata to mem +// package. Adapt consumers (IPFS) to instantiate mem.NewPeerstore(). +// +// Preserving this function for backwards compatibility is not possible, as +// we would have to import the mem package, which in turn imports this one, thus +// creating a cycle. +// +// DEPRECATED: use an implementation-specific peerstore. func NewPeerstore() Peerstore { - return &peerstore{ - keybook: newKeybook(), - metrics: NewMetrics(), - AddrBook: &AddrManager{}, - ds: make(map[string]interface{}), - } + return NewPeerstoreWith(NewKeybook(), &AddrManager{}, NewPeerMetadata()) } -// NewPeerstoreDatastore creates a threadsafe collection of peers backed by a -// Datastore to prevent excess memory pressure. -func NewPeerstoreDatastore(ctx context.Context, ds datastore.Batching) (Peerstore, error) { - addrBook, err := NewDatastoreAddrManager(ctx, ds, time.Second) - if err != nil { - return nil, err - } - - ps := &peerstore{ - keybook: newKeybook(), - metrics: NewMetrics(), - AddrBook: addrBook, - ds: make(map[string]interface{}), - } - return ps, nil -} - -func (ps *peerstore) Put(p peer.ID, key string, val interface{}) error { - //dsk := ds.NewKey(string(p) + "/" + key) - //return ps.ds.Put(dsk, val) - ps.dslock.Lock() - defer ps.dslock.Unlock() - ps.ds[string(p)+"/"+key] = val - return nil -} - -var ErrNotFound = errors.New("item not found") - -func (ps *peerstore) Get(p peer.ID, key string) (interface{}, error) { - //dsk := ds.NewKey(string(p) + "/" + key) - //return ps.ds.Get(dsk) +// NewPeerstore creates a threadsafe collection of peers. +func NewPeerstoreWith(kb KeyBook, ab AddrBook, md PeerMetadata) Peerstore { + return &peerstore{ + KeyBook: kb, + PeerMetadata: md, - ps.dslock.Lock() - defer ps.dslock.Unlock() - i, ok := ps.ds[string(p)+"/"+key] - if !ok { - return nil, ErrNotFound + // TODO: normalise the naming here AddrBook vs AddrManager. + // TODO: add a constructor NewAddrBook and make the struct private. + AddrBook: ab, + Metrics: NewMetrics(), } - return i, nil } func (ps *peerstore) Peers() []peer.ID { set := map[peer.ID]struct{}{} - for _, p := range ps.keybook.Peers() { + for _, p := range ps.KeyBookPeers() { set[p] = struct{}{} } - for _, p := range ps.AddrBook.Peers() { + for _, p := range ps.AddrsPeers() { set[p] = struct{}{} } diff --git a/p2p/host/peerstore/peerstore_test.go b/p2p/host/peerstore/peerstore_test.go index d402be07d8..ff3bf3b93d 100644 --- a/p2p/host/peerstore/peerstore_test.go +++ b/p2p/host/peerstore/peerstore_test.go @@ -10,6 +10,7 @@ import ( "github.com/libp2p/go-libp2p-crypto" "github.com/libp2p/go-libp2p-peer" + dspstore "github.com/libp2p/go-libp2p-peerstore/ds" ma "github.com/multiformats/go-multiaddr" ) @@ -41,7 +42,7 @@ func runTestWithPeerstores(t *testing.T, testFunc func(*testing.T, Peerstore)) { func setupDatastorePeerstore(t testing.TB) (Peerstore, func()) { ds, closeDB := setupBadgerDatastore(t) ctx, cancel := context.WithCancel(context.Background()) - ps, err := NewPeerstoreDatastore(ctx, ds) + ps, err := dspstore.NewPeerstore(ctx, ds) if err != nil { t.Fatal(err) } From d1f0a910813905718c6798a83500f6f24387099f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rau=CC=81l=20Kripalani?= Date: Thu, 30 Aug 2018 13:44:50 +0100 Subject: [PATCH 02/18] refactor tests into suites. This enables each implementation to subject itself to a common test suite. --- p2p/host/peerstore/addr_manager_test.go | 307 ---------------- p2p/host/peerstore/ds/ds_test.go | 68 ++++ p2p/host/peerstore/inmem_test.go | 25 ++ p2p/host/peerstore/peerstore_test.go | 337 ------------------ p2p/host/peerstore/test/addr_manager_suite.go | 279 +++++++++++++++ .../peerstore/{ => test}/benchmark_utils.go | 2 +- p2p/host/peerstore/test/peerstore_suite.go | 316 ++++++++++++++++ .../test/{utils.go => test_utils.go} | 2 +- 8 files changed, 690 insertions(+), 646 deletions(-) delete mode 100644 p2p/host/peerstore/addr_manager_test.go create mode 100644 p2p/host/peerstore/ds/ds_test.go create mode 100644 p2p/host/peerstore/inmem_test.go delete mode 100644 p2p/host/peerstore/peerstore_test.go create mode 100644 p2p/host/peerstore/test/addr_manager_suite.go rename p2p/host/peerstore/{ => test}/benchmark_utils.go (97%) create mode 100644 p2p/host/peerstore/test/peerstore_suite.go rename p2p/host/peerstore/test/{utils.go => test_utils.go} (97%) diff --git a/p2p/host/peerstore/addr_manager_test.go b/p2p/host/peerstore/addr_manager_test.go deleted file mode 100644 index 50eda9bc08..0000000000 --- a/p2p/host/peerstore/addr_manager_test.go +++ /dev/null @@ -1,307 +0,0 @@ -package peerstore - -import ( - "context" - "io/ioutil" - "os" - "testing" - "time" - - "github.com/ipfs/go-datastore" - "github.com/libp2p/go-libp2p-peer" - ma "github.com/multiformats/go-multiaddr" -) - -func IDS(t *testing.T, ids string) peer.ID { - t.Helper() - id, err := peer.IDB58Decode(ids) - if err != nil { - t.Fatalf("id %q is bad: %s", ids, err) - } - return id -} - -func MA(t *testing.T, m string) ma.Multiaddr { - t.Helper() - maddr, err := ma.NewMultiaddr(m) - if err != nil { - t.Fatal(err) - } - return maddr -} - -func testHas(t *testing.T, exp, act []ma.Multiaddr) { - t.Helper() - if len(exp) != len(act) { - t.Fatalf("lengths not the same. expected %d, got %d\n", len(exp), len(act)) - } - - for _, a := range exp { - found := false - - for _, b := range act { - if a.Equal(b) { - found = true - break - } - } - - if !found { - t.Fatalf("expected address %s not found", a) - } - } -} - -func setupBadgerDatastore(t testing.TB) (datastore.Batching, func()) { - dataPath, err := ioutil.TempDir(os.TempDir(), "badger") - if err != nil { - t.Fatal(err) - } - ds, err := badger.NewDatastore(dataPath, nil) - if err != nil { - t.Fatal(err) - } - closer := func() { - ds.Close() - os.RemoveAll(dataPath) - } - return ds, closer -} - -func setupDatastoreAddrManager(t *testing.T) (*DatastoreAddrManager, func()) { - ds, closeDB := setupBadgerDatastore(t) - mgr, err := NewDatastoreAddrManager(context.Background(), ds, 100*time.Microsecond) - if err != nil { - t.Fatal(err) - } - closer := func() { - mgr.Stop() - closeDB() - } - return mgr, closer -} - -func runTestWithAddrManagers(t *testing.T, test func(*testing.T, AddrBook)) { - t.Log("AddrManager") - mgr1 := &AddrManager{} - test(t, mgr1) - - t.Log("DatastoreAddrManager") - mgr2, closer2 := setupDatastoreAddrManager(t) - defer closer2() - test(t, mgr2) -} - -func testAddresses(t *testing.T, m AddrBook) { - id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") - id2 := IDS(t, "QmRmPL3FDZKE3Qiwv1RosLdwdvbvg17b2hB39QPScgWKKZ") - id3 := IDS(t, "QmPhi7vBsChP7sjRoZGgg7bcKqF6MmCcQwvRbDte8aJ6Kn") - id4 := IDS(t, "QmPhi7vBsChP7sjRoZGgg7bcKqF6MmCcQwvRbDte8aJ5Kn") - id5 := IDS(t, "QmPhi7vBsChP7sjRoZGgg7bcKqF6MmCcQwvRbDte8aJ5Km") - - ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111") - ma21 := MA(t, "/ip4/2.2.3.2/tcp/1111") - ma22 := MA(t, "/ip4/2.2.3.2/tcp/2222") - ma31 := MA(t, "/ip4/3.2.3.3/tcp/1111") - ma32 := MA(t, "/ip4/3.2.3.3/tcp/2222") - ma33 := MA(t, "/ip4/3.2.3.3/tcp/3333") - ma41 := MA(t, "/ip4/4.2.3.3/tcp/1111") - ma42 := MA(t, "/ip4/4.2.3.3/tcp/2222") - ma43 := MA(t, "/ip4/4.2.3.3/tcp/3333") - ma44 := MA(t, "/ip4/4.2.3.3/tcp/4444") - ma51 := MA(t, "/ip4/5.2.3.3/tcp/1111") - ma52 := MA(t, "/ip4/5.2.3.3/tcp/2222") - ma53 := MA(t, "/ip4/5.2.3.3/tcp/3333") - ma54 := MA(t, "/ip4/5.2.3.3/tcp/4444") - ma55 := MA(t, "/ip4/5.2.3.3/tcp/5555") - - ttl := time.Hour - m.AddAddr(id1, ma11, ttl) - - m.AddAddrs(id2, []ma.Multiaddr{ma21, ma22}, ttl) - m.AddAddrs(id2, []ma.Multiaddr{ma21, ma22}, ttl) // idempotency - - m.AddAddr(id3, ma31, ttl) - m.AddAddr(id3, ma32, ttl) - m.AddAddr(id3, ma33, ttl) - m.AddAddr(id3, ma33, ttl) // idempotency - m.AddAddr(id3, ma33, ttl) - - m.AddAddrs(id4, []ma.Multiaddr{ma41, ma42, ma43, ma44}, ttl) // multiple - - m.AddAddrs(id5, []ma.Multiaddr{ma21, ma22}, ttl) // clearing - m.AddAddrs(id5, []ma.Multiaddr{ma41, ma42, ma43, ma44}, ttl) // clearing - m.ClearAddrs(id5) - m.AddAddrs(id5, []ma.Multiaddr{ma51, ma52, ma53, ma54, ma55}, ttl) // clearing - - // test the Addresses return value - testHas(t, []ma.Multiaddr{ma11}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma21, ma22}, m.Addrs(id2)) - testHas(t, []ma.Multiaddr{ma31, ma32, ma33}, m.Addrs(id3)) - testHas(t, []ma.Multiaddr{ma41, ma42, ma43, ma44}, m.Addrs(id4)) - testHas(t, []ma.Multiaddr{ma51, ma52, ma53, ma54, ma55}, m.Addrs(id5)) -} - -func TestAddresses(t *testing.T) { - runTestWithAddrManagers(t, testAddresses) -} - -func testAddressesExpire(t *testing.T, m AddrBook) { - id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") - id2 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQM") - ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111") - ma12 := MA(t, "/ip4/2.2.3.2/tcp/2222") - ma13 := MA(t, "/ip4/3.2.3.3/tcp/3333") - ma24 := MA(t, "/ip4/4.2.3.3/tcp/4444") - ma25 := MA(t, "/ip4/5.2.3.3/tcp/5555") - - m.AddAddr(id1, ma11, time.Hour) - m.AddAddr(id1, ma12, time.Hour) - m.AddAddr(id1, ma13, time.Hour) - m.AddAddr(id2, ma24, time.Hour) - m.AddAddr(id2, ma25, time.Hour) - - testHas(t, []ma.Multiaddr{ma11, ma12, ma13}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) - - m.SetAddr(id1, ma11, 2*time.Hour) - m.SetAddr(id1, ma12, 2*time.Hour) - m.SetAddr(id1, ma13, 2*time.Hour) - m.SetAddr(id2, ma24, 2*time.Hour) - m.SetAddr(id2, ma25, 2*time.Hour) - - testHas(t, []ma.Multiaddr{ma11, ma12, ma13}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) - - m.SetAddr(id1, ma11, time.Millisecond) - <-time.After(time.Millisecond * 2) - testHas(t, []ma.Multiaddr{ma12, ma13}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) - - m.SetAddr(id1, ma13, time.Millisecond) - <-time.After(time.Millisecond * 2) - testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) - - m.SetAddr(id2, ma24, time.Millisecond) - <-time.After(time.Millisecond * 2) - testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma25}, m.Addrs(id2)) - - m.SetAddr(id2, ma25, time.Millisecond) - <-time.After(time.Millisecond * 2) - testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) - testHas(t, nil, m.Addrs(id2)) - - m.SetAddr(id1, ma12, time.Millisecond) - <-time.After(time.Millisecond * 2) - testHas(t, nil, m.Addrs(id1)) - testHas(t, nil, m.Addrs(id2)) -} - -func TestAddressesExpire(t *testing.T) { - runTestWithAddrManagers(t, testAddressesExpire) -} - -func testClearWorks(t *testing.T, m AddrBook) { - id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") - id2 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQM") - ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111") - ma12 := MA(t, "/ip4/2.2.3.2/tcp/2222") - ma13 := MA(t, "/ip4/3.2.3.3/tcp/3333") - ma24 := MA(t, "/ip4/4.2.3.3/tcp/4444") - ma25 := MA(t, "/ip4/5.2.3.3/tcp/5555") - - m.AddAddr(id1, ma11, time.Hour) - m.AddAddr(id1, ma12, time.Hour) - m.AddAddr(id1, ma13, time.Hour) - m.AddAddr(id2, ma24, time.Hour) - m.AddAddr(id2, ma25, time.Hour) - - testHas(t, []ma.Multiaddr{ma11, ma12, ma13}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) - - m.ClearAddrs(id1) - m.ClearAddrs(id2) - - testHas(t, nil, m.Addrs(id1)) - testHas(t, nil, m.Addrs(id2)) -} - -func TestClearWorks(t *testing.T) { - runTestWithAddrManagers(t, testClearWorks) -} - -func testSetNegativeTTLClears(t *testing.T, m AddrBook) { - id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") - ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111") - - m.SetAddr(id1, ma11, time.Hour) - - testHas(t, []ma.Multiaddr{ma11}, m.Addrs(id1)) - - m.SetAddr(id1, ma11, -1) - - testHas(t, nil, m.Addrs(id1)) -} -func TestSetNegativeTTLClears(t *testing.T) { - runTestWithAddrManagers(t, testSetNegativeTTLClears) -} - -func testUpdateTTLs(t *testing.T, m AddrBook) { - id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") - id2 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQM") - ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111") - ma12 := MA(t, "/ip4/1.2.3.1/tcp/1112") - ma21 := MA(t, "/ip4/1.2.3.1/tcp/1121") - ma22 := MA(t, "/ip4/1.2.3.1/tcp/1122") - - // Shouldn't panic. - m.UpdateAddrs(id1, time.Hour, time.Minute) - - m.SetAddr(id1, ma11, time.Hour) - m.SetAddr(id1, ma12, time.Minute) - - // Shouldn't panic. - m.UpdateAddrs(id2, time.Hour, time.Minute) - - m.SetAddr(id2, ma21, time.Hour) - m.SetAddr(id2, ma22, time.Minute) - - testHas(t, []ma.Multiaddr{ma11, ma12}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma21, ma22}, m.Addrs(id2)) - - m.UpdateAddrs(id1, time.Hour, time.Second) - - testHas(t, []ma.Multiaddr{ma11, ma12}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma21, ma22}, m.Addrs(id2)) - - time.Sleep(1200 * time.Millisecond) - - testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma21, ma22}, m.Addrs(id2)) - - m.UpdateAddrs(id2, time.Hour, time.Second) - - testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma21, ma22}, m.Addrs(id2)) - - time.Sleep(1200 * time.Millisecond) - - testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) - testHas(t, []ma.Multiaddr{ma22}, m.Addrs(id2)) -} - -func TestUpdateTTLs(t *testing.T) { - runTestWithAddrManagers(t, testUpdateTTLs) -} - -func testNilAddrsDontBreak(t *testing.T, m AddrBook) { - id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") - m.SetAddr(id1, nil, time.Hour) - m.AddAddr(id1, nil, time.Hour) -} - -func TestNilAddrsDontBreak(t *testing.T) { - runTestWithAddrManagers(t, testNilAddrsDontBreak) -} diff --git a/p2p/host/peerstore/ds/ds_test.go b/p2p/host/peerstore/ds/ds_test.go new file mode 100644 index 0000000000..6f7adcd78e --- /dev/null +++ b/p2p/host/peerstore/ds/ds_test.go @@ -0,0 +1,68 @@ +package ds + +import ( + "context" + "io/ioutil" + "os" + "testing" + "time" + + "github.com/ipfs/go-datastore" + "github.com/ipfs/go-ds-badger" + "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-peerstore/test" +) + +func setupBadgerDatastore(t testing.TB) (datastore.Batching, func()) { + dataPath, err := ioutil.TempDir(os.TempDir(), "badger") + if err != nil { + t.Fatal(err) + } + ds, err := badger.NewDatastore(dataPath, nil) + if err != nil { + t.Fatal(err) + } + closer := func() { + ds.Close() + os.RemoveAll(dataPath) + } + return ds, closer +} + +func newPeerstoreFactory(tb testing.TB) test.PeerstoreFactory { + return func() (peerstore.Peerstore, func()) { + ds, closeFunc := setupBadgerDatastore(tb) + + ps, err := NewPeerstore(context.Background(), ds) + if err != nil { + tb.Fatal(err) + } + + return ps, closeFunc + } +} + +func TestBadgerDsPeerstore(t *testing.T) { + test.TestPeerstore(t, newPeerstoreFactory(t)) +} + +func TestBadgerDsAddrBook(t *testing.T) { + test.TestAddrMgr(t, func() (peerstore.AddrBook, func()) { + ds, closeDB := setupBadgerDatastore(t) + + mgr, err := NewAddrManager(context.Background(), ds, 100*time.Microsecond) + if err != nil { + t.Fatal(err) + } + + closeFunc := func() { + mgr.Stop() + closeDB() + } + return mgr, closeFunc + }) +} + +func BenchmarkBadgerDsPeerstore(b *testing.B) { + test.BenchmarkPeerstore(b, newPeerstoreFactory(b)) +} \ No newline at end of file diff --git a/p2p/host/peerstore/inmem_test.go b/p2p/host/peerstore/inmem_test.go new file mode 100644 index 0000000000..6b1a012c0f --- /dev/null +++ b/p2p/host/peerstore/inmem_test.go @@ -0,0 +1,25 @@ +package peerstore + +import ( + "testing" + + "github.com/libp2p/go-libp2p-peerstore/test" +) + +func TestInMemoryPeerstore(t *testing.T) { + test.TestPeerstore(t, func() (Peerstore, func()) { + return NewPeerstore(), nil + }) +} + +func TestInMemoryAddrMgr(t *testing.T) { + test.TestAddrMgr(t, func() (AddrBook, func()) { + return &AddrManager{}, nil + }) +} + +func BenchmarkInMemoryPeerstore(b *testing.B) { + test.BenchmarkPeerstore(b, func() (Peerstore, func()) { + return NewPeerstore(), nil + }) +} \ No newline at end of file diff --git a/p2p/host/peerstore/peerstore_test.go b/p2p/host/peerstore/peerstore_test.go deleted file mode 100644 index ff3bf3b93d..0000000000 --- a/p2p/host/peerstore/peerstore_test.go +++ /dev/null @@ -1,337 +0,0 @@ -package peerstore - -import ( - "context" - "fmt" - "math/rand" - "sort" - "testing" - "time" - - "github.com/libp2p/go-libp2p-crypto" - "github.com/libp2p/go-libp2p-peer" - dspstore "github.com/libp2p/go-libp2p-peerstore/ds" - ma "github.com/multiformats/go-multiaddr" -) - -func getAddrs(t *testing.T, n int) []ma.Multiaddr { - var addrs []ma.Multiaddr - for i := 0; i < n; i++ { - a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", i)) - if err != nil { - t.Fatal(err) - } - - addrs = append(addrs, a) - } - return addrs -} - -func runTestWithPeerstores(t *testing.T, testFunc func(*testing.T, Peerstore)) { - t.Helper() - t.Log("NewPeerstore") - ps1 := NewPeerstore() - testFunc(t, ps1) - - t.Log("NewPeerstoreDatastore") - ps2, closer2 := setupDatastorePeerstore(t) - defer closer2() - testFunc(t, ps2) -} - -func setupDatastorePeerstore(t testing.TB) (Peerstore, func()) { - ds, closeDB := setupBadgerDatastore(t) - ctx, cancel := context.WithCancel(context.Background()) - ps, err := dspstore.NewPeerstore(ctx, ds) - if err != nil { - t.Fatal(err) - } - closer := func() { - cancel() - closeDB() - } - return ps, closer -} - -func testAddrStream(t *testing.T, ps Peerstore) { - addrs := getAddrs(t, 100) - - pid := peer.ID("testpeer") - - ps.AddAddrs(pid, addrs[:10], time.Hour) - - ctx, cancel := context.WithCancel(context.Background()) - - addrch := ps.AddrStream(ctx, pid) - - // while that subscription is active, publish ten more addrs - // this tests that it doesnt hang - for i := 10; i < 20; i++ { - ps.AddAddr(pid, addrs[i], time.Hour) - } - - // now receive them (without hanging) - timeout := time.After(time.Second * 10) - for i := 0; i < 20; i++ { - select { - case <-addrch: - case <-timeout: - t.Fatal("timed out") - } - } - - // start a second stream - ctx2, cancel2 := context.WithCancel(context.Background()) - addrch2 := ps.AddrStream(ctx2, pid) - - done := make(chan struct{}) - go func() { - defer close(done) - // now send the rest of the addresses - for _, a := range addrs[20:80] { - ps.AddAddr(pid, a, time.Hour) - } - }() - - // receive some concurrently with the goroutine - timeout = time.After(time.Second * 10) - for i := 0; i < 40; i++ { - select { - case <-addrch: - case <-timeout: - } - } - - <-done - - // receive some more after waiting for that goroutine to complete - timeout = time.After(time.Second * 10) - for i := 0; i < 20; i++ { - select { - case <-addrch: - case <-timeout: - } - } - - // now cancel it - cancel() - - // now check the *second* subscription. We should see 80 addresses. - for i := 0; i < 80; i++ { - <-addrch2 - } - - cancel2() - - // and add a few more addresses it doesnt hang afterwards - for _, a := range addrs[80:] { - ps.AddAddr(pid, a, time.Hour) - } -} - -func TestAddrStream(t *testing.T) { - runTestWithPeerstores(t, testAddrStream) -} - -func testGetStreamBeforePeerAdded(t *testing.T, ps Peerstore) { - addrs := getAddrs(t, 10) - pid := peer.ID("testpeer") - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - - ach := ps.AddrStream(ctx, pid) - - for i := 0; i < 10; i++ { - ps.AddAddr(pid, addrs[i], time.Hour) - } - - received := make(map[string]bool) - var count int - - for i := 0; i < 10; i++ { - a, ok := <-ach - if !ok { - t.Fatal("channel shouldnt be closed yet") - } - if a == nil { - t.Fatal("got a nil address, thats weird") - } - count++ - if received[a.String()] { - t.Fatal("received duplicate address") - } - received[a.String()] = true - } - - select { - case <-ach: - t.Fatal("shouldnt have received any more addresses") - default: - } - - if count != 10 { - t.Fatal("should have received exactly ten addresses, got ", count) - } - - for _, a := range addrs { - if !received[a.String()] { - t.Log(received) - t.Fatalf("expected to receive address %s but didnt", a) - } - } -} - -func TestGetStreamBeforePeerAdded(t *testing.T) { - runTestWithPeerstores(t, testGetStreamBeforePeerAdded) -} - -func testAddrStreamDuplicates(t *testing.T, ps Peerstore) { - addrs := getAddrs(t, 10) - pid := peer.ID("testpeer") - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - ach := ps.AddrStream(ctx, pid) - - go func() { - for i := 0; i < 10; i++ { - ps.AddAddr(pid, addrs[i], time.Hour) - ps.AddAddr(pid, addrs[rand.Intn(10)], time.Hour) - } - - // make sure that all addresses get processed before context is cancelled - time.Sleep(time.Millisecond * 50) - cancel() - }() - - received := make(map[string]bool) - var count int - for a := range ach { - if a == nil { - t.Fatal("got a nil address, thats weird") - } - count++ - if received[a.String()] { - t.Fatal("received duplicate address") - } - received[a.String()] = true - } - - if count != 10 { - t.Fatal("should have received exactly ten addresses") - } -} - -func TestAddrStreamDuplicates(t *testing.T) { - runTestWithPeerstores(t, testAddrStreamDuplicates) -} - -func testPeerstoreProtoStore(t *testing.T, ps Peerstore) { - p1 := peer.ID("TESTPEER") - - protos := []string{"a", "b", "c", "d"} - - err := ps.AddProtocols(p1, protos...) - if err != nil { - t.Fatal(err) - } - - out, err := ps.GetProtocols(p1) - if err != nil { - t.Fatal(err) - } - - if len(out) != len(protos) { - t.Fatal("got wrong number of protocols back") - } - - sort.Strings(out) - for i, p := range protos { - if out[i] != p { - t.Fatal("got wrong protocol") - } - } - - supported, err := ps.SupportsProtocols(p1, "q", "w", "a", "y", "b") - if err != nil { - t.Fatal(err) - } - - if len(supported) != 2 { - t.Fatal("only expected 2 supported") - } - - if supported[0] != "a" || supported[1] != "b" { - t.Fatal("got wrong supported array: ", supported) - } - - err = ps.SetProtocols(p1, "other") - if err != nil { - t.Fatal(err) - } - - supported, err = ps.SupportsProtocols(p1, "q", "w", "a", "y", "b") - if err != nil { - t.Fatal(err) - } - - if len(supported) != 0 { - t.Fatal("none of those protocols should have been supported") - } -} - -func TestPeerstoreProtoStore(t *testing.T) { - runTestWithPeerstores(t, testAddrStreamDuplicates) -} - -func testBasicPeerstore(t *testing.T, ps Peerstore) { - var pids []peer.ID - addrs := getAddrs(t, 10) - for _, a := range addrs { - priv, _, _ := crypto.GenerateKeyPair(crypto.RSA, 512) - p, _ := peer.IDFromPrivateKey(priv) - pids = append(pids, p) - ps.AddAddr(p, a, PermanentAddrTTL) - } - - peers := ps.Peers() - if len(peers) != 10 { - t.Fatal("expected ten peers, got", len(peers)) - } - - pinfo := ps.PeerInfo(pids[0]) - if !pinfo.Addrs[0].Equal(addrs[0]) { - t.Fatal("stored wrong address") - } -} - -func TestBasicPeerstore(t *testing.T) { - runTestWithPeerstores(t, testBasicPeerstore) -} - -func benchmarkPeerstore(ps Peerstore) func(*testing.B) { - return func(b *testing.B) { - addrs := make(chan *peerpair, 100) - - ctx, cancel := context.WithCancel(context.Background()) - go addressProducer(ctx, b, addrs) - - b.ResetTimer() - for i := 0; i < b.N; i++ { - pp := <-addrs - pid := peer.ID(pp.ID) - ps.AddAddr(pid, pp.Addr, PermanentAddrTTL) - } - cancel() - } -} - -func BenchmarkPeerstore(b *testing.B) { - ps := NewPeerstore() - b.Run("PeerstoreBasic", benchmarkPeerstore(ps)) - - dsps, closer := setupDatastorePeerstore(b) - defer closer() - b.Run("PeerstoreDatastore", benchmarkPeerstore(dsps)) -} diff --git a/p2p/host/peerstore/test/addr_manager_suite.go b/p2p/host/peerstore/test/addr_manager_suite.go new file mode 100644 index 0000000000..96408d787b --- /dev/null +++ b/p2p/host/peerstore/test/addr_manager_suite.go @@ -0,0 +1,279 @@ +package test + +import ( + "testing" + "time" + + "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" + ma "github.com/multiformats/go-multiaddr" +) + +var addressBookSuite = map[string]func(book pstore.AddrBook) func(*testing.T){ + "Addresses": testAddresses, + "Clear": testClearWorks, + "SetNegativeTTLClears": testSetNegativeTTLClears, + "UpdateTTLs": testUpdateTTLs, + "NilAddrsDontBreak": testNilAddrsDontBreak, + "AddressesExpire": testAddressesExpire, +} + +type AddrMgrFactory func() (pstore.AddrBook, func()) + +func TestAddrMgr(t *testing.T, factory AddrMgrFactory) { + for name, test := range addressBookSuite { + // Create a new peerstore. + ab, closeFunc := factory() + + // Run the test. + t.Run(name, test(ab)) + + // Cleanup. + if closeFunc != nil { + closeFunc() + } + } +} + +func testAddresses(m pstore.AddrBook) func(*testing.T) { + return func(t *testing.T) { + id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") + id2 := IDS(t, "QmRmPL3FDZKE3Qiwv1RosLdwdvbvg17b2hB39QPScgWKKZ") + id3 := IDS(t, "QmPhi7vBsChP7sjRoZGgg7bcKqF6MmCcQwvRbDte8aJ6Kn") + id4 := IDS(t, "QmPhi7vBsChP7sjRoZGgg7bcKqF6MmCcQwvRbDte8aJ5Kn") + id5 := IDS(t, "QmPhi7vBsChP7sjRoZGgg7bcKqF6MmCcQwvRbDte8aJ5Km") + + ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111") + ma21 := MA(t, "/ip4/2.2.3.2/tcp/1111") + ma22 := MA(t, "/ip4/2.2.3.2/tcp/2222") + ma31 := MA(t, "/ip4/3.2.3.3/tcp/1111") + ma32 := MA(t, "/ip4/3.2.3.3/tcp/2222") + ma33 := MA(t, "/ip4/3.2.3.3/tcp/3333") + ma41 := MA(t, "/ip4/4.2.3.3/tcp/1111") + ma42 := MA(t, "/ip4/4.2.3.3/tcp/2222") + ma43 := MA(t, "/ip4/4.2.3.3/tcp/3333") + ma44 := MA(t, "/ip4/4.2.3.3/tcp/4444") + ma51 := MA(t, "/ip4/5.2.3.3/tcp/1111") + ma52 := MA(t, "/ip4/5.2.3.3/tcp/2222") + ma53 := MA(t, "/ip4/5.2.3.3/tcp/3333") + ma54 := MA(t, "/ip4/5.2.3.3/tcp/4444") + ma55 := MA(t, "/ip4/5.2.3.3/tcp/5555") + + ttl := time.Hour + m.AddAddr(id1, ma11, ttl) + + m.AddAddrs(id2, []ma.Multiaddr{ma21, ma22}, ttl) + m.AddAddrs(id2, []ma.Multiaddr{ma21, ma22}, ttl) // idempotency + + m.AddAddr(id3, ma31, ttl) + m.AddAddr(id3, ma32, ttl) + m.AddAddr(id3, ma33, ttl) + m.AddAddr(id3, ma33, ttl) // idempotency + m.AddAddr(id3, ma33, ttl) + + m.AddAddrs(id4, []ma.Multiaddr{ma41, ma42, ma43, ma44}, ttl) // multiple + + m.AddAddrs(id5, []ma.Multiaddr{ma21, ma22}, ttl) // clearing + m.AddAddrs(id5, []ma.Multiaddr{ma41, ma42, ma43, ma44}, ttl) // clearing + m.ClearAddrs(id5) + m.AddAddrs(id5, []ma.Multiaddr{ma51, ma52, ma53, ma54, ma55}, ttl) // clearing + + // test the Addresses return value + testHas(t, []ma.Multiaddr{ma11}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma21, ma22}, m.Addrs(id2)) + testHas(t, []ma.Multiaddr{ma31, ma32, ma33}, m.Addrs(id3)) + testHas(t, []ma.Multiaddr{ma41, ma42, ma43, ma44}, m.Addrs(id4)) + testHas(t, []ma.Multiaddr{ma51, ma52, ma53, ma54, ma55}, m.Addrs(id5)) + } +} + +func testClearWorks(m pstore.AddrBook) func(t *testing.T) { + return func(t *testing.T) { + id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") + id2 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQM") + ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111") + ma12 := MA(t, "/ip4/2.2.3.2/tcp/2222") + ma13 := MA(t, "/ip4/3.2.3.3/tcp/3333") + ma24 := MA(t, "/ip4/4.2.3.3/tcp/4444") + ma25 := MA(t, "/ip4/5.2.3.3/tcp/5555") + + m.AddAddr(id1, ma11, time.Hour) + m.AddAddr(id1, ma12, time.Hour) + m.AddAddr(id1, ma13, time.Hour) + m.AddAddr(id2, ma24, time.Hour) + m.AddAddr(id2, ma25, time.Hour) + + testHas(t, []ma.Multiaddr{ma11, ma12, ma13}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) + + m.ClearAddrs(id1) + m.ClearAddrs(id2) + + testHas(t, nil, m.Addrs(id1)) + testHas(t, nil, m.Addrs(id2)) + } +} + +func testSetNegativeTTLClears(m pstore.AddrBook) func(t *testing.T) { + return func(t *testing.T) { + id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") + ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111") + + m.SetAddr(id1, ma11, time.Hour) + + testHas(t, []ma.Multiaddr{ma11}, m.Addrs(id1)) + + m.SetAddr(id1, ma11, -1) + + testHas(t, nil, m.Addrs(id1)) + } +} + +func testUpdateTTLs(m pstore.AddrBook) func(t *testing.T) { + return func(t *testing.T) { + id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") + id2 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQM") + ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111") + ma12 := MA(t, "/ip4/1.2.3.1/tcp/1112") + ma21 := MA(t, "/ip4/1.2.3.1/tcp/1121") + ma22 := MA(t, "/ip4/1.2.3.1/tcp/1122") + + // Shouldn't panic. + m.UpdateAddrs(id1, time.Hour, time.Minute) + + m.SetAddr(id1, ma11, time.Hour) + m.SetAddr(id1, ma12, time.Minute) + + // Shouldn't panic. + m.UpdateAddrs(id2, time.Hour, time.Minute) + + m.SetAddr(id2, ma21, time.Hour) + m.SetAddr(id2, ma22, time.Minute) + + testHas(t, []ma.Multiaddr{ma11, ma12}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma21, ma22}, m.Addrs(id2)) + + m.UpdateAddrs(id1, time.Hour, time.Second) + + testHas(t, []ma.Multiaddr{ma11, ma12}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma21, ma22}, m.Addrs(id2)) + + time.Sleep(1200 * time.Millisecond) + + testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma21, ma22}, m.Addrs(id2)) + + m.UpdateAddrs(id2, time.Hour, time.Second) + + testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma21, ma22}, m.Addrs(id2)) + + time.Sleep(1200 * time.Millisecond) + + testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma22}, m.Addrs(id2)) + } +} + +func testNilAddrsDontBreak(m pstore.AddrBook) func(t *testing.T) { + return func(t *testing.T) { + id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") + m.SetAddr(id1, nil, time.Hour) + m.AddAddr(id1, nil, time.Hour) + } +} + +func testAddressesExpire(m pstore.AddrBook) func(t *testing.T) { + return func(t *testing.T) { + id1 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQN") + id2 := IDS(t, "QmcNstKuwBBoVTpSCSDrwzjgrRcaYXK833Psuz2EMHwyQM") + ma11 := MA(t, "/ip4/1.2.3.1/tcp/1111") + ma12 := MA(t, "/ip4/2.2.3.2/tcp/2222") + ma13 := MA(t, "/ip4/3.2.3.3/tcp/3333") + ma24 := MA(t, "/ip4/4.2.3.3/tcp/4444") + ma25 := MA(t, "/ip4/5.2.3.3/tcp/5555") + + m.AddAddr(id1, ma11, time.Hour) + m.AddAddr(id1, ma12, time.Hour) + m.AddAddr(id1, ma13, time.Hour) + m.AddAddr(id2, ma24, time.Hour) + m.AddAddr(id2, ma25, time.Hour) + + testHas(t, []ma.Multiaddr{ma11, ma12, ma13}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) + + m.SetAddr(id1, ma11, 2*time.Hour) + m.SetAddr(id1, ma12, 2*time.Hour) + m.SetAddr(id1, ma13, 2*time.Hour) + m.SetAddr(id2, ma24, 2*time.Hour) + m.SetAddr(id2, ma25, 2*time.Hour) + + testHas(t, []ma.Multiaddr{ma11, ma12, ma13}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) + + m.SetAddr(id1, ma11, time.Millisecond) + <-time.After(time.Millisecond * 2) + testHas(t, []ma.Multiaddr{ma12, ma13}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) + + m.SetAddr(id1, ma13, time.Millisecond) + <-time.After(time.Millisecond * 2) + testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) + + m.SetAddr(id2, ma24, time.Millisecond) + <-time.After(time.Millisecond * 2) + testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) + testHas(t, []ma.Multiaddr{ma25}, m.Addrs(id2)) + + m.SetAddr(id2, ma25, time.Millisecond) + <-time.After(time.Millisecond * 2) + testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) + testHas(t, nil, m.Addrs(id2)) + + m.SetAddr(id1, ma12, time.Millisecond) + <-time.After(time.Millisecond * 2) + testHas(t, nil, m.Addrs(id1)) + testHas(t, nil, m.Addrs(id2)) + } +} + +func IDS(t *testing.T, ids string) peer.ID { + t.Helper() + id, err := peer.IDB58Decode(ids) + if err != nil { + t.Fatalf("id %q is bad: %s", ids, err) + } + return id +} + +func MA(t *testing.T, m string) ma.Multiaddr { + t.Helper() + maddr, err := ma.NewMultiaddr(m) + if err != nil { + t.Fatal(err) + } + return maddr +} + +func testHas(t *testing.T, exp, act []ma.Multiaddr) { + t.Helper() + if len(exp) != len(act) { + t.Fatalf("lengths not the same. expected %d, got %d\n", len(exp), len(act)) + } + + for _, a := range exp { + found := false + + for _, b := range act { + if a.Equal(b) { + found = true + break + } + } + + if !found { + t.Fatalf("expected address %s not found", a) + } + } +} diff --git a/p2p/host/peerstore/benchmark_utils.go b/p2p/host/peerstore/test/benchmark_utils.go similarity index 97% rename from p2p/host/peerstore/benchmark_utils.go rename to p2p/host/peerstore/test/benchmark_utils.go index e838894366..b6d096cd5c 100644 --- a/p2p/host/peerstore/benchmark_utils.go +++ b/p2p/host/peerstore/test/benchmark_utils.go @@ -1,4 +1,4 @@ -package peerstore +package test import ( "context" diff --git a/p2p/host/peerstore/test/peerstore_suite.go b/p2p/host/peerstore/test/peerstore_suite.go new file mode 100644 index 0000000000..fed435ae1a --- /dev/null +++ b/p2p/host/peerstore/test/peerstore_suite.go @@ -0,0 +1,316 @@ +package test + +import ( + "context" + "fmt" + "math/rand" + "sort" + "testing" + "time" + + "github.com/libp2p/go-libp2p-crypto" + "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" + ma "github.com/multiformats/go-multiaddr" +) + +var peerstoreSuite = map[string]func(book pstore.Peerstore) func(*testing.T){ + "AddrStream": testAddrStream, + "GetStreamBeforePeerAdded": testGetStreamBeforePeerAdded, + "AddStreamDuplicates": testAddrStreamDuplicates, + "PeerstoreProtoStore": testPeerstoreProtoStore, + "BasicPeerstore": testBasicPeerstore, +} + +type PeerstoreFactory func() (pstore.Peerstore, func()) + +func TestPeerstore(t *testing.T, factory PeerstoreFactory) { + for name, test := range peerstoreSuite { + // Create a new peerstore. + ps, closeFunc := factory() + + // Run the test. + t.Run(name, test(ps)) + + // Cleanup. + if closeFunc != nil { + closeFunc() + } + } +} + +func BenchmarkPeerstore(b *testing.B, factory PeerstoreFactory) { + ps, closeFunc := factory() + defer closeFunc() + + b.Run("Peerstore", benchmarkPeerstore(ps)) +} + +func testAddrStream(ps pstore.Peerstore) func(t *testing.T) { + return func(t *testing.T) { + addrs, pid := getAddrs(t, 100), peer.ID("testpeer") + ps.AddAddrs(pid, addrs[:10], time.Hour) + + ctx, cancel := context.WithCancel(context.Background()) + addrch := ps.AddrStream(ctx, pid) + + // while that subscription is active, publish ten more addrs + // this tests that it doesnt hang + for i := 10; i < 20; i++ { + ps.AddAddr(pid, addrs[i], time.Hour) + } + + // now receive them (without hanging) + timeout := time.After(time.Second * 10) + for i := 0; i < 20; i++ { + select { + case <-addrch: + case <-timeout: + t.Fatal("timed out") + } + } + + // start a second stream + ctx2, cancel2 := context.WithCancel(context.Background()) + addrch2 := ps.AddrStream(ctx2, pid) + + done := make(chan struct{}) + go func() { + defer close(done) + // now send the rest of the addresses + for _, a := range addrs[20:80] { + ps.AddAddr(pid, a, time.Hour) + } + }() + + // receive some concurrently with the goroutine + timeout = time.After(time.Second * 10) + for i := 0; i < 40; i++ { + select { + case <-addrch: + case <-timeout: + } + } + + <-done + + // receive some more after waiting for that goroutine to complete + timeout = time.After(time.Second * 10) + for i := 0; i < 20; i++ { + select { + case <-addrch: + case <-timeout: + } + } + + // now cancel it + cancel() + + // now check the *second* subscription. We should see 80 addresses. + for i := 0; i < 80; i++ { + <-addrch2 + } + + cancel2() + + // and add a few more addresses it doesnt hang afterwards + for _, a := range addrs[80:] { + ps.AddAddr(pid, a, time.Hour) + } + } +} + +func testGetStreamBeforePeerAdded(ps pstore.Peerstore) func(t *testing.T) { + return func(t *testing.T) { + addrs, pid := getAddrs(t, 10), peer.ID("testpeer") + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ach := ps.AddrStream(ctx, pid) + for i := 0; i < 10; i++ { + ps.AddAddr(pid, addrs[i], time.Hour) + } + + received := make(map[string]bool) + var count int + + for i := 0; i < 10; i++ { + a, ok := <-ach + if !ok { + t.Fatal("channel shouldnt be closed yet") + } + if a == nil { + t.Fatal("got a nil address, thats weird") + } + count++ + if received[a.String()] { + t.Fatal("received duplicate address") + } + received[a.String()] = true + } + + select { + case <-ach: + t.Fatal("shouldnt have received any more addresses") + default: + } + + if count != 10 { + t.Fatal("should have received exactly ten addresses, got ", count) + } + + for _, a := range addrs { + if !received[a.String()] { + t.Log(received) + t.Fatalf("expected to receive address %s but didnt", a) + } + } + } +} + +func testAddrStreamDuplicates(ps pstore.Peerstore) func(t *testing.T) { + return func(t *testing.T) { + addrs, pid := getAddrs(t, 10), peer.ID("testpeer") + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + ach := ps.AddrStream(ctx, pid) + go func() { + for i := 0; i < 10; i++ { + ps.AddAddr(pid, addrs[i], time.Hour) + ps.AddAddr(pid, addrs[rand.Intn(10)], time.Hour) + } + + // make sure that all addresses get processed before context is cancelled + time.Sleep(time.Millisecond * 50) + cancel() + }() + + received := make(map[string]bool) + var count int + for a := range ach { + if a == nil { + t.Fatal("got a nil address, thats weird") + } + count++ + if received[a.String()] { + t.Fatal("received duplicate address") + } + received[a.String()] = true + } + + if count != 10 { + t.Fatal("should have received exactly ten addresses") + } + } +} + +func testPeerstoreProtoStore(ps pstore.Peerstore) func(t *testing.T) { + return func(t *testing.T) { + p1, protos := peer.ID("TESTPEER"), []string{"a", "b", "c", "d"} + + err := ps.AddProtocols(p1, protos...) + if err != nil { + t.Fatal(err) + } + + out, err := ps.GetProtocols(p1) + if err != nil { + t.Fatal(err) + } + + if len(out) != len(protos) { + t.Fatal("got wrong number of protocols back") + } + + sort.Strings(out) + for i, p := range protos { + if out[i] != p { + t.Fatal("got wrong protocol") + } + } + + supported, err := ps.SupportsProtocols(p1, "q", "w", "a", "y", "b") + if err != nil { + t.Fatal(err) + } + + if len(supported) != 2 { + t.Fatal("only expected 2 supported") + } + + if supported[0] != "a" || supported[1] != "b" { + t.Fatal("got wrong supported array: ", supported) + } + + err = ps.SetProtocols(p1, "other") + if err != nil { + t.Fatal(err) + } + + supported, err = ps.SupportsProtocols(p1, "q", "w", "a", "y", "b") + if err != nil { + t.Fatal(err) + } + + if len(supported) != 0 { + t.Fatal("none of those protocols should have been supported") + } + } +} + +func testBasicPeerstore(ps pstore.Peerstore) func(t *testing.T) { + return func(t *testing.T) { + var pids []peer.ID + addrs := getAddrs(t, 10) + + for _, a := range addrs { + priv, _, _ := crypto.GenerateKeyPair(crypto.RSA, 512) + p, _ := peer.IDFromPrivateKey(priv) + pids = append(pids, p) + ps.AddAddr(p, a, pstore.PermanentAddrTTL) + } + + peers := ps.Peers() + if len(peers) != 10 { + t.Fatal("expected ten peers, got", len(peers)) + } + + pinfo := ps.PeerInfo(pids[0]) + if !pinfo.Addrs[0].Equal(addrs[0]) { + t.Fatal("stored wrong address") + } + } +} + +func benchmarkPeerstore(ps pstore.Peerstore) func(*testing.B) { + return func(b *testing.B) { + addrs := make(chan *peerpair, 100) + + ctx, cancel := context.WithCancel(context.Background()) + go addressProducer(ctx, b, addrs) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + pp := <-addrs + pid := peer.ID(pp.ID) + ps.AddAddr(pid, pp.Addr, pstore.PermanentAddrTTL) + } + cancel() + } +} + +func getAddrs(t *testing.T, n int) []ma.Multiaddr { + var addrs []ma.Multiaddr + for i := 0; i < n; i++ { + a, err := ma.NewMultiaddr(fmt.Sprintf("/ip4/127.0.0.1/tcp/%d", i)) + if err != nil { + t.Fatal(err) + } + + addrs = append(addrs, a) + } + return addrs +} diff --git a/p2p/host/peerstore/test/utils.go b/p2p/host/peerstore/test/test_utils.go similarity index 97% rename from p2p/host/peerstore/test/utils.go rename to p2p/host/peerstore/test/test_utils.go index fc141b0d6c..3bca8512ea 100644 --- a/p2p/host/peerstore/test/utils.go +++ b/p2p/host/peerstore/test/test_utils.go @@ -1,4 +1,4 @@ -package testutil +package test import ( "io" From d66b5d5e29ccdaded4b0fef56a637fdd4dd46bde Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 30 Aug 2018 14:13:27 +0100 Subject: [PATCH 03/18] move in-memory peerstore into mem package. --- p2p/host/peerstore/ds/addr_manager.go | 5 +-- p2p/host/peerstore/ds/peerstore.go | 3 +- p2p/host/peerstore/interface.go | 34 ++++++++++++++++++ p2p/host/peerstore/{ => mem}/addr_manager.go | 36 ++------------------ p2p/host/peerstore/{ => mem}/inmem_test.go | 11 +++--- p2p/host/peerstore/{ => mem}/keybook.go | 7 ++-- p2p/host/peerstore/{ => mem}/metadata.go | 7 ++-- p2p/host/peerstore/mem/peerstore.go | 11 ++++++ p2p/host/peerstore/peerstore.go | 20 ----------- 9 files changed, 67 insertions(+), 67 deletions(-) rename p2p/host/peerstore/{ => mem}/addr_manager.go (87%) rename p2p/host/peerstore/{ => mem}/inmem_test.go (56%) rename p2p/host/peerstore/{ => mem}/keybook.go (92%) rename p2p/host/peerstore/{ => mem}/metadata.go (85%) create mode 100644 p2p/host/peerstore/mem/peerstore.go diff --git a/p2p/host/peerstore/ds/addr_manager.go b/p2p/host/peerstore/ds/addr_manager.go index e00023de50..0c76747461 100644 --- a/p2p/host/peerstore/ds/addr_manager.go +++ b/p2p/host/peerstore/ds/addr_manager.go @@ -11,6 +11,7 @@ import ( logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-peerstore/mem" ma "github.com/multiformats/go-multiaddr" mh "github.com/multiformats/go-multihash" ) @@ -28,7 +29,7 @@ type addrManager struct { cache *lru.ARCCache ds ds.Batching ttlManager *ttlmanager - subsManager *pstore.AddrSubManager + subsManager *mem.AddrSubManager } // NewAddrManager initializes a new address manager given a @@ -44,7 +45,7 @@ func NewAddrManager(ctx context.Context, ds ds.Batching, ttlInterval time.Durati cache: cache, ds: ds, ttlManager: newTTLManager(ctx, ds, cache, ttlInterval), - subsManager: pstore.NewAddrSubManager(), + subsManager: mem.NewAddrSubManager(), } return mgr, nil } diff --git a/p2p/host/peerstore/ds/peerstore.go b/p2p/host/peerstore/ds/peerstore.go index f48263379b..06b4fd351d 100644 --- a/p2p/host/peerstore/ds/peerstore.go +++ b/p2p/host/peerstore/ds/peerstore.go @@ -6,6 +6,7 @@ import ( "github.com/ipfs/go-datastore" pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-peerstore/mem" ) // NewPeerstore creates a peerstore backed by the provided persistent datastore. @@ -15,6 +16,6 @@ func NewPeerstore(ctx context.Context, ds datastore.Batching) (pstore.Peerstore, return nil, err } - ps := pstore.NewPeerstoreWith(pstore.NewKeybook(), addrBook, pstore.NewPeerMetadata()) + ps := pstore.NewPeerstoreWith(mem.NewKeybook(), addrBook, mem.NewPeerMetadata()) return ps, nil } diff --git a/p2p/host/peerstore/interface.go b/p2p/host/peerstore/interface.go index e0c0a6233c..4206ca41b1 100644 --- a/p2p/host/peerstore/interface.go +++ b/p2p/host/peerstore/interface.go @@ -2,6 +2,7 @@ package peerstore import ( "context" + "math" "time" "gx/ipfs/QmVmDhyTTUcQXFD1rRQ64fGLMSAoaQvNH3hwuaCFAPq2hy/errors" @@ -13,6 +14,39 @@ import ( var ErrNotFound = errors.New("item not found") +var ( + // AddressTTL is the expiration time of addresses. + AddressTTL = time.Hour + + // TempAddrTTL is the ttl used for a short lived address + TempAddrTTL = time.Second * 10 + + // ProviderAddrTTL is the TTL of an address we've received from a provider. + // This is also a temporary address, but lasts longer. After this expires, + // the records we return will require an extra lookup. + ProviderAddrTTL = time.Minute * 10 + + // RecentlyConnectedAddrTTL is used when we recently connected to a peer. + // It means that we are reasonably certain of the peer's address. + RecentlyConnectedAddrTTL = time.Minute * 10 + + // OwnObservedAddrTTL is used for our own external addresses observed by peers. + OwnObservedAddrTTL = time.Minute * 10 +) + +// Permanent TTLs (distinct so we can distinguish between them, constant as they +// are, in fact, permanent) +const ( + + // PermanentAddrTTL is the ttl for a "permanent address" (e.g. bootstrap nodes). + PermanentAddrTTL = math.MaxInt64 - iota + + // ConnectedAddrTTL is the ttl used for the addresses of a peer to whom + // we're connected directly. This is basically permanent, as we will + // clear them + re-add under a TempAddrTTL after disconnecting. + ConnectedAddrTTL +) + // Peerstore provides a threadsafe store of Peer related // information. type Peerstore interface { diff --git a/p2p/host/peerstore/addr_manager.go b/p2p/host/peerstore/mem/addr_manager.go similarity index 87% rename from p2p/host/peerstore/addr_manager.go rename to p2p/host/peerstore/mem/addr_manager.go index b0db2b60e9..e6a9d8c280 100644 --- a/p2p/host/peerstore/addr_manager.go +++ b/p2p/host/peerstore/mem/addr_manager.go @@ -1,50 +1,20 @@ -package peerstore +package mem import ( "context" - "math" "sort" "sync" "time" logging "github.com/ipfs/go-log" "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-libp2p-peerstore/addr" ma "github.com/multiformats/go-multiaddr" ) var log = logging.Logger("peerstore") -var ( - - // TempAddrTTL is the ttl used for a short lived address - TempAddrTTL = time.Second * 10 - - // ProviderAddrTTL is the TTL of an address we've received from a provider. - // This is also a temporary address, but lasts longer. After this expires, - // the records we return will require an extra lookup. - ProviderAddrTTL = time.Minute * 10 - - // RecentlyConnectedAddrTTL is used when we recently connected to a peer. - // It means that we are reasonably certain of the peer's address. - RecentlyConnectedAddrTTL = time.Minute * 10 - - // OwnObservedAddrTTL is used for our own external addresses observed by peers. - OwnObservedAddrTTL = time.Minute * 10 -) - -// Permanent TTLs (distinct so we can distinguish between them, constant as they -// are, in fact, permanent) -const ( - // PermanentAddrTTL is the ttl for a "permanent address" (e.g. bootstrap nodes). - PermanentAddrTTL = math.MaxInt64 - iota - - // ConnectedAddrTTL is the ttl used for the addresses of a peer to whom - // we're connected directly. This is basically permanent, as we will - // clear them + re-add under a TempAddrTTL after disconnecting. - ConnectedAddrTTL -) - type expiringAddr struct { Addr ma.Multiaddr TTL time.Duration @@ -57,7 +27,7 @@ func (e *expiringAddr) ExpiredBy(t time.Time) bool { type addrSlice []expiringAddr -var _ AddrBook = (*AddrManager)(nil) +var _ pstore.AddrBook = (*AddrManager)(nil) // AddrManager manages addresses. // The zero-value is ready to be used. diff --git a/p2p/host/peerstore/inmem_test.go b/p2p/host/peerstore/mem/inmem_test.go similarity index 56% rename from p2p/host/peerstore/inmem_test.go rename to p2p/host/peerstore/mem/inmem_test.go index 6b1a012c0f..cedc65bd27 100644 --- a/p2p/host/peerstore/inmem_test.go +++ b/p2p/host/peerstore/mem/inmem_test.go @@ -1,25 +1,26 @@ -package peerstore +package mem import ( "testing" + pstore "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-libp2p-peerstore/test" ) func TestInMemoryPeerstore(t *testing.T) { - test.TestPeerstore(t, func() (Peerstore, func()) { + test.TestPeerstore(t, func() (pstore.Peerstore, func()) { return NewPeerstore(), nil }) } func TestInMemoryAddrMgr(t *testing.T) { - test.TestAddrMgr(t, func() (AddrBook, func()) { + test.TestAddrMgr(t, func() (pstore.AddrBook, func()) { return &AddrManager{}, nil }) } func BenchmarkInMemoryPeerstore(b *testing.B) { - test.BenchmarkPeerstore(b, func() (Peerstore, func()) { + test.BenchmarkPeerstore(b, func() (pstore.Peerstore, func()) { return NewPeerstore(), nil }) -} \ No newline at end of file +} diff --git a/p2p/host/peerstore/keybook.go b/p2p/host/peerstore/mem/keybook.go similarity index 92% rename from p2p/host/peerstore/keybook.go rename to p2p/host/peerstore/mem/keybook.go index 1a9e6b95b8..e67e8f2af1 100644 --- a/p2p/host/peerstore/keybook.go +++ b/p2p/host/peerstore/mem/keybook.go @@ -1,4 +1,4 @@ -package peerstore +package mem import ( "errors" @@ -6,6 +6,7 @@ import ( ic "github.com/libp2p/go-libp2p-crypto" "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" ) type memoryKeyBook struct { @@ -14,10 +15,10 @@ type memoryKeyBook struct { sks map[peer.ID]ic.PrivKey } -var _ KeyBook = (*memoryKeyBook)(nil) +var _ pstore.KeyBook = (*memoryKeyBook)(nil) // noop new, but in the future we may want to do some init work. -func NewKeybook() KeyBook { +func NewKeybook() pstore.KeyBook { return &memoryKeyBook{ pks: map[peer.ID]ic.PubKey{}, sks: map[peer.ID]ic.PrivKey{}, diff --git a/p2p/host/peerstore/metadata.go b/p2p/host/peerstore/mem/metadata.go similarity index 85% rename from p2p/host/peerstore/metadata.go rename to p2p/host/peerstore/mem/metadata.go index 1f6f5ce3de..26324b82fa 100644 --- a/p2p/host/peerstore/metadata.go +++ b/p2p/host/peerstore/mem/metadata.go @@ -1,9 +1,10 @@ -package peerstore +package mem import ( "sync" "github.com/libp2p/go-libp2p-peer" + pstore "github.com/libp2p/go-libp2p-peerstore" ) type memoryPeerMetadata struct { @@ -14,7 +15,7 @@ type memoryPeerMetadata struct { dslock sync.Mutex } -func NewPeerMetadata() PeerMetadata { +func NewPeerMetadata() pstore.PeerMetadata { return &memoryPeerMetadata{ ds: make(map[string]interface{}), } @@ -37,7 +38,7 @@ func (ps *memoryPeerMetadata) Get(p peer.ID, key string) (interface{}, error) { defer ps.dslock.Unlock() i, ok := ps.ds[string(p)+"/"+key] if !ok { - return nil, ErrNotFound + return nil, pstore.ErrNotFound } return i, nil } diff --git a/p2p/host/peerstore/mem/peerstore.go b/p2p/host/peerstore/mem/peerstore.go new file mode 100644 index 0000000000..a706e0785e --- /dev/null +++ b/p2p/host/peerstore/mem/peerstore.go @@ -0,0 +1,11 @@ +package mem + +import pstore "github.com/libp2p/go-libp2p-peerstore" + +// NewPeerstore creates an in-memory threadsafe collection of peers. +func NewPeerstore() pstore.Peerstore { + return pstore.NewPeerstoreWith( + NewKeybook(), + &AddrManager{}, + NewPeerMetadata()) +} diff --git a/p2p/host/peerstore/peerstore.go b/p2p/host/peerstore/peerstore.go index b127c4e30e..b4d35a2cc1 100644 --- a/p2p/host/peerstore/peerstore.go +++ b/p2p/host/peerstore/peerstore.go @@ -3,16 +3,10 @@ package peerstore import ( "fmt" "sync" - "time" "github.com/libp2p/go-libp2p-peer" ) -const ( - // AddressTTL is the expiration time of addresses. - AddressTTL = time.Hour -) - var _ Peerstore = (*peerstore)(nil) type peerstore struct { @@ -26,20 +20,6 @@ type peerstore struct { protolock sync.Mutex } -// NewPeerstore creates a threadsafe collection of peers. -// -// TODO: (RK) move in-memory AddrBook, KeyBook and PeerMetadata to mem -// package. Adapt consumers (IPFS) to instantiate mem.NewPeerstore(). -// -// Preserving this function for backwards compatibility is not possible, as -// we would have to import the mem package, which in turn imports this one, thus -// creating a cycle. -// -// DEPRECATED: use an implementation-specific peerstore. -func NewPeerstore() Peerstore { - return NewPeerstoreWith(NewKeybook(), &AddrManager{}, NewPeerMetadata()) -} - // NewPeerstore creates a threadsafe collection of peers. func NewPeerstoreWith(kb KeyBook, ab AddrBook, md PeerMetadata) Peerstore { return &peerstore{ From e40add1e333d9c3e3a5ba690c6c9e96992d1d6e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 30 Aug 2018 15:24:06 +0100 Subject: [PATCH 04/18] gx-go rw. --- p2p/host/peerstore/addr/addrsrcs.go | 2 +- p2p/host/peerstore/addr/addrsrcs_test.go | 2 +- p2p/host/peerstore/addr/sorting.go | 6 +++--- p2p/host/peerstore/ds/addr_manager.go | 14 +++++++------- p2p/host/peerstore/ds/ds_test.go | 6 +++--- p2p/host/peerstore/ds/peerstore.go | 2 +- p2p/host/peerstore/interface.go | 6 +++--- p2p/host/peerstore/mem/addr_manager.go | 6 +++--- p2p/host/peerstore/mem/keybook.go | 4 ++-- p2p/host/peerstore/mem/metadata.go | 2 +- p2p/host/peerstore/metrics.go | 2 +- p2p/host/peerstore/metrics_test.go | 2 +- p2p/host/peerstore/peerinfo.go | 4 ++-- p2p/host/peerstore/peerinfo_test.go | 4 ++-- p2p/host/peerstore/peerstore.go | 2 +- p2p/host/peerstore/queue/distance.go | 4 ++-- p2p/host/peerstore/queue/interface.go | 2 +- p2p/host/peerstore/queue/queue_test.go | 4 ++-- p2p/host/peerstore/queue/sync.go | 4 ++-- p2p/host/peerstore/test/addr_manager_suite.go | 4 ++-- p2p/host/peerstore/test/benchmark_utils.go | 6 +++--- p2p/host/peerstore/test/peerstore_suite.go | 6 +++--- p2p/host/peerstore/test/test_utils.go | 6 +++--- 23 files changed, 50 insertions(+), 50 deletions(-) diff --git a/p2p/host/peerstore/addr/addrsrcs.go b/p2p/host/peerstore/addr/addrsrcs.go index 9be78d5ccc..fd959b1fae 100644 --- a/p2p/host/peerstore/addr/addrsrcs.go +++ b/p2p/host/peerstore/addr/addrsrcs.go @@ -2,7 +2,7 @@ package addr import ( - ma "github.com/multiformats/go-multiaddr" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) // AddrSource is a source of addresses. It allows clients to retrieve diff --git a/p2p/host/peerstore/addr/addrsrcs_test.go b/p2p/host/peerstore/addr/addrsrcs_test.go index 06bea07bce..a186012f06 100644 --- a/p2p/host/peerstore/addr/addrsrcs_test.go +++ b/p2p/host/peerstore/addr/addrsrcs_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - ma "github.com/multiformats/go-multiaddr" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) func newAddrOrFatal(t *testing.T, s string) ma.Multiaddr { diff --git a/p2p/host/peerstore/addr/sorting.go b/p2p/host/peerstore/addr/sorting.go index f8a89150a2..afeab089b6 100644 --- a/p2p/host/peerstore/addr/sorting.go +++ b/p2p/host/peerstore/addr/sorting.go @@ -3,9 +3,9 @@ package addr import ( "bytes" - ma "github.com/multiformats/go-multiaddr" - manet "github.com/multiformats/go-multiaddr-net" - mafmt "github.com/whyrusleeping/mafmt" + mafmt "gx/ipfs/QmQscWDtDBDsWAM58aY6gU2KtxyFFmvvZgdfJExYPLgtXA/mafmt" + manet "gx/ipfs/QmV6FjemM1K8oXjrvuq3wuVWWoU2TLDPmNnKrxHzY3v6Ai/go-multiaddr-net" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) func isFDCostlyTransport(a ma.Multiaddr) bool { diff --git a/p2p/host/peerstore/ds/addr_manager.go b/p2p/host/peerstore/ds/addr_manager.go index 0c76747461..2bf8c28c87 100644 --- a/p2p/host/peerstore/ds/addr_manager.go +++ b/p2p/host/peerstore/ds/addr_manager.go @@ -5,15 +5,15 @@ import ( "sync" "time" - "github.com/hashicorp/golang-lru" - ds "github.com/ipfs/go-datastore" - "github.com/ipfs/go-datastore/query" - logging "github.com/ipfs/go-log" - "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-libp2p-peerstore/mem" - ma "github.com/multiformats/go-multiaddr" - mh "github.com/multiformats/go-multihash" + mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" + ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) var log = logging.Logger("peerstore/ds") diff --git a/p2p/host/peerstore/ds/ds_test.go b/p2p/host/peerstore/ds/ds_test.go index 6f7adcd78e..b2f70c0439 100644 --- a/p2p/host/peerstore/ds/ds_test.go +++ b/p2p/host/peerstore/ds/ds_test.go @@ -7,10 +7,10 @@ import ( "testing" "time" - "github.com/ipfs/go-datastore" - "github.com/ipfs/go-ds-badger" "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-libp2p-peerstore/test" + "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + "gx/ipfs/QmUCfrikzKVGAfpE31RPwPd32fu1DYxSG7HTGCadba5Wza/go-ds-badger" ) func setupBadgerDatastore(t testing.TB) (datastore.Batching, func()) { @@ -65,4 +65,4 @@ func TestBadgerDsAddrBook(t *testing.T) { func BenchmarkBadgerDsPeerstore(b *testing.B) { test.BenchmarkPeerstore(b, newPeerstoreFactory(b)) -} \ No newline at end of file +} diff --git a/p2p/host/peerstore/ds/peerstore.go b/p2p/host/peerstore/ds/peerstore.go index 06b4fd351d..8e2070a163 100644 --- a/p2p/host/peerstore/ds/peerstore.go +++ b/p2p/host/peerstore/ds/peerstore.go @@ -4,9 +4,9 @@ import ( "context" "time" - "github.com/ipfs/go-datastore" pstore "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-libp2p-peerstore/mem" + "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" ) // NewPeerstore creates a peerstore backed by the provided persistent datastore. diff --git a/p2p/host/peerstore/interface.go b/p2p/host/peerstore/interface.go index 4206ca41b1..b1e3f3f3ba 100644 --- a/p2p/host/peerstore/interface.go +++ b/p2p/host/peerstore/interface.go @@ -7,9 +7,9 @@ import ( "gx/ipfs/QmVmDhyTTUcQXFD1rRQ64fGLMSAoaQvNH3hwuaCFAPq2hy/errors" - ic "github.com/libp2p/go-libp2p-crypto" - "github.com/libp2p/go-libp2p-peer" - ma "github.com/multiformats/go-multiaddr" + ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) var ErrNotFound = errors.New("item not found") diff --git a/p2p/host/peerstore/mem/addr_manager.go b/p2p/host/peerstore/mem/addr_manager.go index e6a9d8c280..210b0e25df 100644 --- a/p2p/host/peerstore/mem/addr_manager.go +++ b/p2p/host/peerstore/mem/addr_manager.go @@ -6,11 +6,11 @@ import ( "sync" "time" - logging "github.com/ipfs/go-log" - "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-libp2p-peerstore/addr" - ma "github.com/multiformats/go-multiaddr" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) var log = logging.Logger("peerstore") diff --git a/p2p/host/peerstore/mem/keybook.go b/p2p/host/peerstore/mem/keybook.go index e67e8f2af1..6d9b0124fc 100644 --- a/p2p/host/peerstore/mem/keybook.go +++ b/p2p/host/peerstore/mem/keybook.go @@ -4,9 +4,9 @@ import ( "errors" "sync" - ic "github.com/libp2p/go-libp2p-crypto" - "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" + ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ) type memoryKeyBook struct { diff --git a/p2p/host/peerstore/mem/metadata.go b/p2p/host/peerstore/mem/metadata.go index 26324b82fa..0908fb5b68 100644 --- a/p2p/host/peerstore/mem/metadata.go +++ b/p2p/host/peerstore/mem/metadata.go @@ -3,8 +3,8 @@ package mem import ( "sync" - "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ) type memoryPeerMetadata struct { diff --git a/p2p/host/peerstore/metrics.go b/p2p/host/peerstore/metrics.go index 05b867692b..e269612e9a 100644 --- a/p2p/host/peerstore/metrics.go +++ b/p2p/host/peerstore/metrics.go @@ -4,7 +4,7 @@ import ( "sync" "time" - "github.com/libp2p/go-libp2p-peer" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ) // LatencyEWMASmooting governs the decay of the EWMA (the speed diff --git a/p2p/host/peerstore/metrics_test.go b/p2p/host/peerstore/metrics_test.go index 94a741182d..63aef40c3d 100644 --- a/p2p/host/peerstore/metrics_test.go +++ b/p2p/host/peerstore/metrics_test.go @@ -7,7 +7,7 @@ import ( "testing" "time" - testutil "github.com/libp2p/go-libp2p-peer/test" + testutil "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer/test" ) func TestLatencyEWMAFun(t *testing.T) { diff --git a/p2p/host/peerstore/peerinfo.go b/p2p/host/peerstore/peerinfo.go index f41b9f85ad..f7110440e6 100644 --- a/p2p/host/peerstore/peerinfo.go +++ b/p2p/host/peerstore/peerinfo.go @@ -5,8 +5,8 @@ import ( "fmt" "strings" - "github.com/libp2p/go-libp2p-peer" - ma "github.com/multiformats/go-multiaddr" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) // PeerInfo is a small struct used to pass around a peer with diff --git a/p2p/host/peerstore/peerinfo_test.go b/p2p/host/peerstore/peerinfo_test.go index 57ca5cc87f..ae80f0cc5b 100644 --- a/p2p/host/peerstore/peerinfo_test.go +++ b/p2p/host/peerstore/peerinfo_test.go @@ -3,8 +3,8 @@ package peerstore import ( "testing" - peer "github.com/libp2p/go-libp2p-peer" - ma "github.com/multiformats/go-multiaddr" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) func mustAddr(t *testing.T, s string) ma.Multiaddr { diff --git a/p2p/host/peerstore/peerstore.go b/p2p/host/peerstore/peerstore.go index b4d35a2cc1..66979b164c 100644 --- a/p2p/host/peerstore/peerstore.go +++ b/p2p/host/peerstore/peerstore.go @@ -4,7 +4,7 @@ import ( "fmt" "sync" - "github.com/libp2p/go-libp2p-peer" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ) var _ Peerstore = (*peerstore)(nil) diff --git a/p2p/host/peerstore/queue/distance.go b/p2p/host/peerstore/queue/distance.go index f89e8d4210..ca67ea8d8c 100644 --- a/p2p/host/peerstore/queue/distance.go +++ b/p2p/host/peerstore/queue/distance.go @@ -5,8 +5,8 @@ import ( "math/big" "sync" - peer "github.com/libp2p/go-libp2p-peer" - ks "github.com/whyrusleeping/go-keyspace" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + ks "gx/ipfs/QmUusaX99BZoELh7dmPgirqRQ1FAmMnmnBn3oiqDFGBUSc/go-keyspace" ) // peerMetric tracks a peer and its distance to something else. diff --git a/p2p/host/peerstore/queue/interface.go b/p2p/host/peerstore/queue/interface.go index eab523a125..44ba1ca0c3 100644 --- a/p2p/host/peerstore/queue/interface.go +++ b/p2p/host/peerstore/queue/interface.go @@ -1,6 +1,6 @@ package queue -import peer "github.com/libp2p/go-libp2p-peer" +import peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" // PeerQueue maintains a set of peers ordered according to a metric. // Implementations of PeerQueue could order peers based on distances along diff --git a/p2p/host/peerstore/queue/queue_test.go b/p2p/host/peerstore/queue/queue_test.go index e30794b0cf..cc91118be2 100644 --- a/p2p/host/peerstore/queue/queue_test.go +++ b/p2p/host/peerstore/queue/queue_test.go @@ -7,8 +7,8 @@ import ( "testing" "time" - peer "github.com/libp2p/go-libp2p-peer" - mh "github.com/multiformats/go-multihash" + mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ) func TestQueue(t *testing.T) { diff --git a/p2p/host/peerstore/queue/sync.go b/p2p/host/peerstore/queue/sync.go index a1edc2ccbc..12bc24afe5 100644 --- a/p2p/host/peerstore/queue/sync.go +++ b/p2p/host/peerstore/queue/sync.go @@ -3,8 +3,8 @@ package queue import ( "context" - logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" ) var log = logging.Logger("peerqueue") diff --git a/p2p/host/peerstore/test/addr_manager_suite.go b/p2p/host/peerstore/test/addr_manager_suite.go index 96408d787b..4b29efabae 100644 --- a/p2p/host/peerstore/test/addr_manager_suite.go +++ b/p2p/host/peerstore/test/addr_manager_suite.go @@ -4,9 +4,9 @@ import ( "testing" "time" - "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" - ma "github.com/multiformats/go-multiaddr" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) var addressBookSuite = map[string]func(book pstore.AddrBook) func(*testing.T){ diff --git a/p2p/host/peerstore/test/benchmark_utils.go b/p2p/host/peerstore/test/benchmark_utils.go index b6d096cd5c..7008d5081d 100644 --- a/p2p/host/peerstore/test/benchmark_utils.go +++ b/p2p/host/peerstore/test/benchmark_utils.go @@ -6,9 +6,9 @@ import ( "fmt" "testing" - "github.com/mr-tron/base58/base58" - ma "github.com/multiformats/go-multiaddr" - mh "github.com/multiformats/go-multihash" + mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + "gx/ipfs/QmWFAMPqsEyUX7gDUsRVmMWz59FxSpJ1b2v6bJ1yYzo7jY/go-base58-fast/base58" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) type peerpair struct { diff --git a/p2p/host/peerstore/test/peerstore_suite.go b/p2p/host/peerstore/test/peerstore_suite.go index fed435ae1a..5d1a81bf0d 100644 --- a/p2p/host/peerstore/test/peerstore_suite.go +++ b/p2p/host/peerstore/test/peerstore_suite.go @@ -8,10 +8,10 @@ import ( "testing" "time" - "github.com/libp2p/go-libp2p-crypto" - "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" - ma "github.com/multiformats/go-multiaddr" + "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) var peerstoreSuite = map[string]func(book pstore.Peerstore) func(*testing.T){ diff --git a/p2p/host/peerstore/test/test_utils.go b/p2p/host/peerstore/test/test_utils.go index 3bca8512ea..26ab537496 100644 --- a/p2p/host/peerstore/test/test_utils.go +++ b/p2p/host/peerstore/test/test_utils.go @@ -5,9 +5,9 @@ import ( "math/rand" "time" - ci "github.com/libp2p/go-libp2p-crypto" - peer "github.com/libp2p/go-libp2p-peer" - mh "github.com/multiformats/go-multihash" + mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" + ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" + peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ) func timeSeededRand() io.Reader { From 4fa0970e3127b33615eccfa2b1be5b82f4e93b8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 30 Aug 2018 16:24:09 +0100 Subject: [PATCH 05/18] organise imports. --- p2p/host/peerstore/addr/sorting.go | 4 ++-- p2p/host/peerstore/ds/addr_manager.go | 5 +++-- p2p/host/peerstore/ds/ds_test.go | 5 +++-- p2p/host/peerstore/ds/peerstore.go | 3 ++- p2p/host/peerstore/mem/addr_manager.go | 5 +++-- p2p/host/peerstore/mem/keybook.go | 3 ++- p2p/host/peerstore/mem/metadata.go | 3 ++- p2p/host/peerstore/metrics_test.go | 2 +- p2p/host/peerstore/peerinfo_test.go | 2 +- p2p/host/peerstore/queue/distance.go | 2 +- p2p/host/peerstore/queue/interface.go | 2 +- p2p/host/peerstore/queue/queue_test.go | 2 +- p2p/host/peerstore/queue/sync.go | 2 +- p2p/host/peerstore/test/addr_manager_suite.go | 3 ++- p2p/host/peerstore/test/peerstore_suite.go | 3 ++- p2p/host/peerstore/test/test_utils.go | 2 +- 16 files changed, 28 insertions(+), 20 deletions(-) diff --git a/p2p/host/peerstore/addr/sorting.go b/p2p/host/peerstore/addr/sorting.go index afeab089b6..f66dc6cb18 100644 --- a/p2p/host/peerstore/addr/sorting.go +++ b/p2p/host/peerstore/addr/sorting.go @@ -3,8 +3,8 @@ package addr import ( "bytes" - mafmt "gx/ipfs/QmQscWDtDBDsWAM58aY6gU2KtxyFFmvvZgdfJExYPLgtXA/mafmt" - manet "gx/ipfs/QmV6FjemM1K8oXjrvuq3wuVWWoU2TLDPmNnKrxHzY3v6Ai/go-multiaddr-net" + "gx/ipfs/QmQscWDtDBDsWAM58aY6gU2KtxyFFmvvZgdfJExYPLgtXA/mafmt" + "gx/ipfs/QmV6FjemM1K8oXjrvuq3wuVWWoU2TLDPmNnKrxHzY3v6Ai/go-multiaddr-net" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) diff --git a/p2p/host/peerstore/ds/addr_manager.go b/p2p/host/peerstore/ds/addr_manager.go index 2bf8c28c87..2b0fb55e36 100644 --- a/p2p/host/peerstore/ds/addr_manager.go +++ b/p2p/host/peerstore/ds/addr_manager.go @@ -5,8 +5,6 @@ import ( "sync" "time" - pstore "github.com/libp2p/go-libp2p-peerstore" - "github.com/libp2p/go-libp2p-peerstore/mem" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" @@ -14,6 +12,9 @@ import ( ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + + pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-peerstore/mem" ) var log = logging.Logger("peerstore/ds") diff --git a/p2p/host/peerstore/ds/ds_test.go b/p2p/host/peerstore/ds/ds_test.go index b2f70c0439..7e1d60821a 100644 --- a/p2p/host/peerstore/ds/ds_test.go +++ b/p2p/host/peerstore/ds/ds_test.go @@ -7,10 +7,11 @@ import ( "testing" "time" - "github.com/libp2p/go-libp2p-peerstore" - "github.com/libp2p/go-libp2p-peerstore/test" "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" "gx/ipfs/QmUCfrikzKVGAfpE31RPwPd32fu1DYxSG7HTGCadba5Wza/go-ds-badger" + + "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-peerstore/test" ) func setupBadgerDatastore(t testing.TB) (datastore.Batching, func()) { diff --git a/p2p/host/peerstore/ds/peerstore.go b/p2p/host/peerstore/ds/peerstore.go index 8e2070a163..cb96fec9f4 100644 --- a/p2p/host/peerstore/ds/peerstore.go +++ b/p2p/host/peerstore/ds/peerstore.go @@ -4,9 +4,10 @@ import ( "context" "time" + "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + pstore "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-libp2p-peerstore/mem" - "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" ) // NewPeerstore creates a peerstore backed by the provided persistent datastore. diff --git a/p2p/host/peerstore/mem/addr_manager.go b/p2p/host/peerstore/mem/addr_manager.go index 210b0e25df..8a7c3c6914 100644 --- a/p2p/host/peerstore/mem/addr_manager.go +++ b/p2p/host/peerstore/mem/addr_manager.go @@ -6,11 +6,12 @@ import ( "sync" "time" - pstore "github.com/libp2p/go-libp2p-peerstore" - "github.com/libp2p/go-libp2p-peerstore/addr" "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + + pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-peerstore/addr" ) var log = logging.Logger("peerstore") diff --git a/p2p/host/peerstore/mem/keybook.go b/p2p/host/peerstore/mem/keybook.go index 6d9b0124fc..ddfe1e0c0e 100644 --- a/p2p/host/peerstore/mem/keybook.go +++ b/p2p/host/peerstore/mem/keybook.go @@ -4,9 +4,10 @@ import ( "errors" "sync" - pstore "github.com/libp2p/go-libp2p-peerstore" ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + + pstore "github.com/libp2p/go-libp2p-peerstore" ) type memoryKeyBook struct { diff --git a/p2p/host/peerstore/mem/metadata.go b/p2p/host/peerstore/mem/metadata.go index 0908fb5b68..4a56035408 100644 --- a/p2p/host/peerstore/mem/metadata.go +++ b/p2p/host/peerstore/mem/metadata.go @@ -3,8 +3,9 @@ package mem import ( "sync" - pstore "github.com/libp2p/go-libp2p-peerstore" "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + + pstore "github.com/libp2p/go-libp2p-peerstore" ) type memoryPeerMetadata struct { diff --git a/p2p/host/peerstore/metrics_test.go b/p2p/host/peerstore/metrics_test.go index 63aef40c3d..a69e2fb969 100644 --- a/p2p/host/peerstore/metrics_test.go +++ b/p2p/host/peerstore/metrics_test.go @@ -7,7 +7,7 @@ import ( "testing" "time" - testutil "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer/test" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer/test" ) func TestLatencyEWMAFun(t *testing.T) { diff --git a/p2p/host/peerstore/peerinfo_test.go b/p2p/host/peerstore/peerinfo_test.go index ae80f0cc5b..eaff1978fc 100644 --- a/p2p/host/peerstore/peerinfo_test.go +++ b/p2p/host/peerstore/peerinfo_test.go @@ -3,7 +3,7 @@ package peerstore import ( "testing" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" ) diff --git a/p2p/host/peerstore/queue/distance.go b/p2p/host/peerstore/queue/distance.go index ca67ea8d8c..b33363dc97 100644 --- a/p2p/host/peerstore/queue/distance.go +++ b/p2p/host/peerstore/queue/distance.go @@ -5,7 +5,7 @@ import ( "math/big" "sync" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ks "gx/ipfs/QmUusaX99BZoELh7dmPgirqRQ1FAmMnmnBn3oiqDFGBUSc/go-keyspace" ) diff --git a/p2p/host/peerstore/queue/interface.go b/p2p/host/peerstore/queue/interface.go index 44ba1ca0c3..321f5f30e1 100644 --- a/p2p/host/peerstore/queue/interface.go +++ b/p2p/host/peerstore/queue/interface.go @@ -1,6 +1,6 @@ package queue -import peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" +import "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" // PeerQueue maintains a set of peers ordered according to a metric. // Implementations of PeerQueue could order peers based on distances along diff --git a/p2p/host/peerstore/queue/queue_test.go b/p2p/host/peerstore/queue/queue_test.go index cc91118be2..15a6e00b9c 100644 --- a/p2p/host/peerstore/queue/queue_test.go +++ b/p2p/host/peerstore/queue/queue_test.go @@ -8,7 +8,7 @@ import ( "time" mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ) func TestQueue(t *testing.T) { diff --git a/p2p/host/peerstore/queue/sync.go b/p2p/host/peerstore/queue/sync.go index 12bc24afe5..830fdebadf 100644 --- a/p2p/host/peerstore/queue/sync.go +++ b/p2p/host/peerstore/queue/sync.go @@ -3,7 +3,7 @@ package queue import ( "context" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" ) diff --git a/p2p/host/peerstore/test/addr_manager_suite.go b/p2p/host/peerstore/test/addr_manager_suite.go index 4b29efabae..a66918c224 100644 --- a/p2p/host/peerstore/test/addr_manager_suite.go +++ b/p2p/host/peerstore/test/addr_manager_suite.go @@ -4,9 +4,10 @@ import ( "testing" "time" - pstore "github.com/libp2p/go-libp2p-peerstore" "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + + pstore "github.com/libp2p/go-libp2p-peerstore" ) var addressBookSuite = map[string]func(book pstore.AddrBook) func(*testing.T){ diff --git a/p2p/host/peerstore/test/peerstore_suite.go b/p2p/host/peerstore/test/peerstore_suite.go index 5d1a81bf0d..fdecd20ef0 100644 --- a/p2p/host/peerstore/test/peerstore_suite.go +++ b/p2p/host/peerstore/test/peerstore_suite.go @@ -8,10 +8,11 @@ import ( "testing" "time" - pstore "github.com/libp2p/go-libp2p-peerstore" "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + + pstore "github.com/libp2p/go-libp2p-peerstore" ) var peerstoreSuite = map[string]func(book pstore.Peerstore) func(*testing.T){ diff --git a/p2p/host/peerstore/test/test_utils.go b/p2p/host/peerstore/test/test_utils.go index 26ab537496..4d0b90a697 100644 --- a/p2p/host/peerstore/test/test_utils.go +++ b/p2p/host/peerstore/test/test_utils.go @@ -7,7 +7,7 @@ import ( mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - peer "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" ) func timeSeededRand() io.Reader { From ffdc59c20587506435c1a00808730cbed2039c90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 30 Aug 2018 16:43:40 +0100 Subject: [PATCH 06/18] normalize naming: AddrManager => AddrBook; ctor for memory-backed AddrBook. --- .../ds/{addr_manager.go => addr_book.go} | 34 ++-- p2p/host/peerstore/ds/ds_test.go | 2 +- p2p/host/peerstore/ds/peerstore.go | 4 +- p2p/host/peerstore/interface.go | 19 ++- .../mem/{addr_manager.go => addr_book.go} | 150 ++++++++---------- p2p/host/peerstore/mem/inmem_test.go | 2 +- p2p/host/peerstore/mem/keybook.go | 2 +- p2p/host/peerstore/mem/peerstore.go | 4 +- p2p/host/peerstore/peerstore.go | 3 - 9 files changed, 106 insertions(+), 114 deletions(-) rename p2p/host/peerstore/ds/{addr_manager.go => addr_book.go} (87%) rename p2p/host/peerstore/mem/{addr_manager.go => addr_book.go} (72%) diff --git a/p2p/host/peerstore/ds/addr_manager.go b/p2p/host/peerstore/ds/addr_book.go similarity index 87% rename from p2p/host/peerstore/ds/addr_manager.go rename to p2p/host/peerstore/ds/addr_book.go index 2b0fb55e36..2b57c0781f 100644 --- a/p2p/host/peerstore/ds/addr_manager.go +++ b/p2p/host/peerstore/ds/addr_book.go @@ -22,27 +22,27 @@ var log = logging.Logger("peerstore/ds") // Number of times to retry transactional writes var dsWriteRetries = 5 -var _ pstore.AddrBook = (*addrManager)(nil) +var _ pstore.AddrBook = (*dsAddrBook)(nil) -// addrManager is an address manager backed by a Datastore with both an +// dsAddrBook is an address manager backed by a Datastore with both an // in-memory TTL manager and an in-memory address stream manager. -type addrManager struct { +type dsAddrBook struct { cache *lru.ARCCache ds ds.Batching ttlManager *ttlmanager subsManager *mem.AddrSubManager } -// NewAddrManager initializes a new address manager given a +// NewAddrBook initializes a new address manager given a // Datastore instance, a context for managing the TTL manager, // and the interval at which the TTL manager should sweep the Datastore. -func NewAddrManager(ctx context.Context, ds ds.Batching, ttlInterval time.Duration) (*addrManager, error) { +func NewAddrBook(ctx context.Context, ds ds.Batching, ttlInterval time.Duration) (*dsAddrBook, error) { cache, err := lru.NewARC(1024) if err != nil { return nil, err } - mgr := &addrManager{ + mgr := &dsAddrBook{ cache: cache, ds: ds, ttlManager: newTTLManager(ctx, ds, cache, ttlInterval), @@ -52,7 +52,7 @@ func NewAddrManager(ctx context.Context, ds ds.Batching, ttlInterval time.Durati } // Stop will signal the TTL manager to stop and block until it returns. -func (mgr *addrManager) Stop() { +func (mgr *dsAddrBook) Stop() { mgr.ttlManager.cancel() } @@ -70,12 +70,12 @@ func peerIDFromKey(key ds.Key) (peer.ID, error) { } // AddAddr will add a new address if it's not already in the AddrBook. -func (mgr *addrManager) AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { +func (mgr *dsAddrBook) AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { mgr.AddAddrs(p, []ma.Multiaddr{addr}, ttl) } // AddAddrs will add many new addresses if they're not already in the AddrBook. -func (mgr *addrManager) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { +func (mgr *dsAddrBook) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { if ttl <= 0 { return } @@ -84,16 +84,16 @@ func (mgr *addrManager) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Durat } // SetAddr will add or update the TTL of an address in the AddrBook. -func (mgr *addrManager) SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { +func (mgr *dsAddrBook) SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { mgr.SetAddrs(p, []ma.Multiaddr{addr}, ttl) } // SetAddrs will add or update the TTLs of addresses in the AddrBook. -func (mgr *addrManager) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { +func (mgr *dsAddrBook) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { mgr.setAddrs(p, addrs, ttl, false) } -func (mgr *addrManager) setAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration, add bool) { +func (mgr *dsAddrBook) setAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration, add bool) { for i := 0; i < dsWriteRetries; i++ { // keys to add to the TTL manager var keys []ds.Key @@ -153,13 +153,13 @@ func (mgr *addrManager) setAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Durat // UpdateAddrs will update any addresses for a given peer and TTL combination to // have a new TTL. -func (mgr *addrManager) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) { +func (mgr *dsAddrBook) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) { prefix := ds.NewKey(p.Pretty()) mgr.ttlManager.updateTTLs(prefix, oldTTL, newTTL) } // Addrs Returns all of the non-expired addresses for a given peer. -func (mgr *addrManager) Addrs(p peer.ID) []ma.Multiaddr { +func (mgr *dsAddrBook) Addrs(p peer.ID) []ma.Multiaddr { prefix := ds.NewKey(p.Pretty()) q := query.Query{Prefix: prefix.String(), KeysOnly: true} results, err := mgr.ds.Query(q) @@ -193,7 +193,7 @@ func (mgr *addrManager) Addrs(p peer.ID) []ma.Multiaddr { } // Peers returns all of the peer IDs for which the AddrBook has addresses. -func (mgr *addrManager) AddrsPeers() []peer.ID { +func (mgr *dsAddrBook) AddrsPeers() []peer.ID { q := query.Query{KeysOnly: true} results, err := mgr.ds.Query(q) if err != nil { @@ -220,13 +220,13 @@ func (mgr *addrManager) AddrsPeers() []peer.ID { // AddrStream returns a channel on which all new addresses discovered for a // given peer ID will be published. -func (mgr *addrManager) AddrStream(ctx context.Context, p peer.ID) <-chan ma.Multiaddr { +func (mgr *dsAddrBook) AddrStream(ctx context.Context, p peer.ID) <-chan ma.Multiaddr { initial := mgr.Addrs(p) return mgr.subsManager.AddrStream(ctx, p, initial) } // ClearAddrs will delete all known addresses for a peer ID. -func (mgr *addrManager) ClearAddrs(p peer.ID) { +func (mgr *dsAddrBook) ClearAddrs(p peer.ID) { prefix := ds.NewKey(p.Pretty()) for i := 0; i < dsWriteRetries; i++ { q := query.Query{Prefix: prefix.String(), KeysOnly: true} diff --git a/p2p/host/peerstore/ds/ds_test.go b/p2p/host/peerstore/ds/ds_test.go index 7e1d60821a..c3a19d50a1 100644 --- a/p2p/host/peerstore/ds/ds_test.go +++ b/p2p/host/peerstore/ds/ds_test.go @@ -51,7 +51,7 @@ func TestBadgerDsAddrBook(t *testing.T) { test.TestAddrMgr(t, func() (peerstore.AddrBook, func()) { ds, closeDB := setupBadgerDatastore(t) - mgr, err := NewAddrManager(context.Background(), ds, 100*time.Microsecond) + mgr, err := NewAddrBook(context.Background(), ds, 100*time.Microsecond) if err != nil { t.Fatal(err) } diff --git a/p2p/host/peerstore/ds/peerstore.go b/p2p/host/peerstore/ds/peerstore.go index cb96fec9f4..2c63f1bcd6 100644 --- a/p2p/host/peerstore/ds/peerstore.go +++ b/p2p/host/peerstore/ds/peerstore.go @@ -12,11 +12,11 @@ import ( // NewPeerstore creates a peerstore backed by the provided persistent datastore. func NewPeerstore(ctx context.Context, ds datastore.Batching) (pstore.Peerstore, error) { - addrBook, err := NewAddrManager(ctx, ds, time.Second) + addrBook, err := NewAddrBook(ctx, ds, time.Second) if err != nil { return nil, err } - ps := pstore.NewPeerstoreWith(mem.NewKeybook(), addrBook, mem.NewPeerMetadata()) + ps := pstore.NewPeerstoreWith(mem.NewKeyBook(), addrBook, mem.NewPeerMetadata()) return ps, nil } diff --git a/p2p/host/peerstore/interface.go b/p2p/host/peerstore/interface.go index b1e3f3f3ba..9483b5132a 100644 --- a/p2p/host/peerstore/interface.go +++ b/p2p/host/peerstore/interface.go @@ -77,14 +77,13 @@ type PeerMetadata interface { Put(p peer.ID, key string, val interface{}) error } -// AddrBook is an interface that fits the new AddrManager. I'm patching -// it up in here to avoid changing a ton of the codebase. +// AddrBook holds the multiaddrs of peers. type AddrBook interface { // AddAddr calls AddAddrs(p, []ma.Multiaddr{addr}, ttl) AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) - // AddAddrs gives AddrManager addresses to use, with a given ttl + // AddAddrs gives this AddrBook addresses to use, with a given ttl // (time-to-live), after which the address is no longer valid. // If the manager has a longer TTL, the operation is a no-op for that address AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) @@ -111,17 +110,25 @@ type AddrBook interface { // ClearAddresses removes all previously stored addresses ClearAddrs(p peer.ID) - // Peers returns all of the peer IDs stored in the AddrBook + // AddrsPeers returns all of the peer IDs stored in the AddrBook AddrsPeers() []peer.ID } -// KeyBook tracks the Public keys of Peers. +// KeyBook tracks the keys of Peers. type KeyBook interface { - KeyBookPeers() []peer.ID + // PubKey stores the public key of a peer. PubKey(peer.ID) ic.PubKey + + // AddPubKey stores the public key of a peer. AddPubKey(peer.ID, ic.PubKey) error + // PrivKey returns the private key of a peer. PrivKey(peer.ID) ic.PrivKey + + // AddPrivKey stores the private key of a peer. AddPrivKey(peer.ID, ic.PrivKey) error + + // KeyBookPeers returns all the peer IDs stored in the KeyBook + KeyBookPeers() []peer.ID } diff --git a/p2p/host/peerstore/mem/addr_manager.go b/p2p/host/peerstore/mem/addr_book.go similarity index 72% rename from p2p/host/peerstore/mem/addr_manager.go rename to p2p/host/peerstore/mem/addr_book.go index 8a7c3c6914..ba343468c7 100644 --- a/p2p/host/peerstore/mem/addr_manager.go +++ b/p2p/host/peerstore/mem/addr_book.go @@ -28,63 +28,55 @@ func (e *expiringAddr) ExpiredBy(t time.Time) bool { type addrSlice []expiringAddr -var _ pstore.AddrBook = (*AddrManager)(nil) +var _ pstore.AddrBook = (*memoryAddrBook)(nil) -// AddrManager manages addresses. -// The zero-value is ready to be used. -type AddrManager struct { - addrmu sync.Mutex // guards addrs +// memoryAddrBook manages addresses. +type memoryAddrBook struct { + addrmu sync.Mutex addrs map[peer.ID]addrSlice subManager *AddrSubManager } -// ensures the AddrManager is initialized. -// So we can use the zero value. -func (mgr *AddrManager) init() { - if mgr.addrs == nil { - mgr.addrs = make(map[peer.ID]addrSlice) - } - if mgr.subManager == nil { - mgr.subManager = NewAddrSubManager() +func NewAddrBook() pstore.AddrBook { + return &memoryAddrBook{ + addrs: make(map[peer.ID]addrSlice), + subManager: NewAddrSubManager(), } } -func (mgr *AddrManager) AddrsPeers() []peer.ID { - mgr.addrmu.Lock() - defer mgr.addrmu.Unlock() - if mgr.addrs == nil { +func (mab *memoryAddrBook) AddrsPeers() []peer.ID { + mab.addrmu.Lock() + defer mab.addrmu.Unlock() + if mab.addrs == nil { return nil } - pids := make([]peer.ID, 0, len(mgr.addrs)) - for pid := range mgr.addrs { + pids := make([]peer.ID, 0, len(mab.addrs)) + for pid := range mab.addrs { pids = append(pids, pid) } return pids } // AddAddr calls AddAddrs(p, []ma.Multiaddr{addr}, ttl) -func (mgr *AddrManager) AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { - mgr.AddAddrs(p, []ma.Multiaddr{addr}, ttl) +func (mab *memoryAddrBook) AddAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { + mab.AddAddrs(p, []ma.Multiaddr{addr}, ttl) } -// AddAddrs gives AddrManager addresses to use, with a given ttl +// AddAddrs gives memoryAddrBook addresses to use, with a given ttl // (time-to-live), after which the address is no longer valid. // If the manager has a longer TTL, the operation is a no-op for that address -func (mgr *AddrManager) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { - mgr.addrmu.Lock() - defer mgr.addrmu.Unlock() +func (mab *memoryAddrBook) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { + mab.addrmu.Lock() + defer mab.addrmu.Unlock() // if ttl is zero, exit. nothing to do. if ttl <= 0 { return } - // so zero value can be used - mgr.init() - - oldAddrs := mgr.addrs[p] + oldAddrs := mab.addrs[p] amap := make(map[string]expiringAddr, len(oldAddrs)) for _, ea := range oldAddrs { amap[string(ea.Addr.Bytes())] = ea @@ -103,31 +95,28 @@ func (mgr *AddrManager) AddAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Durat if !found || exp.After(a.Expires) { amap[addrstr] = expiringAddr{Addr: addr, Expires: exp, TTL: ttl} - mgr.subManager.BroadcastAddr(p, addr) + mab.subManager.BroadcastAddr(p, addr) } } newAddrs := make([]expiringAddr, 0, len(amap)) for _, ea := range amap { newAddrs = append(newAddrs, ea) } - mgr.addrs[p] = newAddrs + mab.addrs[p] = newAddrs } // SetAddr calls mgr.SetAddrs(p, addr, ttl) -func (mgr *AddrManager) SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { - mgr.SetAddrs(p, []ma.Multiaddr{addr}, ttl) +func (mab *memoryAddrBook) SetAddr(p peer.ID, addr ma.Multiaddr, ttl time.Duration) { + mab.SetAddrs(p, []ma.Multiaddr{addr}, ttl) } // SetAddrs sets the ttl on addresses. This clears any TTL there previously. // This is used when we receive the best estimate of the validity of an address. -func (mgr *AddrManager) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { - mgr.addrmu.Lock() - defer mgr.addrmu.Unlock() - - // so zero value can be used - mgr.init() +func (mab *memoryAddrBook) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Duration) { + mab.addrmu.Lock() + defer mab.addrmu.Unlock() - oldAddrs := mgr.addrs[p] + oldAddrs := mab.addrs[p] amap := make(map[string]expiringAddr, len(oldAddrs)) for _, ea := range oldAddrs { amap[string(ea.Addr.Bytes())] = ea @@ -145,7 +134,7 @@ func (mgr *AddrManager) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Durat if ttl > 0 { amap[addrs] = expiringAddr{Addr: addr, Expires: exp, TTL: ttl} - mgr.subManager.BroadcastAddr(p, addr) + mab.subManager.BroadcastAddr(p, addr) } else { delete(amap, addrs) } @@ -154,20 +143,20 @@ func (mgr *AddrManager) SetAddrs(p peer.ID, addrs []ma.Multiaddr, ttl time.Durat for _, ea := range amap { newAddrs = append(newAddrs, ea) } - mgr.addrs[p] = newAddrs + mab.addrs[p] = newAddrs } // UpdateAddrs updates the addresses associated with the given peer that have // the given oldTTL to have the given newTTL. -func (mgr *AddrManager) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) { - mgr.addrmu.Lock() - defer mgr.addrmu.Unlock() +func (mab *memoryAddrBook) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time.Duration) { + mab.addrmu.Lock() + defer mab.addrmu.Unlock() - if mgr.addrs == nil { + if mab.addrs == nil { return } - addrs, found := mgr.addrs[p] + addrs, found := mab.addrs[p] if !found { return } @@ -184,16 +173,16 @@ func (mgr *AddrManager) UpdateAddrs(p peer.ID, oldTTL time.Duration, newTTL time } // Addresses returns all known (and valid) addresses for a given -func (mgr *AddrManager) Addrs(p peer.ID) []ma.Multiaddr { - mgr.addrmu.Lock() - defer mgr.addrmu.Unlock() +func (mab *memoryAddrBook) Addrs(p peer.ID) []ma.Multiaddr { + mab.addrmu.Lock() + defer mab.addrmu.Unlock() // not initialized? nothing to give. - if mgr.addrs == nil { + if mab.addrs == nil { return nil } - maddrs, found := mgr.addrs[p] + maddrs, found := mab.addrs[p] if !found { return nil } @@ -210,40 +199,52 @@ func (mgr *AddrManager) Addrs(p peer.ID) []ma.Multiaddr { // clean up the expired ones. if len(cleaned) == 0 { - delete(mgr.addrs, p) + delete(mab.addrs, p) } else { - mgr.addrs[p] = cleaned + mab.addrs[p] = cleaned } return good } // ClearAddrs removes all previously stored addresses -func (mgr *AddrManager) ClearAddrs(p peer.ID) { - mgr.addrmu.Lock() - defer mgr.addrmu.Unlock() - mgr.init() +func (mab *memoryAddrBook) ClearAddrs(p peer.ID) { + mab.addrmu.Lock() + defer mab.addrmu.Unlock() - delete(mgr.addrs, p) + delete(mab.addrs, p) } // AddrStream returns a channel on which all new addresses discovered for a // given peer ID will be published. -func (mgr *AddrManager) AddrStream(ctx context.Context, p peer.ID) <-chan ma.Multiaddr { - mgr.addrmu.Lock() - defer mgr.addrmu.Unlock() - mgr.init() +func (mab *memoryAddrBook) AddrStream(ctx context.Context, p peer.ID) <-chan ma.Multiaddr { + mab.addrmu.Lock() + defer mab.addrmu.Unlock() - baseaddrslice := mgr.addrs[p] + baseaddrslice := mab.addrs[p] initial := make([]ma.Multiaddr, 0, len(baseaddrslice)) for _, a := range baseaddrslice { initial = append(initial, a.Addr) } - return mgr.subManager.AddrStream(ctx, p, initial) + return mab.subManager.AddrStream(ctx, p, initial) +} + +type addrSub struct { + pubch chan ma.Multiaddr + lk sync.Mutex + buffer []ma.Multiaddr + ctx context.Context +} + +func (s *addrSub) pubAddr(a ma.Multiaddr) { + select { + case s.pubch <- a: + case <-s.ctx.Done(): + } } // An abstracted, pub-sub manager for address streams. Extracted from -// AddrManager in order to support additional implementations. +// memoryAddrBook in order to support additional implementations. type AddrSubManager struct { mu sync.RWMutex subs map[peer.ID][]*addrSub @@ -261,6 +262,7 @@ func NewAddrSubManager() *AddrSubManager { func (mgr *AddrSubManager) removeSub(p peer.ID, s *addrSub) { mgr.mu.Lock() defer mgr.mu.Unlock() + subs := mgr.subs[p] if len(subs) == 1 { if subs[0] != s { @@ -269,6 +271,7 @@ func (mgr *AddrSubManager) removeSub(p peer.ID, s *addrSub) { delete(mgr.subs, p) return } + for i, v := range subs { if v == s { subs[i] = subs[len(subs)-1] @@ -295,7 +298,6 @@ func (mgr *AddrSubManager) BroadcastAddr(p peer.ID, addr ma.Multiaddr) { // channel with any addresses we might already have on file. func (mgr *AddrSubManager) AddrStream(ctx context.Context, p peer.ID, initial []ma.Multiaddr) <-chan ma.Multiaddr { sub := &addrSub{pubch: make(chan ma.Multiaddr), ctx: ctx} - out := make(chan ma.Multiaddr) mgr.mu.Lock() @@ -357,17 +359,3 @@ func (mgr *AddrSubManager) AddrStream(ctx context.Context, p peer.ID, initial [] return out } - -type addrSub struct { - pubch chan ma.Multiaddr - lk sync.Mutex - buffer []ma.Multiaddr - ctx context.Context -} - -func (s *addrSub) pubAddr(a ma.Multiaddr) { - select { - case s.pubch <- a: - case <-s.ctx.Done(): - } -} diff --git a/p2p/host/peerstore/mem/inmem_test.go b/p2p/host/peerstore/mem/inmem_test.go index cedc65bd27..6f9b4a8d58 100644 --- a/p2p/host/peerstore/mem/inmem_test.go +++ b/p2p/host/peerstore/mem/inmem_test.go @@ -15,7 +15,7 @@ func TestInMemoryPeerstore(t *testing.T) { func TestInMemoryAddrMgr(t *testing.T) { test.TestAddrMgr(t, func() (pstore.AddrBook, func()) { - return &AddrManager{}, nil + return NewAddrBook(), nil }) } diff --git a/p2p/host/peerstore/mem/keybook.go b/p2p/host/peerstore/mem/keybook.go index ddfe1e0c0e..37e184e2af 100644 --- a/p2p/host/peerstore/mem/keybook.go +++ b/p2p/host/peerstore/mem/keybook.go @@ -19,7 +19,7 @@ type memoryKeyBook struct { var _ pstore.KeyBook = (*memoryKeyBook)(nil) // noop new, but in the future we may want to do some init work. -func NewKeybook() pstore.KeyBook { +func NewKeyBook() pstore.KeyBook { return &memoryKeyBook{ pks: map[peer.ID]ic.PubKey{}, sks: map[peer.ID]ic.PrivKey{}, diff --git a/p2p/host/peerstore/mem/peerstore.go b/p2p/host/peerstore/mem/peerstore.go index a706e0785e..ba4c5a3b79 100644 --- a/p2p/host/peerstore/mem/peerstore.go +++ b/p2p/host/peerstore/mem/peerstore.go @@ -5,7 +5,7 @@ import pstore "github.com/libp2p/go-libp2p-peerstore" // NewPeerstore creates an in-memory threadsafe collection of peers. func NewPeerstore() pstore.Peerstore { return pstore.NewPeerstoreWith( - NewKeybook(), - &AddrManager{}, + NewKeyBook(), + NewAddrBook(), NewPeerMetadata()) } diff --git a/p2p/host/peerstore/peerstore.go b/p2p/host/peerstore/peerstore.go index 66979b164c..fc9bf2ef34 100644 --- a/p2p/host/peerstore/peerstore.go +++ b/p2p/host/peerstore/peerstore.go @@ -25,9 +25,6 @@ func NewPeerstoreWith(kb KeyBook, ab AddrBook, md PeerMetadata) Peerstore { return &peerstore{ KeyBook: kb, PeerMetadata: md, - - // TODO: normalise the naming here AddrBook vs AddrManager. - // TODO: add a constructor NewAddrBook and make the struct private. AddrBook: ab, Metrics: NewMetrics(), } From 0d07edd8c784bb3ffe52e8d9d7fd41b5bef7a1a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 30 Aug 2018 18:05:22 +0100 Subject: [PATCH 07/18] go fmt. --- p2p/host/peerstore/peerstore.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/p2p/host/peerstore/peerstore.go b/p2p/host/peerstore/peerstore.go index fc9bf2ef34..d15d129edb 100644 --- a/p2p/host/peerstore/peerstore.go +++ b/p2p/host/peerstore/peerstore.go @@ -25,8 +25,8 @@ func NewPeerstoreWith(kb KeyBook, ab AddrBook, md PeerMetadata) Peerstore { return &peerstore{ KeyBook: kb, PeerMetadata: md, - AddrBook: ab, - Metrics: NewMetrics(), + AddrBook: ab, + Metrics: NewMetrics(), } } From 15272ee4215ce1cdbf20202b6fbd3bc7b6d6c857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Fri, 31 Aug 2018 13:23:02 +0100 Subject: [PATCH 08/18] go fmt. --- p2p/host/peerstore/mem/addr_book.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/p2p/host/peerstore/mem/addr_book.go b/p2p/host/peerstore/mem/addr_book.go index ba343468c7..e0c3f83109 100644 --- a/p2p/host/peerstore/mem/addr_book.go +++ b/p2p/host/peerstore/mem/addr_book.go @@ -40,7 +40,7 @@ type memoryAddrBook struct { func NewAddrBook() pstore.AddrBook { return &memoryAddrBook{ - addrs: make(map[peer.ID]addrSlice), + addrs: make(map[peer.ID]addrSlice), subManager: NewAddrSubManager(), } } @@ -262,7 +262,7 @@ func NewAddrSubManager() *AddrSubManager { func (mgr *AddrSubManager) removeSub(p peer.ID, s *addrSub) { mgr.mu.Lock() defer mgr.mu.Unlock() - + subs := mgr.subs[p] if len(subs) == 1 { if subs[0] != s { From f2db33fee7efc9ee4f970d8b802258ae0167dd1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Fri, 31 Aug 2018 13:30:13 +0100 Subject: [PATCH 09/18] fix nil dereference in benchmarks. --- p2p/host/peerstore/test/peerstore_suite.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/p2p/host/peerstore/test/peerstore_suite.go b/p2p/host/peerstore/test/peerstore_suite.go index fdecd20ef0..045d32d0bc 100644 --- a/p2p/host/peerstore/test/peerstore_suite.go +++ b/p2p/host/peerstore/test/peerstore_suite.go @@ -42,9 +42,12 @@ func TestPeerstore(t *testing.T, factory PeerstoreFactory) { func BenchmarkPeerstore(b *testing.B, factory PeerstoreFactory) { ps, closeFunc := factory() - defer closeFunc() b.Run("Peerstore", benchmarkPeerstore(ps)) + + if closeFunc != nil { + closeFunc() + } } func testAddrStream(ps pstore.Peerstore) func(t *testing.T) { From 124155a079ec92fcd0d081cecc462785572237f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Sun, 2 Sep 2018 12:03:02 +0100 Subject: [PATCH 10/18] rename ds package to pstoreds. --- p2p/host/peerstore/{ds => pstoreds}/addr_book.go | 2 +- p2p/host/peerstore/{ds => pstoreds}/ds_test.go | 2 +- p2p/host/peerstore/{ds => pstoreds}/peerstore.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename p2p/host/peerstore/{ds => pstoreds}/addr_book.go (99%) rename p2p/host/peerstore/{ds => pstoreds}/ds_test.go (98%) rename p2p/host/peerstore/{ds => pstoreds}/peerstore.go (97%) diff --git a/p2p/host/peerstore/ds/addr_book.go b/p2p/host/peerstore/pstoreds/addr_book.go similarity index 99% rename from p2p/host/peerstore/ds/addr_book.go rename to p2p/host/peerstore/pstoreds/addr_book.go index 2b57c0781f..8531a70ad9 100644 --- a/p2p/host/peerstore/ds/addr_book.go +++ b/p2p/host/peerstore/pstoreds/addr_book.go @@ -1,4 +1,4 @@ -package ds +package pstoreds import ( "context" diff --git a/p2p/host/peerstore/ds/ds_test.go b/p2p/host/peerstore/pstoreds/ds_test.go similarity index 98% rename from p2p/host/peerstore/ds/ds_test.go rename to p2p/host/peerstore/pstoreds/ds_test.go index c3a19d50a1..f637cf1132 100644 --- a/p2p/host/peerstore/ds/ds_test.go +++ b/p2p/host/peerstore/pstoreds/ds_test.go @@ -1,4 +1,4 @@ -package ds +package pstoreds import ( "context" diff --git a/p2p/host/peerstore/ds/peerstore.go b/p2p/host/peerstore/pstoreds/peerstore.go similarity index 97% rename from p2p/host/peerstore/ds/peerstore.go rename to p2p/host/peerstore/pstoreds/peerstore.go index 2c63f1bcd6..8551993e84 100644 --- a/p2p/host/peerstore/ds/peerstore.go +++ b/p2p/host/peerstore/pstoreds/peerstore.go @@ -1,4 +1,4 @@ -package ds +package pstoreds import ( "context" From e65fb60b9767e9b2244cab24f1845b9f5c45114e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Sun, 2 Sep 2018 12:10:55 +0100 Subject: [PATCH 11/18] gx-go unrewrite. --- p2p/host/peerstore/addr/addrsrcs.go | 2 +- p2p/host/peerstore/addr/addrsrcs_test.go | 2 +- p2p/host/peerstore/addr/sorting.go | 6 +++--- p2p/host/peerstore/interface.go | 8 ++++---- p2p/host/peerstore/mem/addr_book.go | 6 +++--- p2p/host/peerstore/mem/keybook.go | 4 ++-- p2p/host/peerstore/mem/metadata.go | 2 +- p2p/host/peerstore/metrics.go | 2 +- p2p/host/peerstore/metrics_test.go | 2 +- p2p/host/peerstore/peerinfo.go | 4 ++-- p2p/host/peerstore/peerinfo_test.go | 4 ++-- p2p/host/peerstore/peerstore.go | 2 +- p2p/host/peerstore/pstoreds/addr_book.go | 14 +++++++------- p2p/host/peerstore/pstoreds/ds_test.go | 4 ++-- p2p/host/peerstore/pstoreds/peerstore.go | 2 +- p2p/host/peerstore/queue/distance.go | 4 ++-- p2p/host/peerstore/queue/interface.go | 2 +- p2p/host/peerstore/queue/queue_test.go | 4 ++-- p2p/host/peerstore/queue/sync.go | 4 ++-- p2p/host/peerstore/test/addr_manager_suite.go | 4 ++-- p2p/host/peerstore/test/benchmark_utils.go | 6 +++--- p2p/host/peerstore/test/peerstore_suite.go | 6 +++--- p2p/host/peerstore/test/test_utils.go | 6 +++--- 23 files changed, 50 insertions(+), 50 deletions(-) diff --git a/p2p/host/peerstore/addr/addrsrcs.go b/p2p/host/peerstore/addr/addrsrcs.go index fd959b1fae..9be78d5ccc 100644 --- a/p2p/host/peerstore/addr/addrsrcs.go +++ b/p2p/host/peerstore/addr/addrsrcs.go @@ -2,7 +2,7 @@ package addr import ( - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + ma "github.com/multiformats/go-multiaddr" ) // AddrSource is a source of addresses. It allows clients to retrieve diff --git a/p2p/host/peerstore/addr/addrsrcs_test.go b/p2p/host/peerstore/addr/addrsrcs_test.go index a186012f06..06bea07bce 100644 --- a/p2p/host/peerstore/addr/addrsrcs_test.go +++ b/p2p/host/peerstore/addr/addrsrcs_test.go @@ -4,7 +4,7 @@ import ( "fmt" "testing" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + ma "github.com/multiformats/go-multiaddr" ) func newAddrOrFatal(t *testing.T, s string) ma.Multiaddr { diff --git a/p2p/host/peerstore/addr/sorting.go b/p2p/host/peerstore/addr/sorting.go index f66dc6cb18..5ca91d787f 100644 --- a/p2p/host/peerstore/addr/sorting.go +++ b/p2p/host/peerstore/addr/sorting.go @@ -3,9 +3,9 @@ package addr import ( "bytes" - "gx/ipfs/QmQscWDtDBDsWAM58aY6gU2KtxyFFmvvZgdfJExYPLgtXA/mafmt" - "gx/ipfs/QmV6FjemM1K8oXjrvuq3wuVWWoU2TLDPmNnKrxHzY3v6Ai/go-multiaddr-net" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + ma "github.com/multiformats/go-multiaddr" + "github.com/multiformats/go-multiaddr-net" + "github.com/whyrusleeping/mafmt" ) func isFDCostlyTransport(a ma.Multiaddr) bool { diff --git a/p2p/host/peerstore/interface.go b/p2p/host/peerstore/interface.go index 9483b5132a..0f4d5ba8c7 100644 --- a/p2p/host/peerstore/interface.go +++ b/p2p/host/peerstore/interface.go @@ -5,11 +5,11 @@ import ( "math" "time" - "gx/ipfs/QmVmDhyTTUcQXFD1rRQ64fGLMSAoaQvNH3hwuaCFAPq2hy/errors" + "github.com/pkg/errors" - ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + ic "github.com/libp2p/go-libp2p-crypto" + "github.com/libp2p/go-libp2p-peer" + ma "github.com/multiformats/go-multiaddr" ) var ErrNotFound = errors.New("item not found") diff --git a/p2p/host/peerstore/mem/addr_book.go b/p2p/host/peerstore/mem/addr_book.go index e0c3f83109..72b7a6f5b9 100644 --- a/p2p/host/peerstore/mem/addr_book.go +++ b/p2p/host/peerstore/mem/addr_book.go @@ -6,9 +6,9 @@ import ( "sync" "time" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + logging "github.com/ipfs/go-log" + "github.com/libp2p/go-libp2p-peer" + ma "github.com/multiformats/go-multiaddr" pstore "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-libp2p-peerstore/addr" diff --git a/p2p/host/peerstore/mem/keybook.go b/p2p/host/peerstore/mem/keybook.go index 37e184e2af..290e6bd67d 100644 --- a/p2p/host/peerstore/mem/keybook.go +++ b/p2p/host/peerstore/mem/keybook.go @@ -4,8 +4,8 @@ import ( "errors" "sync" - ic "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + ic "github.com/libp2p/go-libp2p-crypto" + "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" ) diff --git a/p2p/host/peerstore/mem/metadata.go b/p2p/host/peerstore/mem/metadata.go index 4a56035408..f7c0da7179 100644 --- a/p2p/host/peerstore/mem/metadata.go +++ b/p2p/host/peerstore/mem/metadata.go @@ -3,7 +3,7 @@ package mem import ( "sync" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + "github.com/libp2p/go-libp2p-peer" pstore "github.com/libp2p/go-libp2p-peerstore" ) diff --git a/p2p/host/peerstore/metrics.go b/p2p/host/peerstore/metrics.go index e269612e9a..05b867692b 100644 --- a/p2p/host/peerstore/metrics.go +++ b/p2p/host/peerstore/metrics.go @@ -4,7 +4,7 @@ import ( "sync" "time" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + "github.com/libp2p/go-libp2p-peer" ) // LatencyEWMASmooting governs the decay of the EWMA (the speed diff --git a/p2p/host/peerstore/metrics_test.go b/p2p/host/peerstore/metrics_test.go index a69e2fb969..2010db3089 100644 --- a/p2p/host/peerstore/metrics_test.go +++ b/p2p/host/peerstore/metrics_test.go @@ -7,7 +7,7 @@ import ( "testing" "time" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer/test" + "github.com/libp2p/go-libp2p-peer/test" ) func TestLatencyEWMAFun(t *testing.T) { diff --git a/p2p/host/peerstore/peerinfo.go b/p2p/host/peerstore/peerinfo.go index f7110440e6..f41b9f85ad 100644 --- a/p2p/host/peerstore/peerinfo.go +++ b/p2p/host/peerstore/peerinfo.go @@ -5,8 +5,8 @@ import ( "fmt" "strings" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + "github.com/libp2p/go-libp2p-peer" + ma "github.com/multiformats/go-multiaddr" ) // PeerInfo is a small struct used to pass around a peer with diff --git a/p2p/host/peerstore/peerinfo_test.go b/p2p/host/peerstore/peerinfo_test.go index eaff1978fc..84a44b1797 100644 --- a/p2p/host/peerstore/peerinfo_test.go +++ b/p2p/host/peerstore/peerinfo_test.go @@ -3,8 +3,8 @@ package peerstore import ( "testing" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + "github.com/libp2p/go-libp2p-peer" + ma "github.com/multiformats/go-multiaddr" ) func mustAddr(t *testing.T, s string) ma.Multiaddr { diff --git a/p2p/host/peerstore/peerstore.go b/p2p/host/peerstore/peerstore.go index d15d129edb..c29efdb15e 100644 --- a/p2p/host/peerstore/peerstore.go +++ b/p2p/host/peerstore/peerstore.go @@ -4,7 +4,7 @@ import ( "fmt" "sync" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + "github.com/libp2p/go-libp2p-peer" ) var _ Peerstore = (*peerstore)(nil) diff --git a/p2p/host/peerstore/pstoreds/addr_book.go b/p2p/host/peerstore/pstoreds/addr_book.go index 8531a70ad9..37425904ac 100644 --- a/p2p/host/peerstore/pstoreds/addr_book.go +++ b/p2p/host/peerstore/pstoreds/addr_book.go @@ -5,13 +5,13 @@ import ( "sync" "time" - mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - "gx/ipfs/QmQjMHF8ptRgx4E57UFMiT4YM6kqaJeYxZ1MCDX23aw4rK/golang-lru" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" - ds "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore/query" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + "github.com/hashicorp/golang-lru" + ds "github.com/ipfs/go-datastore" + "github.com/ipfs/go-datastore/query" + logging "github.com/ipfs/go-log" + "github.com/libp2p/go-libp2p-peer" + ma "github.com/multiformats/go-multiaddr" + mh "github.com/multiformats/go-multihash" pstore "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-libp2p-peerstore/mem" diff --git a/p2p/host/peerstore/pstoreds/ds_test.go b/p2p/host/peerstore/pstoreds/ds_test.go index f637cf1132..29d6513cee 100644 --- a/p2p/host/peerstore/pstoreds/ds_test.go +++ b/p2p/host/peerstore/pstoreds/ds_test.go @@ -7,8 +7,8 @@ import ( "testing" "time" - "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" - "gx/ipfs/QmUCfrikzKVGAfpE31RPwPd32fu1DYxSG7HTGCadba5Wza/go-ds-badger" + "github.com/ipfs/go-datastore" + "github.com/ipfs/go-ds-badger" "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-libp2p-peerstore/test" diff --git a/p2p/host/peerstore/pstoreds/peerstore.go b/p2p/host/peerstore/pstoreds/peerstore.go index 8551993e84..0ce3926a15 100644 --- a/p2p/host/peerstore/pstoreds/peerstore.go +++ b/p2p/host/peerstore/pstoreds/peerstore.go @@ -4,7 +4,7 @@ import ( "context" "time" - "gx/ipfs/QmSpg1CvpXQQow5ernt1gNBXaXV6yxyNqi7XoeerWfzB5w/go-datastore" + "github.com/ipfs/go-datastore" pstore "github.com/libp2p/go-libp2p-peerstore" "github.com/libp2p/go-libp2p-peerstore/mem" diff --git a/p2p/host/peerstore/queue/distance.go b/p2p/host/peerstore/queue/distance.go index b33363dc97..9c3e026e55 100644 --- a/p2p/host/peerstore/queue/distance.go +++ b/p2p/host/peerstore/queue/distance.go @@ -5,8 +5,8 @@ import ( "math/big" "sync" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - ks "gx/ipfs/QmUusaX99BZoELh7dmPgirqRQ1FAmMnmnBn3oiqDFGBUSc/go-keyspace" + "github.com/libp2p/go-libp2p-peer" + ks "github.com/whyrusleeping/go-keyspace" ) // peerMetric tracks a peer and its distance to something else. diff --git a/p2p/host/peerstore/queue/interface.go b/p2p/host/peerstore/queue/interface.go index 321f5f30e1..26e1d48b7d 100644 --- a/p2p/host/peerstore/queue/interface.go +++ b/p2p/host/peerstore/queue/interface.go @@ -1,6 +1,6 @@ package queue -import "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" +import "github.com/libp2p/go-libp2p-peer" // PeerQueue maintains a set of peers ordered according to a metric. // Implementations of PeerQueue could order peers based on distances along diff --git a/p2p/host/peerstore/queue/queue_test.go b/p2p/host/peerstore/queue/queue_test.go index 15a6e00b9c..93b0e9f570 100644 --- a/p2p/host/peerstore/queue/queue_test.go +++ b/p2p/host/peerstore/queue/queue_test.go @@ -7,8 +7,8 @@ import ( "testing" "time" - mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + "github.com/libp2p/go-libp2p-peer" + mh "github.com/multiformats/go-multihash" ) func TestQueue(t *testing.T) { diff --git a/p2p/host/peerstore/queue/sync.go b/p2p/host/peerstore/queue/sync.go index 830fdebadf..3815ec782c 100644 --- a/p2p/host/peerstore/queue/sync.go +++ b/p2p/host/peerstore/queue/sync.go @@ -3,8 +3,8 @@ package queue import ( "context" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - logging "gx/ipfs/QmRREK2CAZ5Re2Bd9zZFG6FeYDppUWt5cMgsoUEp3ktgSr/go-log" + logging "github.com/ipfs/go-log" + "github.com/libp2p/go-libp2p-peer" ) var log = logging.Logger("peerqueue") diff --git a/p2p/host/peerstore/test/addr_manager_suite.go b/p2p/host/peerstore/test/addr_manager_suite.go index a66918c224..acc0165744 100644 --- a/p2p/host/peerstore/test/addr_manager_suite.go +++ b/p2p/host/peerstore/test/addr_manager_suite.go @@ -4,8 +4,8 @@ import ( "testing" "time" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + "github.com/libp2p/go-libp2p-peer" + ma "github.com/multiformats/go-multiaddr" pstore "github.com/libp2p/go-libp2p-peerstore" ) diff --git a/p2p/host/peerstore/test/benchmark_utils.go b/p2p/host/peerstore/test/benchmark_utils.go index 7008d5081d..b6d096cd5c 100644 --- a/p2p/host/peerstore/test/benchmark_utils.go +++ b/p2p/host/peerstore/test/benchmark_utils.go @@ -6,9 +6,9 @@ import ( "fmt" "testing" - mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - "gx/ipfs/QmWFAMPqsEyUX7gDUsRVmMWz59FxSpJ1b2v6bJ1yYzo7jY/go-base58-fast/base58" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + "github.com/mr-tron/base58/base58" + ma "github.com/multiformats/go-multiaddr" + mh "github.com/multiformats/go-multihash" ) type peerpair struct { diff --git a/p2p/host/peerstore/test/peerstore_suite.go b/p2p/host/peerstore/test/peerstore_suite.go index 045d32d0bc..5317a4964f 100644 --- a/p2p/host/peerstore/test/peerstore_suite.go +++ b/p2p/host/peerstore/test/peerstore_suite.go @@ -8,9 +8,9 @@ import ( "testing" "time" - "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" - ma "gx/ipfs/QmYmsdtJ3HsodkePE3eU3TsCaP2YvPZJ4LoXnNkDE5Tpt7/go-multiaddr" + "github.com/libp2p/go-libp2p-crypto" + "github.com/libp2p/go-libp2p-peer" + ma "github.com/multiformats/go-multiaddr" pstore "github.com/libp2p/go-libp2p-peerstore" ) diff --git a/p2p/host/peerstore/test/test_utils.go b/p2p/host/peerstore/test/test_utils.go index 4d0b90a697..fd66d73da9 100644 --- a/p2p/host/peerstore/test/test_utils.go +++ b/p2p/host/peerstore/test/test_utils.go @@ -5,9 +5,9 @@ import ( "math/rand" "time" - mh "gx/ipfs/QmPnFwZ2JXKnXgMw8CdBPxn7FWh6LLdjUjxV1fKHuJnkr8/go-multihash" - ci "gx/ipfs/QmPvyPwuCgJ7pDmrKDxRtsScJgBaM5h4EpRL2qQJsmXf4n/go-libp2p-crypto" - "gx/ipfs/QmQsErDt8Qgw1XrsXf2BpEzDgGWtB1YLsTAARBup5b6B9W/go-libp2p-peer" + ci "github.com/libp2p/go-libp2p-crypto" + "github.com/libp2p/go-libp2p-peer" + mh "github.com/multiformats/go-multihash" ) func timeSeededRand() io.Reader { From 8bdb5ba6941d62a5751c0de072ebfd1ec196ca5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Sun, 2 Sep 2018 12:18:00 +0100 Subject: [PATCH 12/18] rename *Peers() to PeersWith*(). --- p2p/host/peerstore/interface.go | 8 ++++---- p2p/host/peerstore/mem/addr_book.go | 2 +- p2p/host/peerstore/mem/keybook.go | 2 +- p2p/host/peerstore/peerstore.go | 4 ++-- p2p/host/peerstore/pstoreds/addr_book.go | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/p2p/host/peerstore/interface.go b/p2p/host/peerstore/interface.go index 0f4d5ba8c7..468a8a12a9 100644 --- a/p2p/host/peerstore/interface.go +++ b/p2p/host/peerstore/interface.go @@ -110,8 +110,8 @@ type AddrBook interface { // ClearAddresses removes all previously stored addresses ClearAddrs(p peer.ID) - // AddrsPeers returns all of the peer IDs stored in the AddrBook - AddrsPeers() []peer.ID + // PeersWithAddrs returns all of the peer IDs stored in the AddrBook + PeersWithAddrs() []peer.ID } // KeyBook tracks the keys of Peers. @@ -129,6 +129,6 @@ type KeyBook interface { // AddPrivKey stores the private key of a peer. AddPrivKey(peer.ID, ic.PrivKey) error - // KeyBookPeers returns all the peer IDs stored in the KeyBook - KeyBookPeers() []peer.ID + // PeersWithKeys returns all the peer IDs stored in the KeyBook + PeersWithKeys() []peer.ID } diff --git a/p2p/host/peerstore/mem/addr_book.go b/p2p/host/peerstore/mem/addr_book.go index 72b7a6f5b9..d0cf980195 100644 --- a/p2p/host/peerstore/mem/addr_book.go +++ b/p2p/host/peerstore/mem/addr_book.go @@ -45,7 +45,7 @@ func NewAddrBook() pstore.AddrBook { } } -func (mab *memoryAddrBook) AddrsPeers() []peer.ID { +func (mab *memoryAddrBook) PeersWithAddrs() []peer.ID { mab.addrmu.Lock() defer mab.addrmu.Unlock() if mab.addrs == nil { diff --git a/p2p/host/peerstore/mem/keybook.go b/p2p/host/peerstore/mem/keybook.go index 290e6bd67d..053ffe401a 100644 --- a/p2p/host/peerstore/mem/keybook.go +++ b/p2p/host/peerstore/mem/keybook.go @@ -26,7 +26,7 @@ func NewKeyBook() pstore.KeyBook { } } -func (mkb *memoryKeyBook) KeyBookPeers() []peer.ID { +func (mkb *memoryKeyBook) PeersWithKeys() []peer.ID { mkb.RLock() ps := make([]peer.ID, 0, len(mkb.pks)+len(mkb.sks)) for p := range mkb.pks { diff --git a/p2p/host/peerstore/peerstore.go b/p2p/host/peerstore/peerstore.go index c29efdb15e..047926d2c6 100644 --- a/p2p/host/peerstore/peerstore.go +++ b/p2p/host/peerstore/peerstore.go @@ -32,10 +32,10 @@ func NewPeerstoreWith(kb KeyBook, ab AddrBook, md PeerMetadata) Peerstore { func (ps *peerstore) Peers() []peer.ID { set := map[peer.ID]struct{}{} - for _, p := range ps.KeyBookPeers() { + for _, p := range ps.PeersWithKeys() { set[p] = struct{}{} } - for _, p := range ps.AddrsPeers() { + for _, p := range ps.PeersWithAddrs() { set[p] = struct{}{} } diff --git a/p2p/host/peerstore/pstoreds/addr_book.go b/p2p/host/peerstore/pstoreds/addr_book.go index 37425904ac..8aebdd888d 100644 --- a/p2p/host/peerstore/pstoreds/addr_book.go +++ b/p2p/host/peerstore/pstoreds/addr_book.go @@ -193,7 +193,7 @@ func (mgr *dsAddrBook) Addrs(p peer.ID) []ma.Multiaddr { } // Peers returns all of the peer IDs for which the AddrBook has addresses. -func (mgr *dsAddrBook) AddrsPeers() []peer.ID { +func (mgr *dsAddrBook) PeersWithAddrs() []peer.ID { q := query.Query{KeysOnly: true} results, err := mgr.ds.Query(q) if err != nil { From b292631515ea85bc02ddb2e1849662f75c63c1e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 4 Sep 2018 11:42:42 +0100 Subject: [PATCH 13/18] readd import alias for manet. --- p2p/host/peerstore/addr/sorting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/p2p/host/peerstore/addr/sorting.go b/p2p/host/peerstore/addr/sorting.go index 5ca91d787f..b42b0410e3 100644 --- a/p2p/host/peerstore/addr/sorting.go +++ b/p2p/host/peerstore/addr/sorting.go @@ -4,7 +4,7 @@ import ( "bytes" ma "github.com/multiformats/go-multiaddr" - "github.com/multiformats/go-multiaddr-net" + manet "github.com/multiformats/go-multiaddr-net" "github.com/whyrusleeping/mafmt" ) From d20a98cac8b9fd295f68a12496824c8535cbd203 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Tue, 4 Sep 2018 18:07:44 +0100 Subject: [PATCH 14/18] rename package mem => pstoremem. --- p2p/host/peerstore/pstoreds/addr_book.go | 6 +++--- p2p/host/peerstore/pstoreds/peerstore.go | 4 ++-- p2p/host/peerstore/{mem => pstoremem}/addr_book.go | 2 +- p2p/host/peerstore/{mem => pstoremem}/inmem_test.go | 2 +- p2p/host/peerstore/{mem => pstoremem}/keybook.go | 2 +- p2p/host/peerstore/{mem => pstoremem}/metadata.go | 2 +- p2p/host/peerstore/{mem => pstoremem}/peerstore.go | 2 +- 7 files changed, 10 insertions(+), 10 deletions(-) rename p2p/host/peerstore/{mem => pstoremem}/addr_book.go (99%) rename p2p/host/peerstore/{mem => pstoremem}/inmem_test.go (96%) rename p2p/host/peerstore/{mem => pstoremem}/keybook.go (98%) rename p2p/host/peerstore/{mem => pstoremem}/metadata.go (98%) rename p2p/host/peerstore/{mem => pstoremem}/peerstore.go (93%) diff --git a/p2p/host/peerstore/pstoreds/addr_book.go b/p2p/host/peerstore/pstoreds/addr_book.go index 8aebdd888d..2db922a2ea 100644 --- a/p2p/host/peerstore/pstoreds/addr_book.go +++ b/p2p/host/peerstore/pstoreds/addr_book.go @@ -14,7 +14,7 @@ import ( mh "github.com/multiformats/go-multihash" pstore "github.com/libp2p/go-libp2p-peerstore" - "github.com/libp2p/go-libp2p-peerstore/mem" + "github.com/libp2p/go-libp2p-peerstore/pstoremem" ) var log = logging.Logger("peerstore/ds") @@ -30,7 +30,7 @@ type dsAddrBook struct { cache *lru.ARCCache ds ds.Batching ttlManager *ttlmanager - subsManager *mem.AddrSubManager + subsManager *pstoremem.AddrSubManager } // NewAddrBook initializes a new address manager given a @@ -46,7 +46,7 @@ func NewAddrBook(ctx context.Context, ds ds.Batching, ttlInterval time.Duration) cache: cache, ds: ds, ttlManager: newTTLManager(ctx, ds, cache, ttlInterval), - subsManager: mem.NewAddrSubManager(), + subsManager: pstoremem.NewAddrSubManager(), } return mgr, nil } diff --git a/p2p/host/peerstore/pstoreds/peerstore.go b/p2p/host/peerstore/pstoreds/peerstore.go index 0ce3926a15..9423df6377 100644 --- a/p2p/host/peerstore/pstoreds/peerstore.go +++ b/p2p/host/peerstore/pstoreds/peerstore.go @@ -7,7 +7,7 @@ import ( "github.com/ipfs/go-datastore" pstore "github.com/libp2p/go-libp2p-peerstore" - "github.com/libp2p/go-libp2p-peerstore/mem" + "github.com/libp2p/go-libp2p-peerstore/pstoremem" ) // NewPeerstore creates a peerstore backed by the provided persistent datastore. @@ -17,6 +17,6 @@ func NewPeerstore(ctx context.Context, ds datastore.Batching) (pstore.Peerstore, return nil, err } - ps := pstore.NewPeerstoreWith(mem.NewKeyBook(), addrBook, mem.NewPeerMetadata()) + ps := pstore.NewPeerstoreWith(pstoremem.NewKeyBook(), addrBook, pstoremem.NewPeerMetadata()) return ps, nil } diff --git a/p2p/host/peerstore/mem/addr_book.go b/p2p/host/peerstore/pstoremem/addr_book.go similarity index 99% rename from p2p/host/peerstore/mem/addr_book.go rename to p2p/host/peerstore/pstoremem/addr_book.go index d0cf980195..3bd1c6bf7b 100644 --- a/p2p/host/peerstore/mem/addr_book.go +++ b/p2p/host/peerstore/pstoremem/addr_book.go @@ -1,4 +1,4 @@ -package mem +package pstoremem import ( "context" diff --git a/p2p/host/peerstore/mem/inmem_test.go b/p2p/host/peerstore/pstoremem/inmem_test.go similarity index 96% rename from p2p/host/peerstore/mem/inmem_test.go rename to p2p/host/peerstore/pstoremem/inmem_test.go index 6f9b4a8d58..5e56462e11 100644 --- a/p2p/host/peerstore/mem/inmem_test.go +++ b/p2p/host/peerstore/pstoremem/inmem_test.go @@ -1,4 +1,4 @@ -package mem +package pstoremem import ( "testing" diff --git a/p2p/host/peerstore/mem/keybook.go b/p2p/host/peerstore/pstoremem/keybook.go similarity index 98% rename from p2p/host/peerstore/mem/keybook.go rename to p2p/host/peerstore/pstoremem/keybook.go index 053ffe401a..13d5009e54 100644 --- a/p2p/host/peerstore/mem/keybook.go +++ b/p2p/host/peerstore/pstoremem/keybook.go @@ -1,4 +1,4 @@ -package mem +package pstoremem import ( "errors" diff --git a/p2p/host/peerstore/mem/metadata.go b/p2p/host/peerstore/pstoremem/metadata.go similarity index 98% rename from p2p/host/peerstore/mem/metadata.go rename to p2p/host/peerstore/pstoremem/metadata.go index f7c0da7179..b4ba6056ed 100644 --- a/p2p/host/peerstore/mem/metadata.go +++ b/p2p/host/peerstore/pstoremem/metadata.go @@ -1,4 +1,4 @@ -package mem +package pstoremem import ( "sync" diff --git a/p2p/host/peerstore/mem/peerstore.go b/p2p/host/peerstore/pstoremem/peerstore.go similarity index 93% rename from p2p/host/peerstore/mem/peerstore.go rename to p2p/host/peerstore/pstoremem/peerstore.go index ba4c5a3b79..f8fde4ff00 100644 --- a/p2p/host/peerstore/mem/peerstore.go +++ b/p2p/host/peerstore/pstoremem/peerstore.go @@ -1,4 +1,4 @@ -package mem +package pstoremem import pstore "github.com/libp2p/go-libp2p-peerstore" From 7f38aaf25424d87e8d8c6fd081b6c3a513465b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 5 Sep 2018 15:08:33 +0100 Subject: [PATCH 15/18] rename AddrMgr => AddrBook elsewhere. --- p2p/host/peerstore/pstoreds/ds_test.go | 2 +- p2p/host/peerstore/pstoremem/inmem_test.go | 4 ++-- .../test/{addr_manager_suite.go => addr_book_suite.go} | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename p2p/host/peerstore/test/{addr_manager_suite.go => addr_book_suite.go} (98%) diff --git a/p2p/host/peerstore/pstoreds/ds_test.go b/p2p/host/peerstore/pstoreds/ds_test.go index 29d6513cee..4ed24d0e9d 100644 --- a/p2p/host/peerstore/pstoreds/ds_test.go +++ b/p2p/host/peerstore/pstoreds/ds_test.go @@ -48,7 +48,7 @@ func TestBadgerDsPeerstore(t *testing.T) { } func TestBadgerDsAddrBook(t *testing.T) { - test.TestAddrMgr(t, func() (peerstore.AddrBook, func()) { + test.TestAddrBook(t, func() (peerstore.AddrBook, func()) { ds, closeDB := setupBadgerDatastore(t) mgr, err := NewAddrBook(context.Background(), ds, 100*time.Microsecond) diff --git a/p2p/host/peerstore/pstoremem/inmem_test.go b/p2p/host/peerstore/pstoremem/inmem_test.go index 5e56462e11..8f5782d41e 100644 --- a/p2p/host/peerstore/pstoremem/inmem_test.go +++ b/p2p/host/peerstore/pstoremem/inmem_test.go @@ -13,8 +13,8 @@ func TestInMemoryPeerstore(t *testing.T) { }) } -func TestInMemoryAddrMgr(t *testing.T) { - test.TestAddrMgr(t, func() (pstore.AddrBook, func()) { +func TestInMemoryAddrBook(t *testing.T) { + test.TestAddrBook(t, func() (pstore.AddrBook, func()) { return NewAddrBook(), nil }) } diff --git a/p2p/host/peerstore/test/addr_manager_suite.go b/p2p/host/peerstore/test/addr_book_suite.go similarity index 98% rename from p2p/host/peerstore/test/addr_manager_suite.go rename to p2p/host/peerstore/test/addr_book_suite.go index acc0165744..f9e52aa7cb 100644 --- a/p2p/host/peerstore/test/addr_manager_suite.go +++ b/p2p/host/peerstore/test/addr_book_suite.go @@ -19,9 +19,9 @@ var addressBookSuite = map[string]func(book pstore.AddrBook) func(*testing.T){ "AddressesExpire": testAddressesExpire, } -type AddrMgrFactory func() (pstore.AddrBook, func()) +type AddrBookFactory func() (pstore.AddrBook, func()) -func TestAddrMgr(t *testing.T, factory AddrMgrFactory) { +func TestAddrBook(t *testing.T, factory AddrBookFactory) { for name, test := range addressBookSuite { // Create a new peerstore. ab, closeFunc := factory() From 6959b235bf581fdd5e607e7c6b4af08c314c66bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 5 Sep 2018 15:14:40 +0100 Subject: [PATCH 16/18] rename NewPeerstoreWith(...) => NewPeerstore(...); adjust godoc. --- p2p/host/peerstore/peerstore.go | 7 ++++--- p2p/host/peerstore/pstoreds/addr_book.go | 4 ++-- p2p/host/peerstore/pstoreds/peerstore.go | 2 +- p2p/host/peerstore/pstoremem/peerstore.go | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/p2p/host/peerstore/peerstore.go b/p2p/host/peerstore/peerstore.go index 047926d2c6..c09743bfb9 100644 --- a/p2p/host/peerstore/peerstore.go +++ b/p2p/host/peerstore/peerstore.go @@ -20,12 +20,13 @@ type peerstore struct { protolock sync.Mutex } -// NewPeerstore creates a threadsafe collection of peers. -func NewPeerstoreWith(kb KeyBook, ab AddrBook, md PeerMetadata) Peerstore { +// NewPeerstore creates a data structure that stores peer data, backed by the +// supplied implementations of KeyBook, AddrBook and PeerMetadata. +func NewPeerstore(kb KeyBook, ab AddrBook, md PeerMetadata) Peerstore { return &peerstore{ KeyBook: kb, - PeerMetadata: md, AddrBook: ab, + PeerMetadata: md, Metrics: NewMetrics(), } } diff --git a/p2p/host/peerstore/pstoreds/addr_book.go b/p2p/host/peerstore/pstoreds/addr_book.go index 2db922a2ea..90f147f5bd 100644 --- a/p2p/host/peerstore/pstoreds/addr_book.go +++ b/p2p/host/peerstore/pstoreds/addr_book.go @@ -24,7 +24,7 @@ var dsWriteRetries = 5 var _ pstore.AddrBook = (*dsAddrBook)(nil) -// dsAddrBook is an address manager backed by a Datastore with both an +// dsAddrBook is an address book backed by a Datastore with both an // in-memory TTL manager and an in-memory address stream manager. type dsAddrBook struct { cache *lru.ARCCache @@ -33,7 +33,7 @@ type dsAddrBook struct { subsManager *pstoremem.AddrSubManager } -// NewAddrBook initializes a new address manager given a +// NewAddrBook initializes a new address book given a // Datastore instance, a context for managing the TTL manager, // and the interval at which the TTL manager should sweep the Datastore. func NewAddrBook(ctx context.Context, ds ds.Batching, ttlInterval time.Duration) (*dsAddrBook, error) { diff --git a/p2p/host/peerstore/pstoreds/peerstore.go b/p2p/host/peerstore/pstoreds/peerstore.go index 9423df6377..e973988bd5 100644 --- a/p2p/host/peerstore/pstoreds/peerstore.go +++ b/p2p/host/peerstore/pstoreds/peerstore.go @@ -17,6 +17,6 @@ func NewPeerstore(ctx context.Context, ds datastore.Batching) (pstore.Peerstore, return nil, err } - ps := pstore.NewPeerstoreWith(pstoremem.NewKeyBook(), addrBook, pstoremem.NewPeerMetadata()) + ps := pstore.NewPeerstore(pstoremem.NewKeyBook(), addrBook, pstoremem.NewPeerMetadata()) return ps, nil } diff --git a/p2p/host/peerstore/pstoremem/peerstore.go b/p2p/host/peerstore/pstoremem/peerstore.go index f8fde4ff00..7d87313de1 100644 --- a/p2p/host/peerstore/pstoremem/peerstore.go +++ b/p2p/host/peerstore/pstoremem/peerstore.go @@ -4,7 +4,7 @@ import pstore "github.com/libp2p/go-libp2p-peerstore" // NewPeerstore creates an in-memory threadsafe collection of peers. func NewPeerstore() pstore.Peerstore { - return pstore.NewPeerstoreWith( + return pstore.NewPeerstore( NewKeyBook(), NewAddrBook(), NewPeerMetadata()) From 2818d6589b785695576936003afefdcbc91c6fef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 6 Sep 2018 20:18:25 +0100 Subject: [PATCH 17/18] increase wait times in tests. --- p2p/host/peerstore/test/addr_book_suite.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/p2p/host/peerstore/test/addr_book_suite.go b/p2p/host/peerstore/test/addr_book_suite.go index f9e52aa7cb..91326d4a59 100644 --- a/p2p/host/peerstore/test/addr_book_suite.go +++ b/p2p/host/peerstore/test/addr_book_suite.go @@ -213,27 +213,27 @@ func testAddressesExpire(m pstore.AddrBook) func(t *testing.T) { testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) m.SetAddr(id1, ma11, time.Millisecond) - <-time.After(time.Millisecond * 2) + <-time.After(time.Millisecond * 5) testHas(t, []ma.Multiaddr{ma12, ma13}, m.Addrs(id1)) testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) m.SetAddr(id1, ma13, time.Millisecond) - <-time.After(time.Millisecond * 2) + <-time.After(time.Millisecond * 5) testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) testHas(t, []ma.Multiaddr{ma24, ma25}, m.Addrs(id2)) m.SetAddr(id2, ma24, time.Millisecond) - <-time.After(time.Millisecond * 2) + <-time.After(time.Millisecond * 5) testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) testHas(t, []ma.Multiaddr{ma25}, m.Addrs(id2)) m.SetAddr(id2, ma25, time.Millisecond) - <-time.After(time.Millisecond * 2) + <-time.After(time.Millisecond * 5) testHas(t, []ma.Multiaddr{ma12}, m.Addrs(id1)) testHas(t, nil, m.Addrs(id2)) m.SetAddr(id1, ma12, time.Millisecond) - <-time.After(time.Millisecond * 2) + <-time.After(time.Millisecond * 5) testHas(t, nil, m.Addrs(id1)) testHas(t, nil, m.Addrs(id2)) } From 65adc76e657859f2b19c53a86bb9f68b4efdbdcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Fri, 7 Sep 2018 12:43:27 +0100 Subject: [PATCH 18/18] add mafmt import alias. --- p2p/host/peerstore/addr/sorting.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/p2p/host/peerstore/addr/sorting.go b/p2p/host/peerstore/addr/sorting.go index b42b0410e3..f8a89150a2 100644 --- a/p2p/host/peerstore/addr/sorting.go +++ b/p2p/host/peerstore/addr/sorting.go @@ -5,7 +5,7 @@ import ( ma "github.com/multiformats/go-multiaddr" manet "github.com/multiformats/go-multiaddr-net" - "github.com/whyrusleeping/mafmt" + mafmt "github.com/whyrusleeping/mafmt" ) func isFDCostlyTransport(a ma.Multiaddr) bool {