Skip to content

Commit dd9bf75

Browse files
mvdanrvagg
authored andcommitted
feat(net): to/from ipld bindnode types, more cbor protoc improvements
1 parent 99c2970 commit dd9bf75

11 files changed

Lines changed: 606 additions & 427 deletions

File tree

go.mod

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.16
44

55
require (
66
github.com/google/uuid v1.3.0
7+
github.com/google/go-cmp v0.5.6
78
github.com/hannahhoward/cbor-gen-for v0.0.0-20200817222906-ea96cece81f1
89
github.com/hannahhoward/go-pubsub v0.0.0-20200423002714-8d62886cc36e
910
github.com/ipfs/go-block-format v0.0.3
@@ -26,7 +27,7 @@ require (
2627
github.com/ipfs/go-peertaskqueue v0.7.1
2728
github.com/ipfs/go-unixfs v0.2.4
2829
github.com/ipld/go-codec-dagpb v1.3.0
29-
github.com/ipld/go-ipld-prime v0.14.4-0.20220110161855-fc09d6b768e9
30+
github.com/ipld/go-ipld-prime v0.14.4
3031
github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c
3132
github.com/libp2p/go-buffer-pool v0.0.2
3233
github.com/libp2p/go-libp2p v0.16.0
@@ -45,5 +46,3 @@ require (
4546
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1
4647
google.golang.org/protobuf v1.27.1
4748
)
48-
49-
replace github.com/ipld/go-ipld-prime => ../../ipld/go-ipld-prime

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -457,8 +457,8 @@ github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSat
457457
github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA=
458458
github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8=
459459
github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8=
460-
github.com/ipld/go-ipld-prime v0.14.4-0.20220110161855-fc09d6b768e9 h1:fqQSvdPznhyE5jZoCwbvykHbK+QukxJcS1SFWbj9ig0=
461-
github.com/ipld/go-ipld-prime v0.14.4-0.20220110161855-fc09d6b768e9/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0=
460+
github.com/ipld/go-ipld-prime v0.14.4 h1:bqhmume8+nbNsX4/+J6eohktfZHAI8GKrF3rQ0xgOyc=
461+
github.com/ipld/go-ipld-prime v0.14.4/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0=
462462
github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA=
463463
github.com/jackpal/go-nat-pmp v1.0.1/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
464464
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=

message/bench_test.go

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
1-
package message_test
1+
package message
22

33
import (
44
"bytes"
55
"math/rand"
6+
"reflect"
67
"testing"
78

9+
"github.com/google/go-cmp/cmp"
810
blocks "github.com/ipfs/go-block-format"
911
"github.com/ipfs/go-graphsync"
10-
"github.com/ipfs/go-graphsync/message"
12+
"github.com/ipfs/go-graphsync/message/ipldbind"
1113
"github.com/ipfs/go-graphsync/testutil"
1214
"github.com/ipld/go-ipld-prime/codec/dagcbor"
1315
"github.com/ipld/go-ipld-prime/node/basicnode"
@@ -21,16 +23,17 @@ func BenchmarkMessageEncodingRoundtrip(b *testing.B) {
2123
ssb := builder.NewSelectorSpecBuilder(basicnode.Prototype.Any)
2224
selector := ssb.Matcher().Node()
2325
extensionName := graphsync.ExtensionName("graphsync/awesome")
24-
extension := message.NamedExtension{
26+
extension := graphsync.ExtensionData{
2527
Name: extensionName,
26-
Data: basicnode.NewBytes(testutil.RandomBytes(100)),
28+
Data: testutil.RandomBytes(100),
2729
}
2830
id := graphsync.NewRequestID()
2931
priority := graphsync.Priority(rand.Int31())
3032
status := graphsync.RequestAcknowledged
3133

32-
builder := message.NewBuilder()
33-
builder.AddRequest(message.NewRequest(id, root, selector, priority, extension))
34+
builder := NewBuilder()
35+
builder.AddRequest(NewRequest(id, root, selector, priority, extension))
36+
builder.AddRequest(NewRequest(id, root, selector, priority))
3437
builder.AddResponseCode(id, status)
3538
builder.AddExtensionData(id, extension)
3639
builder.AddBlock(blocks.NewBlock([]byte("W")))
@@ -48,12 +51,17 @@ func BenchmarkMessageEncodingRoundtrip(b *testing.B) {
4851
for pb.Next() {
4952
buf.Reset()
5053

51-
err := message.NewMessageHandler().ToNet(gsm, buf)
54+
err := NewMessageHandler().ToNet(gsm, buf)
5255
require.NoError(b, err)
5356

54-
gsm2, err := message.NewMessageHandler().FromNet(buf)
57+
gsm2, err := NewMessageHandler().FromNet(buf)
5558
require.NoError(b, err)
56-
require.Equal(b, gsm, gsm2)
59+
60+
// Note that require.Equal doesn't seem to handle maps well.
61+
// It says they are non-equal simply because their order isn't deterministic.
62+
if diff := cmp.Diff(gsm, gsm2, cmp.Exporter(func(reflect.Type) bool { return true })); diff != "" {
63+
b.Fatal(diff)
64+
}
5765
}
5866
})
5967
})
@@ -65,16 +73,24 @@ func BenchmarkMessageEncodingRoundtrip(b *testing.B) {
6573
for pb.Next() {
6674
buf.Reset()
6775

68-
node := bindnode.Wrap(&gsm, message.Prototype.Message.Type())
69-
err := dagcbor.Encode(node.Representation(), buf)
76+
ipldGSM, err := gsm.ToIPLD()
77+
require.NoError(b, err)
78+
node := bindnode.Wrap(ipldGSM, ipldbind.Prototype.Message.Type())
79+
err = dagcbor.Encode(node.Representation(), buf)
7080
require.NoError(b, err)
7181

72-
builder := message.Prototype.Message.Representation().NewBuilder()
82+
builder := ipldbind.Prototype.Message.Representation().NewBuilder()
7383
err = dagcbor.Decode(builder, buf)
7484
require.NoError(b, err)
7585
node2 := builder.Build()
76-
gsm2 := *bindnode.Unwrap(node2).(*message.GraphSyncMessage)
77-
require.Equal(b, gsm, gsm2)
86+
ipldGSM2 := bindnode.Unwrap(node2).(*ipldbind.GraphSyncMessage)
87+
gsm2, err := messageFromIPLD(ipldGSM2)
88+
require.NoError(b, err)
89+
90+
// same as above.
91+
if diff := cmp.Diff(gsm, gsm2, cmp.Exporter(func(reflect.Type) bool { return true })); diff != "" {
92+
b.Fatal(diff)
93+
}
7894
}
7995
})
8096
})

message/builder.go

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,9 @@ package message
22

33
import (
44
blocks "github.com/ipfs/go-block-format"
5-
cid "github.com/ipfs/go-cid"
5+
"github.com/ipfs/go-cid"
66
"github.com/ipld/go-ipld-prime"
77
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
8-
"github.com/ipld/go-ipld-prime/node/basicnode"
98

109
"github.com/ipfs/go-graphsync"
1110
"github.com/ipfs/go-graphsync/metadata"
@@ -19,7 +18,7 @@ type Builder struct {
1918
blkSize uint64
2019
completedResponses map[graphsync.RequestID]graphsync.ResponseStatusCode
2120
outgoingResponses map[graphsync.RequestID]metadata.Metadata
22-
extensions map[graphsync.RequestID][]NamedExtension
21+
extensions map[graphsync.RequestID][]graphsync.ExtensionData
2322
requests map[graphsync.RequestID]GraphSyncRequest
2423
}
2524

@@ -30,13 +29,13 @@ func NewBuilder() *Builder {
3029
outgoingBlocks: make(map[cid.Cid]blocks.Block),
3130
completedResponses: make(map[graphsync.RequestID]graphsync.ResponseStatusCode),
3231
outgoingResponses: make(map[graphsync.RequestID]metadata.Metadata),
33-
extensions: make(map[graphsync.RequestID][]NamedExtension),
32+
extensions: make(map[graphsync.RequestID][]graphsync.ExtensionData),
3433
}
3534
}
3635

3736
// AddRequest registers a new request to be added to the message.
3837
func (b *Builder) AddRequest(request GraphSyncRequest) {
39-
b.requests[request.ID] = request
38+
b.requests[request.ID()] = request
4039
}
4140

4241
// AddBlock adds the given block to the message.
@@ -46,7 +45,7 @@ func (b *Builder) AddBlock(block blocks.Block) {
4645
}
4746

4847
// AddExtensionData adds the given extension data to to the message
49-
func (b *Builder) AddExtensionData(requestID graphsync.RequestID, extension NamedExtension) {
48+
func (b *Builder) AddExtensionData(requestID graphsync.RequestID, extension graphsync.ExtensionData) {
5049
b.extensions[requestID] = append(b.extensions[requestID], extension)
5150
// make sure this extension goes out in next response even if no links are sent
5251
_, ok := b.outgoingResponses[requestID]
@@ -110,30 +109,21 @@ func (b *Builder) ScrubResponses(requestIDs []graphsync.RequestID) uint64 {
110109

111110
// Build assembles and encodes message data from the added requests, links, and blocks.
112111
func (b *Builder) Build() (GraphSyncMessage, error) {
113-
requests := make([]GraphSyncRequest, 0, len(b.requests))
114-
for _, request := range b.requests {
115-
requests = append(requests, request)
116-
}
117-
responses := make([]GraphSyncResponse, 0, len(b.outgoingResponses))
112+
responses := make(map[graphsync.RequestID]GraphSyncResponse, len(b.outgoingResponses))
118113
for requestID, linkMap := range b.outgoingResponses {
119114
mdRaw, err := metadata.EncodeMetadata(linkMap)
120115
if err != nil {
121116
return GraphSyncMessage{}, err
122117
}
123-
b.extensions[requestID] = append(b.extensions[requestID], NamedExtension{
118+
b.extensions[requestID] = append(b.extensions[requestID], graphsync.ExtensionData{
124119
Name: graphsync.ExtensionMetadata,
125-
Data: basicnode.NewBytes(mdRaw), // TODO: likely wrong
120+
Data: mdRaw,
126121
})
127122
status, isComplete := b.completedResponses[requestID]
128-
responses = append(responses, NewResponse(requestID, responseCode(status, isComplete), b.extensions[requestID]...))
129-
}
130-
blocks := make([]GraphSyncBlock, 0, len(b.outgoingBlocks))
131-
for _, block := range b.outgoingBlocks {
132-
blocks = append(blocks, FromBlockFormat(block))
123+
responses[requestID] = NewResponse(requestID, responseCode(status, isComplete), b.extensions[requestID]...)
133124
}
134-
// TODO: sort requests, responses, and blocks? map order is randomized
135125
return GraphSyncMessage{
136-
requests, responses, blocks,
126+
b.requests, responses, b.outgoingBlocks,
137127
}, nil
138128
}
139129

0 commit comments

Comments
 (0)