Skip to content

Commit 99f15e6

Browse files
committed
Merge branch 'master' of https://github.com/ipfs/go-ipfs into iss653
2 parents 50e3b15 + 0d521ff commit 99f15e6

File tree

7 files changed

+38
-162
lines changed

7 files changed

+38
-162
lines changed

exchange/bitswap/bitswap.go

+21-25
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package bitswap
44

55
import (
66
"errors"
7+
"fmt"
78
"math"
89
"sync"
910
"time"
@@ -324,47 +325,32 @@ func (bs *Bitswap) sendWantlistToProviders(ctx context.Context, entries []wantli
324325
}
325326

326327
// TODO(brian): handle errors
327-
func (bs *Bitswap) ReceiveMessage(ctx context.Context, p peer.ID, incoming bsmsg.BitSwapMessage) (
328-
peer.ID, bsmsg.BitSwapMessage) {
328+
func (bs *Bitswap) ReceiveMessage(ctx context.Context, p peer.ID, incoming bsmsg.BitSwapMessage) error {
329329
defer log.EventBegin(ctx, "receiveMessage", p, incoming).Done()
330330

331-
if p == "" {
332-
log.Debug("Received message from nil peer!")
333-
// TODO propagate the error upward
334-
return "", nil
335-
}
336-
if incoming == nil {
337-
log.Debug("Got nil bitswap message!")
338-
// TODO propagate the error upward
339-
return "", nil
340-
}
341-
342331
// This call records changes to wantlists, blocks received,
343332
// and number of bytes transfered.
344333
bs.engine.MessageReceived(p, incoming)
345334
// TODO: this is bad, and could be easily abused.
346335
// Should only track *useful* messages in ledger
347336

337+
var keys []u.Key
348338
for _, block := range incoming.Blocks() {
349339
bs.blocksRecvd++
350340
if has, err := bs.blockstore.Has(block.Key()); err == nil && has {
351341
bs.dupBlocksRecvd++
352342
}
343+
log.Debugf("got block %s from %s", block, p)
353344
hasBlockCtx, cancel := context.WithTimeout(ctx, hasBlockTimeout)
354345
if err := bs.HasBlock(hasBlockCtx, block); err != nil {
355-
log.Debug(err)
346+
return fmt.Errorf("ReceiveMessage HasBlock error: %s", err)
356347
}
357348
cancel()
358-
}
359-
360-
var keys []u.Key
361-
for _, block := range incoming.Blocks() {
362349
keys = append(keys, block.Key())
363350
}
364-
bs.cancelBlocks(ctx, keys)
365351

366-
// TODO: consider changing this function to not return anything
367-
return "", nil
352+
bs.cancelBlocks(ctx, keys)
353+
return nil
368354
}
369355

370356
// Connected/Disconnected warns bitswap about peer connections
@@ -391,14 +377,24 @@ func (bs *Bitswap) cancelBlocks(ctx context.Context, bkeys []u.Key) {
391377
message := bsmsg.New()
392378
message.SetFull(false)
393379
for _, k := range bkeys {
380+
log.Debug("cancel block: %s", k)
394381
message.Cancel(k)
395382
}
383+
384+
wg := sync.WaitGroup{}
396385
for _, p := range bs.engine.Peers() {
397-
err := bs.send(ctx, p, message)
398-
if err != nil {
399-
log.Debugf("Error sending message: %s", err)
400-
}
386+
wg.Add(1)
387+
go func(p peer.ID) {
388+
defer wg.Done()
389+
err := bs.send(ctx, p, message)
390+
if err != nil {
391+
log.Warningf("Error sending message: %s", err)
392+
return
393+
}
394+
}(p)
401395
}
396+
wg.Wait()
397+
return
402398
}
403399

404400
func (bs *Bitswap) wantNewBlocks(ctx context.Context, bkeys []u.Key) {

exchange/bitswap/network/interface.go

+3-8
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,6 @@ type BitSwapNetwork interface {
1919
peer.ID,
2020
bsmsg.BitSwapMessage) error
2121

22-
// SendRequest sends a BitSwap message to a peer and waits for a response.
23-
SendRequest(
24-
context.Context,
25-
peer.ID,
26-
bsmsg.BitSwapMessage) (incoming bsmsg.BitSwapMessage, err error)
27-
2822
// SetDelegate registers the Reciver to handle messages received from the
2923
// network.
3024
SetDelegate(Receiver)
@@ -35,8 +29,9 @@ type BitSwapNetwork interface {
3529
// Implement Receiver to receive messages from the BitSwapNetwork
3630
type Receiver interface {
3731
ReceiveMessage(
38-
ctx context.Context, sender peer.ID, incoming bsmsg.BitSwapMessage) (
39-
destination peer.ID, outgoing bsmsg.BitSwapMessage)
32+
ctx context.Context,
33+
sender peer.ID,
34+
incoming bsmsg.BitSwapMessage) error
4035

4136
ReceiveError(error)
4237

exchange/bitswap/testnet/network_test.go

+8-62
Original file line numberDiff line numberDiff line change
@@ -14,57 +14,6 @@ import (
1414
testutil "github.com/ipfs/go-ipfs/util/testutil"
1515
)
1616

17-
func TestSendRequestToCooperativePeer(t *testing.T) {
18-
net := VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0))
19-
20-
recipientPeer := testutil.RandIdentityOrFatal(t)
21-
22-
t.Log("Get two network adapters")
23-
24-
initiator := net.Adapter(testutil.RandIdentityOrFatal(t))
25-
recipient := net.Adapter(recipientPeer)
26-
27-
expectedStr := "response from recipient"
28-
recipient.SetDelegate(lambda(func(
29-
ctx context.Context,
30-
from peer.ID,
31-
incoming bsmsg.BitSwapMessage) (
32-
peer.ID, bsmsg.BitSwapMessage) {
33-
34-
t.Log("Recipient received a message from the network")
35-
36-
// TODO test contents of incoming message
37-
38-
m := bsmsg.New()
39-
m.AddBlock(blocks.NewBlock([]byte(expectedStr)))
40-
41-
return from, m
42-
}))
43-
44-
t.Log("Build a message and send a synchronous request to recipient")
45-
46-
message := bsmsg.New()
47-
message.AddBlock(blocks.NewBlock([]byte("data")))
48-
response, err := initiator.SendRequest(
49-
context.Background(), recipientPeer.ID(), message)
50-
if err != nil {
51-
t.Fatal(err)
52-
}
53-
54-
t.Log("Check the contents of the response from recipient")
55-
56-
if response == nil {
57-
t.Fatal("Should have received a response")
58-
}
59-
60-
for _, blockFromRecipient := range response.Blocks() {
61-
if string(blockFromRecipient.Data) == expectedStr {
62-
return
63-
}
64-
}
65-
t.Fatal("Should have returned after finding expected block data")
66-
}
67-
6817
func TestSendMessageAsyncButWaitForResponse(t *testing.T) {
6918
net := VirtualNetwork(mockrouting.NewServer(), delay.Fixed(0))
7019
responderPeer := testutil.RandIdentityOrFatal(t)
@@ -80,20 +29,19 @@ func TestSendMessageAsyncButWaitForResponse(t *testing.T) {
8029
responder.SetDelegate(lambda(func(
8130
ctx context.Context,
8231
fromWaiter peer.ID,
83-
msgFromWaiter bsmsg.BitSwapMessage) (
84-
peer.ID, bsmsg.BitSwapMessage) {
32+
msgFromWaiter bsmsg.BitSwapMessage) error {
8533

8634
msgToWaiter := bsmsg.New()
8735
msgToWaiter.AddBlock(blocks.NewBlock([]byte(expectedStr)))
36+
waiter.SendMessage(ctx, fromWaiter, msgToWaiter)
8837

89-
return fromWaiter, msgToWaiter
38+
return nil
9039
}))
9140

9241
waiter.SetDelegate(lambda(func(
9342
ctx context.Context,
9443
fromResponder peer.ID,
95-
msgFromResponder bsmsg.BitSwapMessage) (
96-
peer.ID, bsmsg.BitSwapMessage) {
44+
msgFromResponder bsmsg.BitSwapMessage) error {
9745

9846
// TODO assert that this came from the correct peer and that the message contents are as expected
9947
ok := false
@@ -108,7 +56,7 @@ func TestSendMessageAsyncButWaitForResponse(t *testing.T) {
10856
t.Fatal("Message not received from the responder")
10957

11058
}
111-
return "", nil
59+
return nil
11260
}))
11361

11462
messageSentAsync := bsmsg.New()
@@ -123,7 +71,7 @@ func TestSendMessageAsyncButWaitForResponse(t *testing.T) {
12371
}
12472

12573
type receiverFunc func(ctx context.Context, p peer.ID,
126-
incoming bsmsg.BitSwapMessage) (peer.ID, bsmsg.BitSwapMessage)
74+
incoming bsmsg.BitSwapMessage) error
12775

12876
// lambda returns a Receiver instance given a receiver function
12977
func lambda(f receiverFunc) bsnet.Receiver {
@@ -133,13 +81,11 @@ func lambda(f receiverFunc) bsnet.Receiver {
13381
}
13482

13583
type lambdaImpl struct {
136-
f func(ctx context.Context, p peer.ID, incoming bsmsg.BitSwapMessage) (
137-
peer.ID, bsmsg.BitSwapMessage)
84+
f func(ctx context.Context, p peer.ID, incoming bsmsg.BitSwapMessage) error
13885
}
13986

14087
func (lam *lambdaImpl) ReceiveMessage(ctx context.Context,
141-
p peer.ID, incoming bsmsg.BitSwapMessage) (
142-
peer.ID, bsmsg.BitSwapMessage) {
88+
p peer.ID, incoming bsmsg.BitSwapMessage) error {
14389
return lam.f(ctx, p, incoming)
14490
}
14591

exchange/bitswap/testnet/virtual.go

+1-62
Original file line numberDiff line numberDiff line change
@@ -72,61 +72,7 @@ func (n *network) deliver(
7272

7373
n.delay.Wait()
7474

75-
nextPeer, nextMsg := r.ReceiveMessage(context.TODO(), from, message)
76-
77-
if (nextPeer == "" && nextMsg != nil) || (nextMsg == nil && nextPeer != "") {
78-
return errors.New("Malformed client request")
79-
}
80-
81-
if nextPeer == "" && nextMsg == nil { // no response to send
82-
return nil
83-
}
84-
85-
nextReceiver, ok := n.clients[nextPeer]
86-
if !ok {
87-
return errors.New("Cannot locate peer on network")
88-
}
89-
go n.deliver(nextReceiver, nextPeer, nextMsg)
90-
return nil
91-
}
92-
93-
// TODO
94-
func (n *network) SendRequest(
95-
ctx context.Context,
96-
from peer.ID,
97-
to peer.ID,
98-
message bsmsg.BitSwapMessage) (
99-
incoming bsmsg.BitSwapMessage, err error) {
100-
101-
r, ok := n.clients[to]
102-
if !ok {
103-
return nil, errors.New("Cannot locate peer on network")
104-
}
105-
nextPeer, nextMsg := r.ReceiveMessage(context.TODO(), from, message)
106-
107-
// TODO dedupe code
108-
if (nextPeer == "" && nextMsg != nil) || (nextMsg == nil && nextPeer != "") {
109-
r.ReceiveError(errors.New("Malformed client request"))
110-
return nil, nil
111-
}
112-
113-
// TODO dedupe code
114-
if nextPeer == "" && nextMsg == nil {
115-
return nil, nil
116-
}
117-
118-
// TODO test when receiver doesn't immediately respond to the initiator of the request
119-
if nextPeer != from {
120-
go func() {
121-
nextReceiver, ok := n.clients[nextPeer]
122-
if !ok {
123-
// TODO log the error?
124-
}
125-
n.deliver(nextReceiver, nextPeer, nextMsg)
126-
}()
127-
return nil, nil
128-
}
129-
return nextMsg, nil
75+
return r.ReceiveMessage(context.TODO(), from, message)
13076
}
13177

13278
type networkClient struct {
@@ -143,13 +89,6 @@ func (nc *networkClient) SendMessage(
14389
return nc.network.SendMessage(ctx, nc.local, to, message)
14490
}
14591

146-
func (nc *networkClient) SendRequest(
147-
ctx context.Context,
148-
to peer.ID,
149-
message bsmsg.BitSwapMessage) (incoming bsmsg.BitSwapMessage, err error) {
150-
return nc.network.SendRequest(ctx, nc.local, to, message)
151-
}
152-
15392
// FindProvidersAsync returns a channel of providers for the given key
15493
func (nc *networkClient) FindProvidersAsync(ctx context.Context, k util.Key, max int) <-chan peer.ID {
15594

importer/helpers/helpers.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var BlockSizeLimit = 1048576 // 1 MB
1818
// rough estimates on expected sizes
1919
var roughDataBlockSize = chunk.DefaultBlockSize
2020
var roughLinkBlockSize = 1 << 13 // 8KB
21-
var roughLinkSize = 258 + 8 + 5 // sha256 multihash + size + no name + protobuf framing
21+
var roughLinkSize = 34 + 8 + 5 // sha256 multihash + size + no name + protobuf framing
2222

2323
// DefaultLinksPerBlock governs how the importer decides how many links there
2424
// will be per block. This calculation is based on expected distributions of:

p2p/crypto/secio/protocol.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ func (s *secureSession) handshake(ctx context.Context, insecure io.ReadWriter) e
144144
// =============================================================================
145145
// step 1.2 Selection -- select/agree on best encryption parameters
146146

147-
// to determine order, use cmp(H(lr||rpk), H(rr||lpk)).
147+
// to determine order, use cmp(H(remote_pubkey||local_rand), H(local_pubkey||remote_rand)).
148148
oh1 := u.Hash(append(proposeIn.GetPubkey(), nonceOut...))
149149
oh2 := u.Hash(append(myPubKeyBytes, proposeIn.GetRand()...))
150150
order := bytes.Compare(oh1, oh2)
@@ -203,7 +203,7 @@ func (s *secureSession) handshake(ctx context.Context, insecure io.ReadWriter) e
203203
return err
204204
}
205205

206-
// Receive + Parse their Propose packet and generate an Exchange packet.
206+
// Receive + Parse their Exchange packet.
207207
exchangeIn := new(pb.Exchange)
208208
if _, err := readMsgCtx(ctx, s.insecureM, exchangeIn); err != nil {
209209
return err
@@ -278,7 +278,7 @@ func (s *secureSession) handshake(ctx context.Context, insecure io.ReadWriter) e
278278
// log.Debug("2.3 mac + cipher.")
279279

280280
// =============================================================================
281-
// step 3. Finish -- send expected message (the nonces), verify encryption works
281+
// step 3. Finish -- send expected message to verify encryption works (send local nonce)
282282

283283
// setup ETM ReadWriter
284284
w := NewETMWriter(s.insecure, s.local.cipher, s.local.mac)

test/sharness/t0040-add-and-cat.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ test_expect_success EXPENSIVE "ipfs add bigfile succeeds" '
138138
'
139139

140140
test_expect_success EXPENSIVE "ipfs add bigfile output looks good" '
141-
HASH="QmSVxWkYfbJ3cowQUUgF4iF4CQd92vubxw7bs2aZAVRUD9" &&
141+
HASH="QmU9SWAPPmNEKZB8umYMmjYvN7VyHqABNvdA6GUi4MMEz3" &&
142142
echo "added $HASH mountdir/bigfile" >expected &&
143143
test_cmp expected actual
144144
'

0 commit comments

Comments
 (0)