diff --git a/core/commands/bitswap.go b/core/commands/bitswap.go index c6ec993ea9e..cbb342e6656 100644 --- a/core/commands/bitswap.go +++ b/core/commands/bitswap.go @@ -159,6 +159,9 @@ var bitswapStatCmd = &cmds.Command{ fmt.Fprintln(buf, "bitswap status") fmt.Fprintf(buf, "\tprovides buffer: %d / %d\n", out.ProvideBufLen, bitswap.HasBlockBufferSize) fmt.Fprintf(buf, "\tblocks received: %d\n", out.BlocksReceived) + fmt.Fprintf(buf, "\tblocks sent: %d\n", out.BlocksSent) + fmt.Fprintf(buf, "\tdata received: %d\n", out.DataReceived) + fmt.Fprintf(buf, "\tdata sent: %d\n", out.DataSent) fmt.Fprintf(buf, "\tdup blocks received: %d\n", out.DupBlksReceived) fmt.Fprintf(buf, "\tdup data received: %s\n", humanize.Bytes(out.DupDataReceived)) fmt.Fprintf(buf, "\twantlist [%d keys]\n", len(out.Wantlist)) diff --git a/exchange/bitswap/bitswap.go b/exchange/bitswap/bitswap.go index 7e565e837a8..d60be11d062 100644 --- a/exchange/bitswap/bitswap.go +++ b/exchange/bitswap/bitswap.go @@ -157,6 +157,9 @@ type Bitswap struct { blocksRecvd int dupBlocksRecvd int dupDataRecvd uint64 + blocksSent int + dataSent uint64 + dataRecvd uint64 // Metrics interface metrics dupMetric metrics.Histogram @@ -401,6 +404,7 @@ func (bs *Bitswap) updateReceiveCounters(b blocks.Block) { defer bs.counterLk.Unlock() bs.blocksRecvd++ + bs.dataRecvd += uint64(len(b.RawData())) if has { bs.dupBlocksRecvd++ bs.dupDataRecvd += uint64(blkLen) diff --git a/exchange/bitswap/bitswap_test.go b/exchange/bitswap/bitswap_test.go index 8cef2d3ad53..7b72279bfd7 100644 --- a/exchange/bitswap/bitswap_test.go +++ b/exchange/bitswap/bitswap_test.go @@ -3,6 +3,7 @@ package bitswap import ( "bytes" "context" + "fmt" "sync" "testing" "time" @@ -299,6 +300,25 @@ func TestEmptyKey(t *testing.T) { } } +func assertStat(st *Stat, sblks, rblks int, sdata, rdata uint64) error { + if sblks != st.BlocksSent { + return fmt.Errorf("mismatch in blocks sent: %d vs %d", sblks, st.BlocksSent) + } + + if rblks != st.BlocksReceived { + return fmt.Errorf("mismatch in blocks recvd: %d vs %d", rblks, st.BlocksReceived) + } + + if sdata != st.DataSent { + return fmt.Errorf("mismatch in data sent: %d vs %d", sdata, st.DataSent) + } + + if rdata != st.DataReceived { + return fmt.Errorf("mismatch in data recvd: %d vs %d", rdata, st.DataReceived) + } + return nil +} + func TestBasicBitswap(t *testing.T) { net := tn.VirtualNetwork(mockrouting.NewServer(), delay.Fixed(kNetworkDelay)) sg := NewTestSessionGenerator(net) @@ -321,6 +341,24 @@ func TestBasicBitswap(t *testing.T) { t.Fatal(err) } + st0, err := instances[0].Exchange.Stat() + if err != nil { + t.Fatal(err) + } + + st1, err := instances[1].Exchange.Stat() + if err != nil { + t.Fatal(err) + } + + if err := assertStat(st0, 1, 0, 1, 0); err != nil { + t.Fatal(err) + } + + if err := assertStat(st1, 0, 1, 0, 1); err != nil { + t.Fatal(err) + } + t.Log(blk) for _, inst := range instances { err := inst.Exchange.Close() diff --git a/exchange/bitswap/stat.go b/exchange/bitswap/stat.go index 7f4ff17511b..87da3b49fac 100644 --- a/exchange/bitswap/stat.go +++ b/exchange/bitswap/stat.go @@ -11,6 +11,9 @@ type Stat struct { Wantlist []*cid.Cid Peers []string BlocksReceived int + DataReceived uint64 + BlocksSent int + DataSent uint64 DupBlksReceived int DupDataReceived uint64 } @@ -23,6 +26,9 @@ func (bs *Bitswap) Stat() (*Stat, error) { st.BlocksReceived = bs.blocksRecvd st.DupBlksReceived = bs.dupBlocksRecvd st.DupDataReceived = bs.dupDataRecvd + st.BlocksSent = bs.blocksSent + st.DataSent = bs.dataSent + st.DataReceived = bs.dataRecvd bs.counterLk.Unlock() for _, p := range bs.engine.Peers() { diff --git a/exchange/bitswap/workers.go b/exchange/bitswap/workers.go index b6840ef52e8..a8c5117e842 100644 --- a/exchange/bitswap/workers.go +++ b/exchange/bitswap/workers.go @@ -64,6 +64,10 @@ func (bs *Bitswap) taskWorker(ctx context.Context, id int) { }) bs.wm.SendBlock(ctx, envelope) + bs.counterLk.Lock() + bs.blocksSent++ + bs.dataSent += uint64(len(envelope.Block.RawData())) + bs.counterLk.Unlock() case <-ctx.Done(): return } diff --git a/test/sharness/t0125-twonode.sh b/test/sharness/t0125-twonode.sh new file mode 100755 index 00000000000..5d6ad9f7d5d --- /dev/null +++ b/test/sharness/t0125-twonode.sh @@ -0,0 +1,101 @@ +#!/bin/sh +# +# Copyright (c) 2017 Jeromy Johnson +# MIT Licensed; see the LICENSE file in this repository. +# + +test_description="Test two ipfs nodes transferring a file" + +. lib/test-lib.sh + +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 + ' +} + +check_dir_fetch() { + node=$1 + ref=$2 + + test_expect_success "node can fetch all refs for dir" ' + ipfsi $node refs -r $ref > /dev/null + ' +} + +run_single_file_test() { + test_expect_success "add a file on node1" ' + random 1000000 > filea && + FILEA_HASH=$(ipfsi 1 add -q filea) + ' + + check_file_fetch 0 $FILEA_HASH filea +} + +run_random_dir_test() { + test_expect_success "create a bunch of random files" ' + random-files -depth=3 -dirs=4 -files=5 -seed=5 foobar > /dev/null + ' + + test_expect_success "add those on node 0" ' + DIR_HASH=$(ipfsi 0 add -r -q foobar | tail -n1) + ' + + check_dir_fetch 1 $DIR_HASH +} + +run_advanced_test() { + startup_cluster 2 "$@" + + test_expect_success "clean repo before test" ' + ipfsi 0 repo gc > /dev/null && + ipfsi 1 repo gc > /dev/null + ' + + run_single_file_test + + run_random_dir_test + + test_expect_success "node0 data transferred looks correct" ' + ipfsi 0 bitswap stat > stat0 && + grep "blocks sent: 126" stat0 > /dev/null && + grep "blocks received: 5" stat0 > /dev/null && + grep "data sent: 228113" stat0 > /dev/null && + grep "data received: 1000256" stat0 > /dev/null + ' + + test_expect_success "node1 data transferred looks correct" ' + ipfsi 1 bitswap stat > stat1 && + grep "blocks received: 126" stat1 > /dev/null && + grep "blocks sent: 5" stat1 > /dev/null && + grep "data received: 228113" stat1 > /dev/null && + grep "data sent: 1000256" stat1 > /dev/null + ' + + test_expect_success "shut down nodes" ' + iptb stop + ' +} + +test_expect_success "set up tcp testbed" ' + iptb init -n 2 -p 0 -f --bootstrap=none +' + +# test multiplex muxer +export LIBP2P_MUX_PREFS="/mplex/6.7.0" +run_advanced_test "--enable-mplex-experiment" +unset LIBP2P_MUX_PREFS + +# test default configuration +run_advanced_test + + +test_done diff --git a/test/sharness/t0220-bitswap.sh b/test/sharness/t0220-bitswap.sh index 6278bf2f3ee..c1b0616eba5 100755 --- a/test/sharness/t0220-bitswap.sh +++ b/test/sharness/t0220-bitswap.sh @@ -20,6 +20,9 @@ test_expect_success "'ipfs bitswap stat' output looks good" ' bitswap status provides buffer: 0 / 256 blocks received: 0 + blocks sent: 0 + data received: 0 + data sent: 0 dup blocks received: 0 dup data received: 0 B wantlist [0 keys] @@ -55,6 +58,9 @@ test_expect_success "'ipfs bitswap stat' output looks good" ' bitswap status provides buffer: 0 / 256 blocks received: 0 + blocks sent: 0 + data received: 0 + data sent: 0 dup blocks received: 0 dup data received: 0 B wantlist [0 keys]