From 91cdb88828f2c6d764471ae709a5b12a1eb12d08 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Tue, 28 May 2019 14:41:28 -0400 Subject: [PATCH 1/5] Switched from gx to go mod and started using go-libp2p-core interfaces --- client.go | 26 ++--- client_test.go | 6 +- db/dbi.go | 2 +- db/sqlite/db.go | 2 +- db/sqlite/db_test.go | 2 +- go.mod | 11 +++ go.sum | 228 +++++++++++++++++++++++++++++++++++++++++++ package.json | 75 -------------- proto.go | 15 ++- svc.go | 7 +- svc_test.go | 28 +++--- 11 files changed, 283 insertions(+), 119 deletions(-) create mode 100644 go.mod create mode 100644 go.sum delete mode 100644 package.json diff --git a/client.go b/client.go index 4ed8b87..09ec733 100644 --- a/client.go +++ b/client.go @@ -9,10 +9,10 @@ import ( pb "github.com/libp2p/go-libp2p-rendezvous/pb" ggio "github.com/gogo/protobuf/io" - host "github.com/libp2p/go-libp2p-host" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + + "github.com/libp2p/go-libp2p-core/host" + inet "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" ) var ( @@ -27,7 +27,7 @@ type RendezvousPoint interface { } type Registration struct { - Peer pstore.PeerInfo + Peer peer.AddrInfo Ns string Ttl int } @@ -35,8 +35,8 @@ type Registration struct { type RendezvousClient interface { Register(ctx context.Context, ns string, ttl int) error Unregister(ctx context.Context, ns string) error - Discover(ctx context.Context, ns string, limit int, cookie []byte) ([]pstore.PeerInfo, []byte, error) - DiscoverAsync(ctx context.Context, ns string) (<-chan pstore.PeerInfo, error) + Discover(ctx context.Context, ns string, limit int, cookie []byte) ([]peer.AddrInfo, []byte, error) + DiscoverAsync(ctx context.Context, ns string) (<-chan peer.AddrInfo, error) } func NewRendezvousPoint(host host.Host, p peer.ID) RendezvousPoint { @@ -73,7 +73,7 @@ func (rp *rendezvousPoint) Register(ctx context.Context, ns string, ttl int) err r := ggio.NewDelimitedReader(s, inet.MessageSizeMax) w := ggio.NewDelimitedWriter(s) - req := newRegisterMessage(ns, pstore.PeerInfo{ID: rp.host.ID(), Addrs: rp.host.Addrs()}, ttl) + req := newRegisterMessage(ns, peer.AddrInfo{ID: rp.host.ID(), Addrs: rp.host.Addrs()}, ttl) err = w.WriteMsg(req) if err != nil { return err @@ -264,13 +264,13 @@ func discoverAsync(ctx context.Context, ns string, s inet.Stream, ch chan Regist } } -func (rc *rendezvousClient) Discover(ctx context.Context, ns string, limit int, cookie []byte) ([]pstore.PeerInfo, []byte, error) { +func (rc *rendezvousClient) Discover(ctx context.Context, ns string, limit int, cookie []byte) ([]peer.AddrInfo, []byte, error) { regs, cookie, err := rc.rp.Discover(ctx, ns, limit, cookie) if err != nil { return nil, nil, err } - pinfos := make([]pstore.PeerInfo, len(regs)) + pinfos := make([]peer.AddrInfo, len(regs)) for i, reg := range regs { pinfos[i] = reg.Peer } @@ -278,18 +278,18 @@ func (rc *rendezvousClient) Discover(ctx context.Context, ns string, limit int, return pinfos, cookie, nil } -func (rc *rendezvousClient) DiscoverAsync(ctx context.Context, ns string) (<-chan pstore.PeerInfo, error) { +func (rc *rendezvousClient) DiscoverAsync(ctx context.Context, ns string) (<-chan peer.AddrInfo, error) { rch, err := rc.rp.DiscoverAsync(ctx, ns) if err != nil { return nil, err } - ch := make(chan pstore.PeerInfo) + ch := make(chan peer.AddrInfo) go discoverPeersAsync(ctx, rch, ch) return ch, nil } -func discoverPeersAsync(ctx context.Context, rch <-chan Registration, ch chan pstore.PeerInfo) { +func discoverPeersAsync(ctx context.Context, rch <-chan Registration, ch chan peer.AddrInfo) { defer close(ch) for { select { diff --git a/client_test.go b/client_test.go index 0c33200..6470932 100644 --- a/client_test.go +++ b/client_test.go @@ -5,8 +5,8 @@ import ( "testing" "time" - host "github.com/libp2p/go-libp2p-host" - pstore "github.com/libp2p/go-libp2p-peerstore" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" ) func getRendezvousClients(t *testing.T, hosts []host.Host) []RendezvousClient { @@ -110,7 +110,7 @@ func TestClientRegistrationAndDiscoveryAsync(t *testing.T) { DiscoverAsyncInterval = 2 * time.Minute } -func checkPeerInfo(t *testing.T, pi pstore.PeerInfo, host host.Host) { +func checkPeerInfo(t *testing.T, pi peer.AddrInfo, host host.Host) { if pi.ID != host.ID() { t.Fatal("bad registration: peer ID doesn't match host ID") } diff --git a/db/dbi.go b/db/dbi.go index 3568877..4da1810 100644 --- a/db/dbi.go +++ b/db/dbi.go @@ -1,7 +1,7 @@ package dbi import ( - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ) type RegistrationRecord struct { diff --git a/db/sqlite/db.go b/db/sqlite/db.go index 1399df2..3b05791 100644 --- a/db/sqlite/db.go +++ b/db/sqlite/db.go @@ -16,7 +16,7 @@ import ( _ "github.com/mattn/go-sqlite3" logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ) var log = logging.Logger("rendezvous/db") diff --git a/db/sqlite/db_test.go b/db/sqlite/db_test.go index 9a7b277..c498d83 100644 --- a/db/sqlite/db_test.go +++ b/db/sqlite/db_test.go @@ -7,7 +7,7 @@ import ( "testing" "time" - peer "github.com/libp2p/go-libp2p-peer" + "github.com/libp2p/go-libp2p-core/peer" ma "github.com/multiformats/go-multiaddr" ) diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e0aaab4 --- /dev/null +++ b/go.mod @@ -0,0 +1,11 @@ +module github.com/libp2p/go-libp2p-rendezvous + +require ( + github.com/gogo/protobuf v1.2.1 + github.com/ipfs/go-log v0.0.1 + github.com/libp2p/go-libp2p-blankhost v0.1.1 + github.com/libp2p/go-libp2p-core v0.0.1 + github.com/libp2p/go-libp2p-swarm v0.1.0 + github.com/mattn/go-sqlite3 v1.10.0 + github.com/multiformats/go-multiaddr v0.0.4 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..6bd3d2b --- /dev/null +++ b/go.sum @@ -0,0 +1,228 @@ +github.com/AndreasBriese/bbloom v0.0.0-20180913140656-343706a395b7/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= +github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= +github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32 h1:qkOC5Gd33k54tobS36cXdAzJbeHaduLtnLQQwNoIi78= +github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190207003914-4c204d697803/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgraph-io/badger v1.5.5-0.20190226225317-8115aed38f8f/go.mod h1:VZxzAIRPHRVNRKRo6AXrX9BJegn6il06VMTZVJYCIjQ= +github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.0 h1:kbxbvI4Un1LUWKxufD+BiE6AEExYYgkQLQmLFqA1LFk= +github.com/golang/protobuf v1.3.0/go.mod h1:Qd/q+1AKNOZr9uGQzbzCmRO6sUih6GTPZv6a1/R87v0= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gxed/hashland/keccakpg v0.0.1 h1:wrk3uMNaMxbXiHibbPO4S0ymqJMm41WiudyFSs7UnsU= +github.com/gxed/hashland/keccakpg v0.0.1/go.mod h1:kRzw3HkwxFU1mpmPP8v1WyQzwdGfmKFJ6tItnhQ67kU= +github.com/gxed/hashland/murmur3 v0.0.1 h1:SheiaIt0sda5K+8FLz952/1iWS9zrnKsEJaOJu4ZbSc= +github.com/gxed/hashland/murmur3 v0.0.1/go.mod h1:KjXop02n4/ckmZSnY2+HKcLud/tcmvhST0bie/0lS48= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= +github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= +github.com/ipfs/go-ds-badger v0.0.2/go.mod h1:Y3QpeSFWQf6MopLTiZD+VT6IC1yZqaGmjvRcKeSGij8= +github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= +github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= +github.com/ipfs/go-log v0.0.1 h1:9XTUN/rW64BCG1YhPK9Hoy3q8nr4gOmHHBpgFdfw6Lc= +github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= +github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= +github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2 h1:vhC1OXXiT9R2pczegwz6moDvuRpggaroAXhPIseh57A= +github.com/jbenet/go-temp-err-catcher v0.0.0-20150120210811-aac704a3f4f2/go.mod h1:8GXXJV31xl8whumTzdZsTt3RnUIiPqzkyf7mxToRCMs= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8 h1:bspPhN+oKYFk5fcGNuQzp6IGzYQSenLEgH3s6jkXrWw= +github.com/jbenet/goprocess v0.0.0-20160826012719-b497e2f366b8/go.mod h1:Ly/wlsjFq/qrU3Rar62tu1gASgGw6chQbSh/XgIIXCY= +github.com/jbenet/goprocess v0.1.3 h1:YKyIEECS/XvcfHtBzxtjBBbWK+MbvA6dG8ASiqwvr10= +github.com/jbenet/goprocess v0.1.3/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/libp2p/go-addr-util v0.0.1 h1:TpTQm9cXVRVSKsYbgQ7GKc3KbbHVTnbostgGaDEP+88= +github.com/libp2p/go-addr-util v0.0.1/go.mod h1:4ac6O7n9rIAKB1dnd+s8IbbMXkt+oBpzX4/+RACcnlQ= +github.com/libp2p/go-buffer-pool v0.0.1 h1:9Rrn/H46cXjaA2HQ5Y8lyhOS1NhTkZ4yuEs2r3Eechg= +github.com/libp2p/go-buffer-pool v0.0.1/go.mod h1:xtyIz9PMobb13WaxR6Zo1Pd1zXJKYg0a8KiIvDp3TzQ= +github.com/libp2p/go-buffer-pool v0.0.2 h1:QNK2iAFa8gjAe1SPz6mHSMuCcjs+X1wlHzeOSqcmlfs= +github.com/libp2p/go-buffer-pool v0.0.2/go.mod h1:MvaB6xw5vOrDl8rYZGLFdKAuk/hRoRZd1Vi32+RXyFM= +github.com/libp2p/go-conn-security-multistream v0.1.0 h1:aqGmto+ttL/uJgX0JtQI0tD21CIEy5eYd1Hlp0juHY0= +github.com/libp2p/go-conn-security-multistream v0.1.0/go.mod h1:aw6eD7LOsHEX7+2hJkDxw1MteijaVcI+/eP2/x3J1xc= +github.com/libp2p/go-flow-metrics v0.0.1 h1:0gxuFd2GuK7IIP5pKljLwps6TvcuYgvG7Atqi3INF5s= +github.com/libp2p/go-flow-metrics v0.0.1/go.mod h1:Iv1GH0sG8DtYN3SVJ2eG221wMiNpZxBdp967ls1g+k8= +github.com/libp2p/go-libp2p-blankhost v0.1.1 h1:X919sCh+KLqJcNRApj43xCSiQRYqOSI88Fdf55ngf78= +github.com/libp2p/go-libp2p-blankhost v0.1.1/go.mod h1:pf2fvdLJPsC1FsVrNP3DUUvMzUts2dsLLBEpo1vW1ro= +github.com/libp2p/go-libp2p-core v0.0.1 h1:HSTZtFIq/W5Ue43Zw+uWZyy2Vl5WtF0zDjKN8/DT/1I= +github.com/libp2p/go-libp2p-core v0.0.1/go.mod h1:g/VxnTZ/1ygHxH3dKok7Vno1VfpvGcGip57wjTU4fco= +github.com/libp2p/go-libp2p-crypto v0.1.0 h1:k9MFy+o2zGDNGsaoZl0MA3iZ75qXxr9OOoAZF+sD5OQ= +github.com/libp2p/go-libp2p-crypto v0.1.0/go.mod h1:sPUokVISZiy+nNuTTH/TY+leRSxnFj/2GLjtOTW90hI= +github.com/libp2p/go-libp2p-loggables v0.1.0 h1:h3w8QFfCt2UJl/0/NW4K829HX/0S4KD31PQ7m8UXXO8= +github.com/libp2p/go-libp2p-loggables v0.1.0/go.mod h1:EyumB2Y6PrYjr55Q3/tiJ/o3xoDasoRYM7nOzEpoa90= +github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3g+OtR+EMMODbKo= +github.com/libp2p/go-libp2p-mplex v0.2.1 h1:E1xaJBQnbSiTHGI1gaBKmKhu1TUKkErKJnE8iGvirYI= +github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= +github.com/libp2p/go-libp2p-peer v0.2.0 h1:EQ8kMjaCUwt/Y5uLgjT8iY2qg0mGUT0N1zUjer50DsY= +github.com/libp2p/go-libp2p-peer v0.2.0/go.mod h1:RCffaCvUyW2CJmG2gAWVqwePwW7JMgxjsHm7+J5kjWY= +github.com/libp2p/go-libp2p-peerstore v0.1.0 h1:MKh7pRNPHSh1fLPj8u/M/s/napdmeNpoi9BRy9lPN0E= +github.com/libp2p/go-libp2p-peerstore v0.1.0/go.mod h1:2CeHkQsr8svp4fZ+Oi9ykN1HBb6u0MOvdJ7YIsmcwtY= +github.com/libp2p/go-libp2p-secio v0.1.0 h1:NNP5KLxuP97sE5Bu3iuwOWyT/dKEGMN5zSLMWdB7GTQ= +github.com/libp2p/go-libp2p-secio v0.1.0/go.mod h1:tMJo2w7h3+wN4pgU2LSYeiKPrfqBgkOsdiKK77hE7c8= +github.com/libp2p/go-libp2p-swarm v0.1.0 h1:HrFk2p0awrGEgch9JXK/qp/hfjqQfgNxpLWnCiWPg5s= +github.com/libp2p/go-libp2p-swarm v0.1.0/go.mod h1:wQVsCdjsuZoc730CgOvh5ox6K8evllckjebkdiY5ta4= +github.com/libp2p/go-libp2p-testing v0.0.2/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-testing v0.0.3 h1:bdij4bKaaND7tCsaXVjRfYkMpvoOeKj9AVQGJllA6jM= +github.com/libp2p/go-libp2p-testing v0.0.3/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1 h1:PZMS9lhjK9VytzMCW3tWHAXtKXmlURSc3ZdvwEcKCzw= +github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= +github.com/libp2p/go-libp2p-yamux v0.2.0 h1:TSPZ5cMMz/wdoYsye/wU1TE4G3LDGMoeEN0xgnCKU/I= +github.com/libp2p/go-libp2p-yamux v0.2.0/go.mod h1:Db2gU+XfLpm6E4rG5uGCFX6uXA8MEXOxFcRoXUODaK8= +github.com/libp2p/go-maddr-filter v0.0.4 h1:hx8HIuuwk34KePddrp2mM5ivgPkZ09JH4AvsALRbFUs= +github.com/libp2p/go-maddr-filter v0.0.4/go.mod h1:6eT12kSQMA9x2pvFQa+xesMKUBlj9VImZbj3B9FBH/Q= +github.com/libp2p/go-mplex v0.0.3/go.mod h1:pK5yMLmOoBR1pNCqDlA2GQrdAVTMkqFalaTWe7l4Yd0= +github.com/libp2p/go-mplex v0.1.0 h1:/nBTy5+1yRyY82YaO6HXQRnO5IAGsXTjEJaR3LdTPc0= +github.com/libp2p/go-mplex v0.1.0/go.mod h1:SXgmdki2kwCUlCCbfGLEgHjC4pFqhTp0ZoV6aiKgxDU= +github.com/libp2p/go-msgio v0.0.2 h1:ivPvEKHxmVkTClHzg6RXTYHqaJQ0V9cDbq+6lKb3UV0= +github.com/libp2p/go-msgio v0.0.2/go.mod h1:63lBBgOTDKQL6EWazRMCwXsEeEeK9O2Cd+0+6OOuipQ= +github.com/libp2p/go-reuseport v0.0.1 h1:7PhkfH73VXfPJYKQ6JwS5I/eVcoyYi9IMNGc6FWpFLw= +github.com/libp2p/go-reuseport v0.0.1/go.mod h1:jn6RmB1ufnQwl0Q1f+YxAj8isJgDCQzaaxIFYDhcYEA= +github.com/libp2p/go-reuseport-transport v0.0.2 h1:WglMwyXyBu61CMkjCCtnmqNqnjib0GIEjMiHTwR/KN4= +github.com/libp2p/go-reuseport-transport v0.0.2/go.mod h1:YkbSDrvjUVDL6b8XqriyA20obEtsW9BLkuOUyQAOCbs= +github.com/libp2p/go-stream-muxer v0.0.1 h1:Ce6e2Pyu+b5MC1k3eeFtAax0pW4gc6MosYSLV05UeLw= +github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= +github.com/libp2p/go-stream-muxer-multistream v0.2.0 h1:714bRJ4Zy9mdhyTLJ+ZKiROmAFwUHpeRidG+q7LTQOg= +github.com/libp2p/go-stream-muxer-multistream v0.2.0/go.mod h1:j9eyPol/LLRqT+GPLSxvimPhNph4sfYfMoDPd7HkzIc= +github.com/libp2p/go-tcp-transport v0.1.0 h1:IGhowvEqyMFknOar4FWCKSWE0zL36UFKQtiRQD60/8o= +github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= +github.com/libp2p/go-yamux v1.2.2 h1:s6J6o7+ajoQMjHe7BEnq+EynOj5D2EoG8CuQgL3F2vg= +github.com/libp2p/go-yamux v1.2.2/go.mod h1:FGTiPvoV/3DVdgWpX+tM0OW3tsM+W5bSE3gZwqQTcow= +github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= +github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-sqlite3 v1.10.0 h1:jbhqpg7tQe4SupckyijYiy0mJJ/pRyHvXf7JdWK860o= +github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 h1:lYpkrQH5ajf0OXOcUbGjvZxxijuBwbbmlSxLiuofa+g= +github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16 h1:5W7KhL8HVF3XCFOweFD3BNESdnO8ewyYTFT2R+/b8FQ= +github.com/minio/sha256-simd v0.0.0-20190131020904-2d45a736cd16/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.0.0-20190328051042-05b4dd3047e5/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/minio/sha256-simd v0.1.0 h1:U41/2erhAKcmSI14xh/ZTUdBPOzDOIfS93ibzUSl8KM= +github.com/minio/sha256-simd v0.1.0/go.mod h1:2FMWW+8GMoPweT6+pI63m9YE3Lmw4J71hV56Chs1E/U= +github.com/mr-tron/base58 v1.1.0 h1:Y51FGVJ91WBqCEabAi5OPUz38eAx8DakuAm5svLcsfQ= +github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.1 h1:OJIdWOWYe2l5PQNgimGtuwHY8nDskvJ5vvs//YnzRLs= +github.com/mr-tron/base58 v1.1.1/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= +github.com/mr-tron/base58 v1.1.2 h1:ZEw4I2EgPKDJ2iEw0cNmLB3ROrEmkOtXIkaG7wZg+78= +github.com/mr-tron/base58 v1.1.2/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/multiformats/go-base32 v0.0.3 h1:tw5+NhuwaOjJCC5Pp82QuXbrmLzWg7uxlMFp8Nq/kkI= +github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= +github.com/multiformats/go-multiaddr v0.0.1 h1:/QUV3VBMDI6pi6xfiw7lr6xhDWWvQKn9udPn68kLSdY= +github.com/multiformats/go-multiaddr v0.0.1/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.2/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr v0.0.4 h1:WgMSI84/eRLdbptXMkMWDXPjPq7SPLIgGUVm2eroyU4= +github.com/multiformats/go-multiaddr v0.0.4/go.mod h1:xKVEak1K9cS1VdmPZW3LSIb6lgmoS58qz/pzqmAxV44= +github.com/multiformats/go-multiaddr-dns v0.0.1 h1:jQt9c6tDSdQLIlBo4tXYx7QUHCPjxsB1zXcag/2S7zc= +github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-dns v0.0.2 h1:/Bbsgsy3R6e3jf2qBahzNHzww6usYaZ0NhNH3sqdFS8= +github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= +github.com/multiformats/go-multiaddr-fmt v0.0.1 h1:5YjeOIzbX8OTKVaN72aOzGIYW7PnrZrnkDyOfAWRSMA= +github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= +github.com/multiformats/go-multiaddr-net v0.0.1 h1:76O59E3FavvHqNg7jvzWzsPSW5JSi/ek0E4eiDVbg9g= +github.com/multiformats/go-multiaddr-net v0.0.1/go.mod h1:nw6HSxNmCIQH27XPGBuX+d1tnvM7ihcFwHMSstNAVUU= +github.com/multiformats/go-multibase v0.0.1 h1:PN9/v21eLywrFWdFNsFKaU04kLJzuYzmrJR+ubhT9qA= +github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= +github.com/multiformats/go-multihash v0.0.1 h1:HHwN1K12I+XllBCrqKnhX949Orn4oawPkegHMu2vDqQ= +github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= +github.com/multiformats/go-multihash v0.0.5 h1:1wxmCvTXAifAepIMyF39vZinRw5sbqjPs/UIi93+uik= +github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= +github.com/multiformats/go-multistream v0.1.0 h1:UpO6jrsjqs46mqAK3n6wKRYFhugss9ArzbyUzU+4wkQ= +github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w= +github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.0.2 h1:3jA2P6O1F9UOrWVpwrIo17pu01KWvNWg4X946/Y5Zwg= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a h1:/eS3yfGjQKG+9kayBkj0ip1BGhq6zJ3eaVksphxAaek= +github.com/spacemonkeygo/openssl v0.0.0-20181017203307-c2dcc5cca94a/go.mod h1:7AyxJNCJ7SBZ1MfVQCWD6Uqo2oubI2Eq2y2eqf+A5r0= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572 h1:RC6RW7j+1+HkWaX/Yh71Ee5ZHaHYt7ZP4sQgUrm6cDU= +github.com/spacemonkeygo/spacelog v0.0.0-20180420211403-2296661a0572/go.mod h1:w0SWMsp6j9O/dk4/ZpIhL+3CkG8ofA2vuv7k+ltqUMc= +github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= +github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= +github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc h1:9lDbC6Rz4bwmou+oE6Dt4Cb2BGMur5eR/GYptkKUVHo= +github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= +github.com/whyrusleeping/mafmt v1.2.8 h1:TCghSl5kkwEE0j+sU/gudyhVMRlpBin8fMBBHg59EbA= +github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 h1:E9S12nwJwEOXe2d6gT6qxdvqMnNq+VnSsKPgm2ZZNds= +github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7/go.mod h1:X2c0RVCI1eSUFI8eLcY3c0423ykwiUdxLJtkDvruhjI= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b h1:+/WWzjwW6gidDJnMKWLKLX1gxn7irUTF1fLpQovfQ5M= +golang.org/x/crypto v0.0.0-20190225124518-7f87c0fbb88b/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= +golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190227160552-c95aed5357e7 h1:C2F/nMkR/9sfUTpvR3QrjBuTdvMUC/cFajkphs1YLQo= +golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3 h1:0GoQqolDA55aaLxZyTzK/Y2ePZzZTUrRacwib7cNsYQ= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190219092855-153ac476189d/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e h1:ZytStCyV048ZqDsWHiYDdoI2Vd4msMcrDECFxS+tL9c= +golang.org/x/sys v0.0.0-20190228124157-a34e9553db1e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d h1:+R4KGOnez64A81RvjARKc4UT5/tI9ujCIVX+P5KiHuI= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/package.json b/package.json deleted file mode 100644 index 4fb1061..0000000 --- a/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "author": "vyzo", - "bugs": {}, - "gx": { - "dvcsimport": "github.com/libp2p/go-libp2p-rendezvous" - }, - "gxDependencies": [ - { - "author": "whyrusleeping", - "hash": "QmaoXrM4Z41PD48JY36YqQGKQpLGjyLA2cKcLsES7YddAq", - "name": "go-libp2p-host", - "version": "3.0.21" - }, - { - "author": "whyrusleeping", - "hash": "QmNgLg1NTw37iWbYPKcyK85YJ9Whs1MkPtJwhfqbNYAyKg", - "name": "go-libp2p-net", - "version": "3.0.22" - }, - { - "author": "whyrusleeping", - "hash": "QmY5Grm8pJdiSSVsYxx4uNRgweY72EmYwuSDbRnbFok3iY", - "name": "go-libp2p-peer", - "version": "3.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmPiemjiKBC9VA7vZF82m4x1oygtg2c2YVqag8PX7dN1BD", - "name": "go-libp2p-peerstore", - "version": "2.0.13" - }, - { - "author": "whyrusleeping", - "hash": "QmZNkThpqfVXs9GNbexPrfBbXSLNYeKrE7jwFM2oqHbyqN", - "name": "go-libp2p-protocol", - "version": "1.0.0" - }, - { - "author": "multiformats", - "hash": "QmNTCey11oxhb1AxDnQBRHtdhap6Ctud872NjAYPYYXPuc", - "name": "go-multiaddr", - "version": "1.4.0" - }, - { - "hash": "QmcuXC5cxs79ro2cUuHs4HQ2bkDLJUYokwL8aivcX6HW3C", - "name": "go-log", - "version": "1.5.8" - }, - { - "author": "whyrusleeping", - "hash": "QmdxUuburamoF6zF9qjeQC4WYcWGbWuRmdLacMEsW8ioD8", - "name": "gogo-protobuf", - "version": "0.0.0" - }, - { - "author": "whyrusleeping", - "hash": "QmQLbY1oKd4eHrikizXXwYkxn6yujUNSUMimv3UCaWTSWX", - "name": "go-libp2p-blankhost", - "version": "0.3.21" - }, - { - "author": "whyrusleeping", - "hash": "QmegQFxhr1J6yZ1vDQuDmJi5jntmj6BL96S11HVtXNCaHb", - "name": "go-libp2p-swarm", - "version": "3.0.28" - } - ], - "gxVersion": "0.12.1", - "language": "go", - "license": "MIT", - "name": "go-libp2p-rendezvous", - "releaseCmd": "git commit -a -m \"gx publish $VERSION\"", - "version": "0.0.0" -} - diff --git a/proto.go b/proto.go index 9ae60f2..6e4237f 100644 --- a/proto.go +++ b/proto.go @@ -8,9 +8,8 @@ import ( pb "github.com/libp2p/go-libp2p-rendezvous/pb" logging "github.com/ipfs/go-log" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" - protocol "github.com/libp2p/go-libp2p-protocol" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/protocol" ma "github.com/multiformats/go-multiaddr" ) @@ -31,7 +30,7 @@ func (e RendezvousError) Error() string { return fmt.Sprintf("Rendezvous error: %s (%s)", e.Text, pb.Message_ResponseStatus(e.Status).String()) } -func newRegisterMessage(ns string, pi pstore.PeerInfo, ttl int) *pb.Message { +func newRegisterMessage(ns string, pi peer.AddrInfo, ttl int) *pb.Message { msg := new(pb.Message) msg.Type = pb.Message_REGISTER.Enum() msg.Register = new(pb.Message_Register) @@ -79,14 +78,14 @@ func newDiscoverMessage(ns string, limit int, cookie []byte) *pb.Message { return msg } -func pbToPeerInfo(p *pb.Message_PeerInfo) (pstore.PeerInfo, error) { +func pbToPeerInfo(p *pb.Message_PeerInfo) (peer.AddrInfo, error) { if p == nil { - return pstore.PeerInfo{}, errors.New("missing peer info") + return peer.AddrInfo{}, errors.New("missing peer info") } id, err := peer.IDFromBytes(p.Id) if err != nil { - return pstore.PeerInfo{}, err + return peer.AddrInfo{}, err } addrs := make([]ma.Multiaddr, 0, len(p.Addrs)) for _, bs := range p.Addrs { @@ -98,7 +97,7 @@ func pbToPeerInfo(p *pb.Message_PeerInfo) (pstore.PeerInfo, error) { addrs = append(addrs, addr) } - return pstore.PeerInfo{ID: id, Addrs: addrs}, nil + return peer.AddrInfo{ID: id, Addrs: addrs}, nil } func newRegisterResponse(ttl int) *pb.Message_RegisterResponse { diff --git a/svc.go b/svc.go index 0293765..e7204b1 100644 --- a/svc.go +++ b/svc.go @@ -7,9 +7,10 @@ import ( pb "github.com/libp2p/go-libp2p-rendezvous/pb" ggio "github.com/gogo/protobuf/io" - host "github.com/libp2p/go-libp2p-host" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" + + "github.com/libp2p/go-libp2p-core/host" + inet "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" ) const ( diff --git a/svc_test.go b/svc_test.go index d981fe7..eaea97d 100644 --- a/svc_test.go +++ b/svc_test.go @@ -11,10 +11,10 @@ import ( ggio "github.com/gogo/protobuf/io" bhost "github.com/libp2p/go-libp2p-blankhost" - host "github.com/libp2p/go-libp2p-host" - inet "github.com/libp2p/go-libp2p-net" - peer "github.com/libp2p/go-libp2p-peer" - pstore "github.com/libp2p/go-libp2p-peerstore" + + "github.com/libp2p/go-libp2p-core/host" + inet "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" testutil "github.com/libp2p/go-libp2p-swarm/testing" ) @@ -30,7 +30,7 @@ func getNetHosts(t *testing.T, ctx context.Context, n int) []host.Host { var out []host.Host for i := 0; i < n; i++ { - netw := testutil.GenSwarmNetwork(t, ctx) + netw := testutil.GenSwarm(t, ctx) h := bhost.NewBlankHost(netw) out = append(out, h) } @@ -187,7 +187,7 @@ func TestSVCErrors(t *testing.T) { // testable registration errors res, err := doTestRequest(ctx, hosts[1], hosts[0].ID(), - newRegisterMessage("", pstore.PeerInfo{}, 0)) + newRegisterMessage("", peer.AddrInfo{}, 0)) if err != nil { t.Fatal(err) } @@ -198,7 +198,7 @@ func TestSVCErrors(t *testing.T) { badns := make([]byte, 2*MaxNamespaceLength) rand.Read(badns) res, err = doTestRequest(ctx, hosts[1], hosts[0].ID(), - newRegisterMessage(string(badns), pstore.PeerInfo{}, 0)) + newRegisterMessage(string(badns), peer.AddrInfo{}, 0)) if err != nil { t.Fatal(err) } @@ -207,7 +207,7 @@ func TestSVCErrors(t *testing.T) { } res, err = doTestRequest(ctx, hosts[1], hosts[0].ID(), - newRegisterMessage("foo", pstore.PeerInfo{}, 0)) + newRegisterMessage("foo", peer.AddrInfo{}, 0)) if err != nil { t.Fatal(err) } @@ -216,7 +216,7 @@ func TestSVCErrors(t *testing.T) { } res, err = doTestRequest(ctx, hosts[1], hosts[0].ID(), - newRegisterMessage("foo", pstore.PeerInfo{ID: peer.ID("blah")}, 0)) + newRegisterMessage("foo", peer.AddrInfo{ID: peer.ID("blah")}, 0)) if err != nil { t.Fatal(err) } @@ -230,7 +230,7 @@ func TestSVCErrors(t *testing.T) { } res, err = doTestRequest(ctx, hosts[1], hosts[0].ID(), - newRegisterMessage("foo", pstore.PeerInfo{ID: p}, 0)) + newRegisterMessage("foo", peer.AddrInfo{ID: p}, 0)) if err != nil { t.Fatal(err) } @@ -239,7 +239,7 @@ func TestSVCErrors(t *testing.T) { } res, err = doTestRequest(ctx, hosts[1], hosts[0].ID(), - newRegisterMessage("foo", pstore.PeerInfo{ID: hosts[1].ID()}, 0)) + newRegisterMessage("foo", peer.AddrInfo{ID: hosts[1].ID()}, 0)) if err != nil { t.Fatal(err) } @@ -248,7 +248,7 @@ func TestSVCErrors(t *testing.T) { } res, err = doTestRequest(ctx, hosts[1], hosts[0].ID(), - newRegisterMessage("foo", pstore.PeerInfo{ID: hosts[1].ID(), Addrs: hosts[1].Addrs()}, 2*MaxTTL)) + newRegisterMessage("foo", peer.AddrInfo{ID: hosts[1].ID(), Addrs: hosts[1].Addrs()}, 2*MaxTTL)) if err != nil { t.Fatal(err) } @@ -260,7 +260,7 @@ func TestSVCErrors(t *testing.T) { for i := 0; i < MaxRegistrations+1; i++ { ns := fmt.Sprintf("foo%d", i) res, err = doTestRequest(ctx, hosts[1], hosts[0].ID(), - newRegisterMessage(ns, pstore.PeerInfo{ID: hosts[1].ID(), Addrs: hosts[1].Addrs()}, 0)) + newRegisterMessage(ns, peer.AddrInfo{ID: hosts[1].ID(), Addrs: hosts[1].Addrs()}, 0)) if err != nil { t.Fatal(err) } @@ -270,7 +270,7 @@ func TestSVCErrors(t *testing.T) { } // and now fail res, err = doTestRequest(ctx, hosts[1], hosts[0].ID(), - newRegisterMessage("foo", pstore.PeerInfo{ID: hosts[1].ID(), Addrs: hosts[1].Addrs()}, 0)) + newRegisterMessage("foo", peer.AddrInfo{ID: hosts[1].ID(), Addrs: hosts[1].Addrs()}, 0)) if err != nil { t.Fatal(err) } From 790128061ee519ba87791500e1e2be26e36b42a9 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Fri, 31 May 2019 12:48:51 -0400 Subject: [PATCH 2/5] Add stateful discovery client --- discovery_client.go | 134 ++++++++++++++++++++++++++++++++ discovery_client_test.go | 163 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 297 insertions(+) create mode 100644 discovery_client.go create mode 100644 discovery_client_test.go diff --git a/discovery_client.go b/discovery_client.go new file mode 100644 index 0000000..3a25253 --- /dev/null +++ b/discovery_client.go @@ -0,0 +1,134 @@ +package rendezvous + +import ( + "context" + "github.com/libp2p/go-libp2p-core/discovery" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "math" + "math/rand" + "sync" + "time" +) + +type rendezvousDiscoveryClient struct { + rp RendezvousPoint + peerCache sync.Map //is a map[string]discoveredPeerCache + rng *rand.Rand + rngMux sync.Mutex +} + +type discoveredPeerCache struct { + cachedRegs []Registration + mux sync.Mutex +} + +func NewRendezvousDiscoveryClient(host host.Host, rendezvousPeer peer.ID) discovery.Discovery { + rp := NewRendezvousPoint(host, rendezvousPeer) + return &rendezvousDiscoveryClient{rp, sync.Map{}, rand.New(rand.NewSource(rand.Int63())), sync.Mutex{}} +} + +func (c *rendezvousDiscoveryClient) Advertise(ctx context.Context, ns string, opts ...discovery.Option) (time.Duration, error) { + // Get options + var options discovery.Options + err := options.Apply(opts...) + if err != nil { + return 0, err + } + + ttl := options.Ttl + var ttlSeconds int + + // Default is minimum duration + if ttl == 0 { + ttlSeconds = 120 + } else { + ttlSeconds = int(math.Round(ttl.Seconds())) + } + + if err := c.rp.Register(ctx, ns, ttlSeconds); err != nil { + return 0, err + } + + actualTTL := time.Duration(ttlSeconds) * time.Second + return actualTTL, nil +} + +func (c *rendezvousDiscoveryClient) FindPeers(ctx context.Context, ns string, opts ...discovery.Option) (<-chan peer.AddrInfo, error) { + // Get options + var options discovery.Options + err := options.Apply(opts...) + if err != nil { + return nil, err + } + + const maxLimit = 1000 + limit := options.Limit + if limit == 0 || limit > maxLimit { + limit = maxLimit + } + + // Get cached peers + var cache *discoveredPeerCache + + genericCache, _ := c.peerCache.LoadOrStore(ns, &discoveredPeerCache{}) + cache = genericCache.(*discoveredPeerCache) + + cache.mux.Lock() + cachedRegs := cache.cachedRegs + + // Remove all expired entries from cache + currentTime := int(time.Now().Unix()) + newCacheSize := len(cachedRegs) + + for i := 0; i < newCacheSize; i++ { + reg := cachedRegs[i] + if reg.Ttl < currentTime { + newCacheSize-- + if i != newCacheSize { + cachedRegs[i] = cachedRegs[newCacheSize] + i-- + } + } + } + cache.cachedRegs = cachedRegs[:newCacheSize] + cache.mux.Unlock() + + // Discover new records if we don't have enough + var discoveryErr error + if newCacheSize < limit { + if discoveryRecords, _, err := c.rp.Discover(ctx, ns, limit, nil); err == nil { + for i := range discoveryRecords { + discoveryRecords[i].Ttl += currentTime + } + cache.mux.Lock() + cache.cachedRegs = discoveryRecords + cache.mux.Unlock() + } else { + // TODO: Should we return error even if we have valid cached results? + discoveryErr = err + } + } + + // Randomize and fill channel with available records + cache.mux.Lock() + cachedRegs = cache.cachedRegs + sendQuantity := len(cachedRegs) + if limit < sendQuantity { + sendQuantity = limit + } + + chPeer := make(chan peer.AddrInfo, sendQuantity) + + c.rngMux.Lock() + perm := c.rng.Perm(len(cachedRegs))[0:sendQuantity] + c.rngMux.Unlock() + + for _, i := range perm { + chPeer <- cachedRegs[i].Peer + } + + cache.mux.Unlock() + close(chPeer) + return chPeer, discoveryErr +} diff --git a/discovery_client_test.go b/discovery_client_test.go new file mode 100644 index 0000000..854737e --- /dev/null +++ b/discovery_client_test.go @@ -0,0 +1,163 @@ +package rendezvous + +import ( + "context" + "github.com/libp2p/go-libp2p-core/discovery" + "github.com/libp2p/go-libp2p-core/host" + "github.com/libp2p/go-libp2p-core/peer" + "math/rand" + "sync" + "testing" + "time" +) + +func getRendezvousDiscovery(hosts []host.Host) []discovery.Discovery { + clients := make([]discovery.Discovery, len(hosts)-1) + rendezvousPeer := hosts[0].ID() + for i, h := range hosts[1:] { + rp := NewRendezvousPoint(h, rendezvousPeer) + rng := rand.New(rand.NewSource(int64(i))) + clients[i] = &rendezvousDiscoveryClient{rp: rp, peerCache: sync.Map{}, rng: rng} + } + return clients +} + +func peerChannelToArray(pch <-chan peer.AddrInfo) []peer.AddrInfo { + pi := make([]peer.AddrInfo, len(pch)) + peerIndex := 0 + for p := range pch { + pi[peerIndex] = p + peerIndex++ + } + return pi +} + +func checkAvailablePeers(t *testing.T, ctx context.Context, client discovery.Discovery, namespace string, expectedNumPeers int) { + pch, err := client.FindPeers(ctx, namespace) + if err != nil { + t.Fatal(err) + } + + pi := peerChannelToArray(pch) + + if len(pi) != expectedNumPeers { + t.Fatalf("Expected %d peers", expectedNumPeers) + } +} + +func TestDiscoveryClientAdvertiseAndFindPeers(t *testing.T) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // Define parameters + const namespace = "foo1" + const numClients = 4 + const ttl = DefaultTTL * time.Second + + // Instantiate server and clients + hosts := getRendezvousHosts(t, ctx, numClients+1) + + svc, err := makeRendezvousService(ctx, hosts[0], ":memory:") + if err != nil { + t.Fatal(err) + } + defer svc.DB.Close() + + clients := getRendezvousDiscovery(hosts) + + // Advertise and check one peer + _, err = clients[0].Advertise(ctx, namespace, discovery.TTL(ttl)) + if err != nil { + t.Fatal(err) + } + + checkAvailablePeers(t, ctx, clients[0], namespace, 1) + + // Advertise and check the rest of the peers incrementally + for i, client := range clients[1:] { + if _, err = client.Advertise(ctx, namespace, discovery.TTL(ttl)); err != nil { + t.Fatal(err) + } + + checkAvailablePeers(t, ctx, client, namespace, i+2) + } + + // Check that the first peer can get all the new records + checkAvailablePeers(t, ctx, clients[0], namespace, numClients) +} + +func TestDiscoveryClientExpiredCachedRecords(t *testing.T) { + BaseDiscoveryClientCacheExpirationTest(t, true) +} + +func TestDiscoveryClientExpiredManyCachedRecords(t *testing.T) { + BaseDiscoveryClientCacheExpirationTest(t, false) +} + +func BaseDiscoveryClientCacheExpirationTest(t *testing.T, onlyRequestFromCache bool) { + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // Define parameters + const numShortLivedRegs = 5 + const everyIthRegIsLongTTL = 2 + const numBaseRegs = numShortLivedRegs * everyIthRegIsLongTTL + const namespace = "foo1" + const longTTL = DefaultTTL * time.Second + const shortTTL = 2 * time.Second + + // Instantiate server and clients + hosts := getRendezvousHosts(t, ctx, numBaseRegs+3) + + svc, err := makeRendezvousService(ctx, hosts[0], ":memory:") + if err != nil { + t.Fatal(err) + } + defer svc.DB.Close() + clients := getRendezvousDiscovery(hosts) + + // Advertise most clients + for i, client := range clients[2:] { + ttl := shortTTL + if i%everyIthRegIsLongTTL == 0 { + ttl = longTTL + } + + if _, err = client.Advertise(ctx, namespace, discovery.TTL(ttl)); err != nil { + t.Fatal(err) + } + } + + // Find peers from an unrelated client (results should be cached) + pch, err := clients[0].FindPeers(ctx, namespace) + if err != nil { + t.Fatal(err) + } + pi := peerChannelToArray(pch) + if len(pi) != numBaseRegs { + t.Fatalf("expected %d registrations", numBaseRegs) + } + + // Advertise from a new unrelated peer + if _, err := clients[1].Advertise(ctx, namespace, discovery.TTL(longTTL)); err != nil { + t.Fatal(err) + } + + // Wait for cache expiration + time.Sleep(shortTTL + time.Second) + + // Check if number of retrieved records matches caching expectations after expiration + expectedNumClients := numShortLivedRegs + if !onlyRequestFromCache { + expectedNumClients++ + } + pch, err = clients[0].FindPeers(ctx, namespace, discovery.Limit(expectedNumClients)) + if err != nil { + t.Fatal(err) + } + pi = peerChannelToArray(pch) + + if len(pi) != expectedNumClients { + t.Fatalf("received an incorrect number of records: %d", len(pi)) + } +} From 9052b531ccde1f19af23557adba08bd59c0e76f4 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Fri, 31 May 2019 18:58:46 -0400 Subject: [PATCH 3/5] RendezvousPoint and RendezvousClient now return the server's TTL on Registered records. Default TTL for discovery client increased discovery client now utilizes server cookie for added efficiency --- client.go | 29 ++++++++++---------- discovery_client.go | 64 +++++++++++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 39 deletions(-) diff --git a/client.go b/client.go index 09ec733..e416433 100644 --- a/client.go +++ b/client.go @@ -20,7 +20,7 @@ var ( ) type RendezvousPoint interface { - Register(ctx context.Context, ns string, ttl int) error + Register(ctx context.Context, ns string, ttl int) (time.Duration, error) Unregister(ctx context.Context, ns string) error Discover(ctx context.Context, ns string, limit int, cookie []byte) ([]Registration, []byte, error) DiscoverAsync(ctx context.Context, ns string) (<-chan Registration, error) @@ -33,7 +33,7 @@ type Registration struct { } type RendezvousClient interface { - Register(ctx context.Context, ns string, ttl int) error + Register(ctx context.Context, ns string, ttl int) (time.Duration, error) Unregister(ctx context.Context, ns string) error Discover(ctx context.Context, ns string, limit int, cookie []byte) ([]peer.AddrInfo, []byte, error) DiscoverAsync(ctx context.Context, ns string) (<-chan peer.AddrInfo, error) @@ -63,7 +63,7 @@ type rendezvousClient struct { rp RendezvousPoint } -func (rp *rendezvousPoint) Register(ctx context.Context, ns string, ttl int) error { +func (rp *rendezvousPoint) Register(ctx context.Context, ns string, ttl int) (time.Duration, error) { s, err := rp.host.NewStream(ctx, rp.p, RendezvousProto) if err != nil { return err @@ -76,39 +76,40 @@ func (rp *rendezvousPoint) Register(ctx context.Context, ns string, ttl int) err req := newRegisterMessage(ns, peer.AddrInfo{ID: rp.host.ID(), Addrs: rp.host.Addrs()}, ttl) err = w.WriteMsg(req) if err != nil { - return err + return 0, err } var res pb.Message err = r.ReadMsg(&res) if err != nil { - return err + return 0, err } if res.GetType() != pb.Message_REGISTER_RESPONSE { - return fmt.Errorf("Unexpected response: %s", res.GetType().String()) + return 0, fmt.Errorf("Unexpected response: %s", res.GetType().String()) } - status := res.GetRegisterResponse().GetStatus() + response := res.GetRegisterResponse() + status := response.GetStatus() if status != pb.Message_OK { - return RendezvousError{Status: status, Text: res.GetRegisterResponse().GetStatusText()} + return 0, RendezvousError{Status: status, Text: res.GetRegisterResponse().GetStatusText()} } - return nil + return time.Duration(*response.Ttl) * time.Second, nil } -func (rc *rendezvousClient) Register(ctx context.Context, ns string, ttl int) error { +func (rc *rendezvousClient) Register(ctx context.Context, ns string, ttl int) (time.Duration, error) { if ttl < 120 { - return fmt.Errorf("registration TTL is too short") + return 0, fmt.Errorf("registration TTL is too short") } - err := rc.rp.Register(ctx, ns, ttl) + returnedTTL, err := rc.rp.Register(ctx, ns, ttl) if err != nil { - return err + return 0, err } go registerRefresh(ctx, rc.rp, ns, ttl) - return nil + return returnedTTL, nil } func registerRefresh(ctx context.Context, rz RendezvousPoint, ns string, ttl int) { diff --git a/discovery_client.go b/discovery_client.go index 3a25253..30b9ffd 100644 --- a/discovery_client.go +++ b/discovery_client.go @@ -19,7 +19,8 @@ type rendezvousDiscoveryClient struct { } type discoveredPeerCache struct { - cachedRegs []Registration + cachedRegs map[peer.ID]*Registration + cookie []byte mux sync.Mutex } @@ -39,19 +40,17 @@ func (c *rendezvousDiscoveryClient) Advertise(ctx context.Context, ns string, op ttl := options.Ttl var ttlSeconds int - // Default is minimum duration if ttl == 0 { - ttlSeconds = 120 + ttlSeconds = 7200 } else { ttlSeconds = int(math.Round(ttl.Seconds())) } - if err := c.rp.Register(ctx, ns, ttlSeconds); err != nil { + if returnedTTL, err := c.rp.Register(ctx, ns, ttlSeconds); err != nil { return 0, err + } else { + return returnedTTL, nil } - - actualTTL := time.Duration(ttlSeconds) * time.Second - return actualTTL, nil } func (c *rendezvousDiscoveryClient) FindPeers(ctx context.Context, ns string, opts ...discovery.Option) (<-chan peer.AddrInfo, error) { @@ -75,34 +74,36 @@ func (c *rendezvousDiscoveryClient) FindPeers(ctx context.Context, ns string, op cache = genericCache.(*discoveredPeerCache) cache.mux.Lock() - cachedRegs := cache.cachedRegs // Remove all expired entries from cache currentTime := int(time.Now().Unix()) - newCacheSize := len(cachedRegs) + newCacheSize := len(cache.cachedRegs) - for i := 0; i < newCacheSize; i++ { - reg := cachedRegs[i] + for p := range cache.cachedRegs { + reg := cache.cachedRegs[p] if reg.Ttl < currentTime { newCacheSize-- - if i != newCacheSize { - cachedRegs[i] = cachedRegs[newCacheSize] - i-- - } + delete(cache.cachedRegs, p) } } - cache.cachedRegs = cachedRegs[:newCacheSize] + + cookie := cache.cookie cache.mux.Unlock() // Discover new records if we don't have enough var discoveryErr error if newCacheSize < limit { - if discoveryRecords, _, err := c.rp.Discover(ctx, ns, limit, nil); err == nil { + if discoveryRecords, newCookie, err := c.rp.Discover(ctx, ns, limit, cookie); err == nil { + cache.mux.Lock() + if cache.cachedRegs == nil { + cache.cachedRegs = make(map[peer.ID]*Registration) + } for i := range discoveryRecords { - discoveryRecords[i].Ttl += currentTime + rec := &discoveryRecords[i] + rec.Ttl += currentTime + cache.cachedRegs[rec.Peer.ID] = rec } - cache.mux.Lock() - cache.cachedRegs = discoveryRecords + cache.cookie = newCookie cache.mux.Unlock() } else { // TODO: Should we return error even if we have valid cached results? @@ -112,8 +113,7 @@ func (c *rendezvousDiscoveryClient) FindPeers(ctx context.Context, ns string, op // Randomize and fill channel with available records cache.mux.Lock() - cachedRegs = cache.cachedRegs - sendQuantity := len(cachedRegs) + sendQuantity := len(cache.cachedRegs) if limit < sendQuantity { sendQuantity = limit } @@ -121,11 +121,25 @@ func (c *rendezvousDiscoveryClient) FindPeers(ctx context.Context, ns string, op chPeer := make(chan peer.AddrInfo, sendQuantity) c.rngMux.Lock() - perm := c.rng.Perm(len(cachedRegs))[0:sendQuantity] + perm := c.rng.Perm(len(cache.cachedRegs))[0:sendQuantity] c.rngMux.Unlock() - for _, i := range perm { - chPeer <- cachedRegs[i].Peer + permSet := make(map[int]int) + for i, v := range perm { + permSet[v] = i + } + + sendLst := make([]*peer.AddrInfo, sendQuantity) + iter := 0 + for k := range cache.cachedRegs { + if sendIndex, ok := permSet[iter]; ok { + sendLst[sendIndex] = &cache.cachedRegs[k].Peer + } + iter++ + } + + for _, send := range sendLst { + chPeer <- *send } cache.mux.Unlock() From 25d0082f0587f7f7c083fa444079c33dffe48e92 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Wed, 5 Jun 2019 13:44:44 -0400 Subject: [PATCH 4/5] fixed compile error from previous commit + code refactoring --- client.go | 4 +- client_test.go | 15 +++- discovery_client.go => discovery.go | 73 +++++++++---------- discovery_client_test.go => discovery_test.go | 2 +- svc_test.go | 12 ++- 5 files changed, 61 insertions(+), 45 deletions(-) rename discovery_client.go => discovery.go (52%) rename discovery_client_test.go => discovery_test.go (98%) diff --git a/client.go b/client.go index e416433..6cd091b 100644 --- a/client.go +++ b/client.go @@ -66,7 +66,7 @@ type rendezvousClient struct { func (rp *rendezvousPoint) Register(ctx context.Context, ns string, ttl int) (time.Duration, error) { s, err := rp.host.NewStream(ctx, rp.p, RendezvousProto) if err != nil { - return err + return 0, err } defer s.Close() @@ -134,7 +134,7 @@ func registerRefresh(ctx context.Context, rz RendezvousPoint, ns string, ttl int return } - err := rz.Register(ctx, ns, ttl) + _, err := rz.Register(ctx, ns, ttl) if err != nil { log.Errorf("Error registering [%s]: %s", ns, err.Error()) errcount++ diff --git a/client_test.go b/client_test.go index 6470932..db974b7 100644 --- a/client_test.go +++ b/client_test.go @@ -31,10 +31,13 @@ func TestClientRegistrationAndDiscovery(t *testing.T) { clients := getRendezvousClients(t, hosts) - err = clients[0].Register(ctx, "foo1", DefaultTTL) + recordTTL, err := clients[0].Register(ctx, "foo1", DefaultTTL) if err != nil { t.Fatal(err) } + if recordTTL != DefaultTTL*time.Second { + t.Fatalf("Expected record TTL to be %d seconds", DefaultTTL) + } pi, cookie, err := clients[0].Discover(ctx, "foo1", 0, nil) if err != nil { @@ -46,10 +49,13 @@ func TestClientRegistrationAndDiscovery(t *testing.T) { checkPeerInfo(t, pi[0], hosts[1]) for i, client := range clients[1:] { - err = client.Register(ctx, "foo1", DefaultTTL) + recordTTL, err = client.Register(ctx, "foo1", DefaultTTL) if err != nil { t.Fatal(err) } + if recordTTL != DefaultTTL*time.Second { + t.Fatalf("Expected record TTL to be %d seconds", DefaultTTL) + } pi, cookie, err = clients[0].Discover(ctx, "foo1", 10, cookie) if err != nil { @@ -98,10 +104,13 @@ func TestClientRegistrationAndDiscoveryAsync(t *testing.T) { } for i, client := range clients[0:] { - err = client.Register(ctx, "foo1", DefaultTTL) + recordTTL, err := client.Register(ctx, "foo1", DefaultTTL) if err != nil { t.Fatal(err) } + if recordTTL != DefaultTTL*time.Second { + t.Fatalf("Expected record TTL to be %d seconds", DefaultTTL) + } pi := <-ch checkPeerInfo(t, pi, hosts[1+i]) diff --git a/discovery_client.go b/discovery.go similarity index 52% rename from discovery_client.go rename to discovery.go index 30b9ffd..94cac73 100644 --- a/discovery_client.go +++ b/discovery.go @@ -11,7 +11,7 @@ import ( "time" ) -type rendezvousDiscoveryClient struct { +type rendezvousDiscovery struct { rp RendezvousPoint peerCache sync.Map //is a map[string]discoveredPeerCache rng *rand.Rand @@ -19,17 +19,22 @@ type rendezvousDiscoveryClient struct { } type discoveredPeerCache struct { - cachedRegs map[peer.ID]*Registration + cachedRecs map[peer.ID]*record cookie []byte mux sync.Mutex } -func NewRendezvousDiscoveryClient(host host.Host, rendezvousPeer peer.ID) discovery.Discovery { +type record struct { + peer peer.AddrInfo + expire int64 +} + +func NewRendezvousDiscovery(host host.Host, rendezvousPeer peer.ID) discovery.Discovery { rp := NewRendezvousPoint(host, rendezvousPeer) - return &rendezvousDiscoveryClient{rp, sync.Map{}, rand.New(rand.NewSource(rand.Int63())), sync.Mutex{}} + return &rendezvousDiscovery{rp, sync.Map{}, rand.New(rand.NewSource(rand.Int63())), sync.Mutex{}} } -func (c *rendezvousDiscoveryClient) Advertise(ctx context.Context, ns string, opts ...discovery.Option) (time.Duration, error) { +func (c *rendezvousDiscovery) Advertise(ctx context.Context, ns string, opts ...discovery.Option) (time.Duration, error) { // Get options var options discovery.Options err := options.Apply(opts...) @@ -53,7 +58,7 @@ func (c *rendezvousDiscoveryClient) Advertise(ctx context.Context, ns string, op } } -func (c *rendezvousDiscoveryClient) FindPeers(ctx context.Context, ns string, opts ...discovery.Option) (<-chan peer.AddrInfo, error) { +func (c *rendezvousDiscovery) FindPeers(ctx context.Context, ns string, opts ...discovery.Option) (<-chan peer.AddrInfo, error) { // Get options var options discovery.Options err := options.Apply(opts...) @@ -74,54 +79,49 @@ func (c *rendezvousDiscoveryClient) FindPeers(ctx context.Context, ns string, op cache = genericCache.(*discoveredPeerCache) cache.mux.Lock() + defer cache.mux.Unlock() // Remove all expired entries from cache - currentTime := int(time.Now().Unix()) - newCacheSize := len(cache.cachedRegs) + currentTime := time.Now().Unix() + newCacheSize := len(cache.cachedRecs) - for p := range cache.cachedRegs { - reg := cache.cachedRegs[p] - if reg.Ttl < currentTime { + for p := range cache.cachedRecs { + rec := cache.cachedRecs[p] + if rec.expire < currentTime { newCacheSize-- - delete(cache.cachedRegs, p) + delete(cache.cachedRecs, p) } } cookie := cache.cookie - cache.mux.Unlock() // Discover new records if we don't have enough - var discoveryErr error if newCacheSize < limit { - if discoveryRecords, newCookie, err := c.rp.Discover(ctx, ns, limit, cookie); err == nil { - cache.mux.Lock() - if cache.cachedRegs == nil { - cache.cachedRegs = make(map[peer.ID]*Registration) + // TODO: Should we return error even if we have valid cached results? + var regs []Registration + var newCookie []byte + if regs, newCookie, err = c.rp.Discover(ctx, ns, limit, cookie); err == nil { + if cache.cachedRecs == nil { + cache.cachedRecs = make(map[peer.ID]*record) } - for i := range discoveryRecords { - rec := &discoveryRecords[i] - rec.Ttl += currentTime - cache.cachedRegs[rec.Peer.ID] = rec + for _, reg := range regs { + rec := &record{peer: reg.Peer, expire: int64(reg.Ttl) + currentTime} + cache.cachedRecs[rec.peer.ID] = rec } cache.cookie = newCookie - cache.mux.Unlock() - } else { - // TODO: Should we return error even if we have valid cached results? - discoveryErr = err } } // Randomize and fill channel with available records - cache.mux.Lock() - sendQuantity := len(cache.cachedRegs) - if limit < sendQuantity { - sendQuantity = limit + count := len(cache.cachedRecs) + if limit < count { + count = limit } - chPeer := make(chan peer.AddrInfo, sendQuantity) + chPeer := make(chan peer.AddrInfo, count) c.rngMux.Lock() - perm := c.rng.Perm(len(cache.cachedRegs))[0:sendQuantity] + perm := c.rng.Perm(len(cache.cachedRecs))[0:count] c.rngMux.Unlock() permSet := make(map[int]int) @@ -129,11 +129,11 @@ func (c *rendezvousDiscoveryClient) FindPeers(ctx context.Context, ns string, op permSet[v] = i } - sendLst := make([]*peer.AddrInfo, sendQuantity) + sendLst := make([]*peer.AddrInfo, count) iter := 0 - for k := range cache.cachedRegs { + for k := range cache.cachedRecs { if sendIndex, ok := permSet[iter]; ok { - sendLst[sendIndex] = &cache.cachedRegs[k].Peer + sendLst[sendIndex] = &cache.cachedRecs[k].peer } iter++ } @@ -142,7 +142,6 @@ func (c *rendezvousDiscoveryClient) FindPeers(ctx context.Context, ns string, op chPeer <- *send } - cache.mux.Unlock() close(chPeer) - return chPeer, discoveryErr + return chPeer, err } diff --git a/discovery_client_test.go b/discovery_test.go similarity index 98% rename from discovery_client_test.go rename to discovery_test.go index 854737e..4091ef7 100644 --- a/discovery_client_test.go +++ b/discovery_test.go @@ -17,7 +17,7 @@ func getRendezvousDiscovery(hosts []host.Host) []discovery.Discovery { for i, h := range hosts[1:] { rp := NewRendezvousPoint(h, rendezvousPeer) rng := rand.New(rand.NewSource(int64(i))) - clients[i] = &rendezvousDiscoveryClient{rp: rp, peerCache: sync.Map{}, rng: rng} + clients[i] = &rendezvousDiscovery{rp: rp, peerCache: sync.Map{}, rng: rng} } return clients } diff --git a/svc_test.go b/svc_test.go index eaea97d..cc311d1 100644 --- a/svc_test.go +++ b/svc_test.go @@ -5,6 +5,7 @@ import ( "fmt" "math/rand" "testing" + "time" db "github.com/libp2p/go-libp2p-rendezvous/db/sqlite" pb "github.com/libp2p/go-libp2p-rendezvous/pb" @@ -77,10 +78,14 @@ func TestSVCRegistrationAndDiscovery(t *testing.T) { clients := getRendezvousPoints(t, hosts) - err = clients[0].Register(ctx, "foo1", 60) + const registerTTL = 60 + recordTTL, err := clients[0].Register(ctx, "foo1", registerTTL) if err != nil { t.Fatal(err) } + if recordTTL != registerTTL*time.Second { + t.Fatalf("Expected record TTL to be %d seconds", DefaultTTL) + } rrs, cookie, err := clients[0].Discover(ctx, "foo1", 10, nil) if err != nil { @@ -92,10 +97,13 @@ func TestSVCRegistrationAndDiscovery(t *testing.T) { checkHostRegistration(t, rrs[0], hosts[1]) for i, client := range clients[1:] { - err = client.Register(ctx, "foo1", 60) + recordTTL, err = client.Register(ctx, "foo1", registerTTL) if err != nil { t.Fatal(err) } + if recordTTL != registerTTL*time.Second { + t.Fatalf("Expected record TTL to be %d seconds", DefaultTTL) + } rrs, cookie, err = clients[0].Discover(ctx, "foo1", 10, cookie) if err != nil { From 0e771cd3c2974bd7e6a2561aec395bd20d275e2b Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Fri, 21 Jun 2019 09:06:01 +0200 Subject: [PATCH 5/5] replaced sync.Map with map + RW mutex. small refactors --- discovery.go | 62 ++++++++++++++++++++++++++--------------------- discovery_test.go | 3 +-- 2 files changed, 36 insertions(+), 29 deletions(-) diff --git a/discovery.go b/discovery.go index 94cac73..40e70e8 100644 --- a/discovery.go +++ b/discovery.go @@ -12,16 +12,17 @@ import ( ) type rendezvousDiscovery struct { - rp RendezvousPoint - peerCache sync.Map //is a map[string]discoveredPeerCache - rng *rand.Rand - rngMux sync.Mutex + rp RendezvousPoint + peerCache map[string]*discoveryCache + peerCacheMux sync.RWMutex + rng *rand.Rand + rngMux sync.Mutex } -type discoveredPeerCache struct { - cachedRecs map[peer.ID]*record - cookie []byte - mux sync.Mutex +type discoveryCache struct { + recs map[peer.ID]*record + cookie []byte + mux sync.Mutex } type record struct { @@ -31,7 +32,7 @@ type record struct { func NewRendezvousDiscovery(host host.Host, rendezvousPeer peer.ID) discovery.Discovery { rp := NewRendezvousPoint(host, rendezvousPeer) - return &rendezvousDiscovery{rp, sync.Map{}, rand.New(rand.NewSource(rand.Int63())), sync.Mutex{}} + return &rendezvousDiscovery{rp: rp, peerCache: make(map[string]*discoveryCache), rng: rand.New(rand.NewSource(rand.Int63()))} } func (c *rendezvousDiscovery) Advertise(ctx context.Context, ns string, opts ...discovery.Option) (time.Duration, error) { @@ -51,10 +52,10 @@ func (c *rendezvousDiscovery) Advertise(ctx context.Context, ns string, opts ... ttlSeconds = int(math.Round(ttl.Seconds())) } - if returnedTTL, err := c.rp.Register(ctx, ns, ttlSeconds); err != nil { + if rttl, err := c.rp.Register(ctx, ns, ttlSeconds); err != nil { return 0, err } else { - return returnedTTL, nil + return rttl, nil } } @@ -73,23 +74,33 @@ func (c *rendezvousDiscovery) FindPeers(ctx context.Context, ns string, opts ... } // Get cached peers - var cache *discoveredPeerCache - - genericCache, _ := c.peerCache.LoadOrStore(ns, &discoveredPeerCache{}) - cache = genericCache.(*discoveredPeerCache) + var cache *discoveryCache + + c.peerCacheMux.RLock() + cache, ok := c.peerCache[ns] + c.peerCacheMux.RUnlock() + if !ok { + c.peerCacheMux.Lock() + cache, ok = c.peerCache[ns] + if !ok{ + cache = &discoveryCache{recs: make(map[peer.ID]*record)} + c.peerCache[ns] = cache + } + c.peerCacheMux.Unlock() + } cache.mux.Lock() defer cache.mux.Unlock() // Remove all expired entries from cache currentTime := time.Now().Unix() - newCacheSize := len(cache.cachedRecs) + newCacheSize := len(cache.recs) - for p := range cache.cachedRecs { - rec := cache.cachedRecs[p] + for p := range cache.recs { + rec := cache.recs[p] if rec.expire < currentTime { newCacheSize-- - delete(cache.cachedRecs, p) + delete(cache.recs, p) } } @@ -101,19 +112,16 @@ func (c *rendezvousDiscovery) FindPeers(ctx context.Context, ns string, opts ... var regs []Registration var newCookie []byte if regs, newCookie, err = c.rp.Discover(ctx, ns, limit, cookie); err == nil { - if cache.cachedRecs == nil { - cache.cachedRecs = make(map[peer.ID]*record) - } for _, reg := range regs { rec := &record{peer: reg.Peer, expire: int64(reg.Ttl) + currentTime} - cache.cachedRecs[rec.peer.ID] = rec + cache.recs[rec.peer.ID] = rec } cache.cookie = newCookie } } // Randomize and fill channel with available records - count := len(cache.cachedRecs) + count := len(cache.recs) if limit < count { count = limit } @@ -121,7 +129,7 @@ func (c *rendezvousDiscovery) FindPeers(ctx context.Context, ns string, opts ... chPeer := make(chan peer.AddrInfo, count) c.rngMux.Lock() - perm := c.rng.Perm(len(cache.cachedRecs))[0:count] + perm := c.rng.Perm(len(cache.recs))[0:count] c.rngMux.Unlock() permSet := make(map[int]int) @@ -131,9 +139,9 @@ func (c *rendezvousDiscovery) FindPeers(ctx context.Context, ns string, opts ... sendLst := make([]*peer.AddrInfo, count) iter := 0 - for k := range cache.cachedRecs { + for k := range cache.recs { if sendIndex, ok := permSet[iter]; ok { - sendLst[sendIndex] = &cache.cachedRecs[k].peer + sendLst[sendIndex] = &cache.recs[k].peer } iter++ } diff --git a/discovery_test.go b/discovery_test.go index 4091ef7..72161ce 100644 --- a/discovery_test.go +++ b/discovery_test.go @@ -6,7 +6,6 @@ import ( "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" "math/rand" - "sync" "testing" "time" ) @@ -17,7 +16,7 @@ func getRendezvousDiscovery(hosts []host.Host) []discovery.Discovery { for i, h := range hosts[1:] { rp := NewRendezvousPoint(h, rendezvousPeer) rng := rand.New(rand.NewSource(int64(i))) - clients[i] = &rendezvousDiscovery{rp: rp, peerCache: sync.Map{}, rng: rng} + clients[i] = &rendezvousDiscovery{rp: rp, peerCache: make(map[string]*discoveryCache), rng: rng} } return clients }