From a7eb2efe4be1ae46873240535f955687e809f2e8 Mon Sep 17 00:00:00 2001 From: whyrusleeping Date: Mon, 8 Apr 2019 16:07:31 -0700 Subject: [PATCH 1/2] move things outside of the lock in obsaddr --- p2p/protocol/identify/obsaddr.go | 16 +++++----- p2p/protocol/identify/obsaddr_test.go | 46 +++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/p2p/protocol/identify/obsaddr.go b/p2p/protocol/identify/obsaddr.go index 1f6a10a489..793105bd07 100644 --- a/p2p/protocol/identify/obsaddr.go +++ b/p2p/protocol/identify/obsaddr.go @@ -119,6 +119,14 @@ func (oas *ObservedAddrSet) Addrs() (addrs []ma.Multiaddr) { func (oas *ObservedAddrSet) Add(observed, local, observer ma.Multiaddr, direction net.Direction) { + now := time.Now() + observerString := observerGroup(observer) + localString := string(local.Bytes()) + ob := observation{ + seenTime: now, + connDirection: direction, + } + oas.Lock() defer oas.Unlock() @@ -128,14 +136,6 @@ func (oas *ObservedAddrSet) Add(observed, local, observer ma.Multiaddr, oas.ttl = pstore.OwnObservedAddrTTL } - now := time.Now() - observerString := observerGroup(observer) - localString := string(local.Bytes()) - ob := observation{ - seenTime: now, - connDirection: direction, - } - observedAddrs := oas.addrs[localString] // check if observed address seen yet, if so, update it for i, previousObserved := range observedAddrs { diff --git a/p2p/protocol/identify/obsaddr_test.go b/p2p/protocol/identify/obsaddr_test.go index 7291326218..8d2e8c0e23 100644 --- a/p2p/protocol/identify/obsaddr_test.go +++ b/p2p/protocol/identify/obsaddr_test.go @@ -1,6 +1,7 @@ package identify import ( + "sync" "testing" "time" @@ -117,3 +118,48 @@ func TestObsAddrSet(t *testing.T) { t.Error("addrs should have timed out") } } + +func TestAddAddrsProfile(b *testing.T) { + m := func(s string) ma.Multiaddr { + m, err := ma.NewMultiaddr(s) + if err != nil { + b.Fatal(err) + } + return m + } + oas := &ObservedAddrSet{} + + add := func(oas *ObservedAddrSet, observed, observer ma.Multiaddr) { + dummyLocal := m("/ip4/127.0.0.1/tcp/10086") + dummyDirection := net.DirOutbound + + oas.Add(observed, dummyLocal, observer, dummyDirection) + } + + a1 := m("/ip4/1.2.3.4/tcp/1231") + a2 := m("/ip4/1.2.3.4/tcp/1232") + a3 := m("/ip4/1.2.3.4/tcp/1233") + a4 := m("/ip4/1.2.3.4/tcp/1234") + a5 := m("/ip4/1.2.3.4/tcp/1235") + + b1 := m("/ip4/1.2.3.6/tcp/1236") + b2 := m("/ip4/1.2.3.7/tcp/1237") + b3 := m("/ip4/1.2.3.8/tcp/1237") + b4 := m("/ip4/1.2.3.9/tcp/1237") + b5 := m("/ip4/1.2.3.10/tcp/1237") + + _ = []ma.Multiaddr{a1, a2, a3, a4, a5, b1, b2, b3, b4, b5} + + var wg sync.WaitGroup + for i := 0; i < 1000; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for j := 0; j < 10000; j++ { + add(oas, a1, b1) + } + }() + } + + wg.Wait() +} From aebe405680aedbebb95240467d2c05c4f4fad279 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Mon, 8 Apr 2019 18:29:45 -0700 Subject: [PATCH 2/2] test: disable TestAddAddrsProfile when the race detector is enabled --- p2p/protocol/identify/obsaddr_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/p2p/protocol/identify/obsaddr_test.go b/p2p/protocol/identify/obsaddr_test.go index 8d2e8c0e23..12bdb54a8f 100644 --- a/p2p/protocol/identify/obsaddr_test.go +++ b/p2p/protocol/identify/obsaddr_test.go @@ -5,6 +5,7 @@ import ( "testing" "time" + detectrace "github.com/ipfs/go-detect-race" net "github.com/libp2p/go-libp2p-net" ma "github.com/multiformats/go-multiaddr" ) @@ -120,6 +121,9 @@ func TestObsAddrSet(t *testing.T) { } func TestAddAddrsProfile(b *testing.T) { + if detectrace.WithRace() { + b.Skip("test too slow when the race detector is running") + } m := func(s string) ma.Multiaddr { m, err := ma.NewMultiaddr(s) if err != nil {