diff --git a/exchange/bitswap/wantmanager.go b/exchange/bitswap/wantmanager.go index 3b4626a4d..2fae23515 100644 --- a/exchange/bitswap/wantmanager.go +++ b/exchange/bitswap/wantmanager.go @@ -56,6 +56,8 @@ type msgQueue struct { out bsmsg.BitSwapMessage network bsnet.BitSwapNetwork + refcnt int + work chan struct{} done chan struct{} } @@ -101,13 +103,13 @@ func (pm *WantManager) SendBlock(ctx context.Context, env *engine.Envelope) { } func (pm *WantManager) startPeerHandler(p peer.ID) *msgQueue { - _, ok := pm.peers[p] + mq, ok := pm.peers[p] if ok { - // TODO: log an error? + mq.refcnt++ return nil } - mq := pm.newMsgQueue(p) + mq = pm.newMsgQueue(p) // new peer, we will want to give them our full wantlist fullwantlist := bsmsg.New(true) @@ -129,6 +131,11 @@ func (pm *WantManager) stopPeerHandler(p peer.ID) { return } + pq.refcnt-- + if pq.refcnt > 0 { + return + } + close(pq.done) delete(pm.peers, p) } @@ -247,6 +254,7 @@ func (wm *WantManager) newMsgQueue(p peer.ID) *msgQueue { mq.work = make(chan struct{}, 1) mq.network = wm.network mq.p = p + mq.refcnt = 1 return mq } diff --git a/test/sharness/t0130-multinode.sh b/test/sharness/t0130-multinode.sh new file mode 100755 index 000000000..7ba364ec5 --- /dev/null +++ b/test/sharness/t0130-multinode.sh @@ -0,0 +1,81 @@ +#!/bin/sh +# +# Copyright (c) 2015 Jeromy Johnson +# MIT Licensed; see the LICENSE file in this repository. +# + +test_description="Test multiple ipfs nodes" + +. lib/test-lib.sh + +export IPTB_ROOT="`pwd`/.iptb" + +ipfsi() { + dir="$1" + shift + IPFS_PATH="$IPTB_ROOT/$dir" ipfs $@ +} + +check_has_connection() { + node=$1 + ipfsi $node swarm peers | grep ipfs > /dev/null +} + +startup_cluster() { + test_expect_success "start up nodes" ' + iptb start + ' + + test_expect_success "connect nodes to eachother" ' + iptb connect [1-4] 0 + ' + + test_expect_success "nodes are connected" ' + check_has_connection 0 && + check_has_connection 1 && + check_has_connection 2 && + check_has_connection 3 && + check_has_connection 4 + ' +} + +check_file_fetch() { + node=$1 + fhash=$2 + fname=$3 + + test_expect_success "can fetch file" ' + ipfsi $node cat $fhash > fetch_out + ' + + test_expect_success "file looks good" ' + test_cmp $fname fetch_out + ' +} + +run_basic_test() { + startup_cluster + + test_expect_success "add a file on node1" ' + random 1000000 > filea && + FILEA_HASH=$(ipfsi 1 add -q filea) + ' + + check_file_fetch 4 $FILEA_HASH filea + check_file_fetch 3 $FILEA_HASH filea + check_file_fetch 2 $FILEA_HASH filea + check_file_fetch 1 $FILEA_HASH filea + check_file_fetch 0 $FILEA_HASH filea + + test_expect_success "shut down nodes" ' + iptb stop + ' +} + +test_expect_success "set up tcp testbed" ' + iptb init -n 5 -p 0 -f --bootstrap=none +' + +run_basic_test + +test_done