From 2877e2e986e680023612f35a08da04a6a2ead144 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 27 Dec 2014 22:55:34 -0800 Subject: [PATCH 1/4] epictest: add setup logging --- epictest/core.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/epictest/core.go b/epictest/core.go index b7dac264a..bb2f00756 100644 --- a/epictest/core.go +++ b/epictest/core.go @@ -6,6 +6,7 @@ import ( context "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context" datastore "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore" sync "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-datastore/sync" + blockstore "github.com/jbenet/go-ipfs/blocks/blockstore" blockservice "github.com/jbenet/go-ipfs/blockservice" exchange "github.com/jbenet/go-ipfs/exchange" @@ -22,8 +23,11 @@ import ( util "github.com/jbenet/go-ipfs/util" "github.com/jbenet/go-ipfs/util/datastore2" delay "github.com/jbenet/go-ipfs/util/delay" + eventlog "github.com/jbenet/go-ipfs/util/eventlog" ) +var log = eventlog.Logger("epictest") + // TODO merge with core.IpfsNode type core struct { repo Repo @@ -128,6 +132,8 @@ func MocknetTestRepo(p peer.ID, n net.Network, conf Config) RepoFactory { const alwaysSendToPeer = true dsDelay := delay.Fixed(conf.BlockstoreLatency) ds := sync.MutexWrap(datastore2.WithDelay(datastore.NewMapDatastore(), dsDelay)) + + log.Debugf("MocknetTestRepo: %s %s %s", p, n.LocalPeer(), n) dhtt := dht.NewDHT(ctx, p, n, ds) bsn := bsnet.NewFromIpfsNetwork(n, dhtt) bstore, err := blockstore.WriteCached(blockstore.NewBlockstore(ds), kWriteCacheElems) From bbcddd6c1f02cd3d542e04f9b2e769e7e9746930 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 27 Dec 2014 22:55:57 -0800 Subject: [PATCH 2/4] muxer: log precisely which muxer (useful in tests) --- net/mux.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/net/mux.go b/net/mux.go index b8cebd55a..9145369e9 100644 --- a/net/mux.go +++ b/net/mux.go @@ -1,7 +1,6 @@ package net import ( - "errors" "fmt" "io" "sync" @@ -66,17 +65,24 @@ func (m *Mux) ReadProtocolHeader(s io.Reader) (string, StreamHandler, error) { case !found && m.Default != nil: return name, m.Default, nil case !found && m.Default == nil: - return name, nil, errors.New("no handler with name: " + name) + return name, nil, fmt.Errorf("%s no handler with name: %s (%d)", m, name, len(name)) default: return name, h, nil } } +// String returns the muxer's printing representation +func (m *Mux) String() string { + m.RLock() + defer m.RUnlock() + return fmt.Sprintf("", m, len(m.Handlers)) +} + // SetHandler sets the protocol handler on the Network's Muxer. // This operation is threadsafe. func (m *Mux) SetHandler(p ProtocolID, h StreamHandler) { + log.Debugf("%s setting handler for protocol: %s (%d)", m, p, len(p)) m.Lock() - log.Debug("setting protocol ", p) m.Handlers[p] = h m.Unlock() } From 6bd4a6ddb2f1d5e0fde9d803b2bf6f4d1b95bbf6 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet Date: Sat, 27 Dec 2014 22:59:35 -0800 Subject: [PATCH 3/4] epictest: fix mn.Peers() setup race @maybebtc the error was not inside mocknet. the error is in assuming the peers / nets returned follow the same order. See: - https://github.com/jbenet/go-ipfs/blob/master/epictest/addcat_test.go#L100 - https://gist.github.com/jbenet/a39bb9d2f16532a03bb8 if you want the results to be sorted by peer.ID before they are returned, we can totally do that, but that's probably an unsafe assumption to make in general-- if you do your initialization async, the number of networks or peers may have changed between the two calls. LMK what you prefer. (thank you golang map chaosmonkey ;) --- epictest/addcat_test.go | 8 +++++--- epictest/three_legged_cat_test.go | 9 +++++---- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/epictest/addcat_test.go b/epictest/addcat_test.go index 7c028135a..c9ccb931a 100644 --- a/epictest/addcat_test.go +++ b/epictest/addcat_test.go @@ -94,14 +94,16 @@ func DirectAddCat(data []byte, conf Config) error { Bandwidth: math.MaxInt32, }) - if len(mn.Peers()) < numPeers { + peers := mn.Peers() + if len(peers) < numPeers { return errors.New("test initialization error") } - adder, err := makeCore(ctx, MocknetTestRepo(mn.Peers()[0], mn.Net(mn.Peers()[0]), conf)) + + adder, err := makeCore(ctx, MocknetTestRepo(peers[0], mn.Net(peers[0]), conf)) if err != nil { return err } - catter, err := makeCore(ctx, MocknetTestRepo(mn.Peers()[1], mn.Net(mn.Peers()[1]), conf)) + catter, err := makeCore(ctx, MocknetTestRepo(peers[1], mn.Net(peers[1]), conf)) if err != nil { return err } diff --git a/epictest/three_legged_cat_test.go b/epictest/three_legged_cat_test.go index 40de2cae7..d66578305 100644 --- a/epictest/three_legged_cat_test.go +++ b/epictest/three_legged_cat_test.go @@ -38,18 +38,19 @@ func RunThreeLeggedCat(data []byte, conf Config) error { Bandwidth: math.MaxInt32, }) - if len(mn.Peers()) < numPeers { + peers := mn.Peers() + if len(peers) < numPeers { return errors.New("test initialization error") } - adder, err := makeCore(ctx, MocknetTestRepo(mn.Peers()[0], mn.Net(mn.Peers()[0]), conf)) + adder, err := makeCore(ctx, MocknetTestRepo(peers[0], mn.Net(peers[0]), conf)) if err != nil { return err } - catter, err := makeCore(ctx, MocknetTestRepo(mn.Peers()[1], mn.Net(mn.Peers()[1]), conf)) + catter, err := makeCore(ctx, MocknetTestRepo(peers[1], mn.Net(peers[1]), conf)) if err != nil { return err } - bootstrap, err := makeCore(ctx, MocknetTestRepo(mn.Peers()[2], mn.Net(mn.Peers()[2]), conf)) + bootstrap, err := makeCore(ctx, MocknetTestRepo(peers[2], mn.Net(peers[2]), conf)) if err != nil { return err } From 0587342591afbeb60fb0eaac3c668a710b4c0ae5 Mon Sep 17 00:00:00 2001 From: Brian Tiger Chow Date: Sun, 28 Dec 2014 06:51:33 -0500 Subject: [PATCH 4/4] doc: specify iteration order randomization --- net/mock/interface.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/mock/interface.go b/net/mock/interface.go index 5f40397d7..be6bd4bb2 100644 --- a/net/mock/interface.go +++ b/net/mock/interface.go @@ -26,7 +26,7 @@ type Mocknet interface { // ID is derived from PrivKey AddPeer(ic.PrivKey, ma.Multiaddr) (inet.Network, error) - // retrieve things + // retrieve things (with randomized iteration order) Peers() []peer.ID Net(peer.ID) inet.Network Nets() []inet.Network