Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature] UUIDs, protocol versioning, v2 protocol w/ dag-cbor messaging #332

Merged
merged 32 commits into from
Feb 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
f330fe8
feat(net): initial dag-cbor protocol support
mvdan Dec 17, 2021
480fcf5
feat(requestid): use uuids for requestids
rvagg Dec 13, 2021
cf6009a
fix(requestmanager): make collect test requests with uuids sortable
rvagg Dec 14, 2021
af9dd52
fix(requestid): print requestids as string uuids in logs
rvagg Dec 14, 2021
a2a87fe
fix(requestid): use string as base type for RequestId
rvagg Dec 15, 2021
d25c6ef
chore(requestid): wrap requestid string in a struct
rvagg Dec 16, 2021
901b2c0
feat(libp2p): add v1.0.0 network compatibility
rvagg Jan 11, 2022
caa4b58
chore(net): resolve most cbor + uuid merge problems
rvagg Jan 13, 2022
8ef2008
feat(net): to/from ipld bindnode types, more cbor protoc improvements
mvdan Jan 13, 2022
ea4a06a
feat(net): introduce 2.0.0 protocol for dag-cbor
rvagg Jan 14, 2022
45b87ff
fix(net): more bindnode dag-cbor protocol fixes
rvagg Jan 14, 2022
c3649f3
chore(metadata): convert metadata to bindnode
rvagg Jan 24, 2022
cb45833
chore(net,extensions): wire up IPLD extensions, expose as Node instea…
rvagg Jan 25, 2022
9c08dd0
fix(src): fix imports
rvagg Jan 25, 2022
989cf66
fix(mod): clean up go.mod
rvagg Jan 25, 2022
fc58e23
fix(net): refactor message version format code to separate packages
rvagg Jan 25, 2022
161a577
feat(net): activate v2 network as default
rvagg Jan 25, 2022
e997ff3
fix(src): build error
rvagg Jan 25, 2022
4e57d92
chore: remove GraphSyncMessage#Loggable
rvagg Jan 31, 2022
6b86c3c
chore: remove intermediate v1.1 pb protocol message type
rvagg Jan 31, 2022
eb16b27
fix: clarify comments re dag-cbor extension data
rvagg Feb 2, 2022
83c3860
feat: new LinkMetadata iface, integrate metadata into Response type (…
rvagg Feb 4, 2022
21a4546
fix: avoid double-encode for extension size estimation
rvagg Feb 2, 2022
ff4d7ad
feat(requesttype): introduce RequestType enum to replace cancel&updat…
rvagg Feb 4, 2022
586931b
fix(metadata): extend round-trip tests to byte representation (#350)
rvagg Feb 4, 2022
259905a
feat!(messagev2): tweak dag-cbor message schema (#354)
rvagg Feb 11, 2022
e66b39d
feat(graphsync): unify req & resp Pause, Unpause & Cancel by RequestI…
rvagg Feb 16, 2022
e27c827
feat: SendUpdates() API to send only extension data to via existing r…
rvagg Feb 14, 2022
8106555
fix(responsemanager): send update while completing
hannahhoward Feb 16, 2022
db297c1
fix(requestmanager): revert change to pointer type
hannahhoward Feb 17, 2022
f6a08b5
Refactor async loading for simplicity and correctness (#356)
hannahhoward Feb 18, 2022
c938c6b
fix(requestmanager): update test for rebase
hannahhoward Feb 18, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion benchmarks/testnet/virtual.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"google.golang.org/protobuf/proto"

gsmsg "github.com/ipfs/go-graphsync/message"
gsmsgv1 "github.com/ipfs/go-graphsync/message/v1"
gsnet "github.com/ipfs/go-graphsync/network"
)

Expand Down Expand Up @@ -137,7 +138,7 @@ func (n *network) SendMessage(
rateLimiters[to] = rateLimiter
}

pbMsg, err := mes.ToProto()
pbMsg, err := gsmsgv1.NewMessageHandler().ToProto(peer.ID("foo"), mes)
if err != nil {
return err
}
Expand Down
16 changes: 7 additions & 9 deletions cidset/cidset.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,32 +4,30 @@ import (
"errors"

"github.com/ipfs/go-cid"
"github.com/ipld/go-ipld-prime/datamodel"
"github.com/ipld/go-ipld-prime/fluent"
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
"github.com/ipld/go-ipld-prime/node/basicnode"

"github.com/ipfs/go-graphsync/ipldutil"
)

// EncodeCidSet encodes a cid set into bytes for the do-no-send-cids extension
func EncodeCidSet(cids *cid.Set) ([]byte, error) {
func EncodeCidSet(cids *cid.Set) datamodel.Node {
list := fluent.MustBuildList(basicnode.Prototype.List, int64(cids.Len()), func(la fluent.ListAssembler) {
_ = cids.ForEach(func(c cid.Cid) error {
la.AssembleValue().AssignLink(cidlink.Link{Cid: c})
return nil
})
})
return ipldutil.EncodeNode(list)
return list
}

// DecodeCidSet decode a cid set from data for the do-no-send-cids extension
func DecodeCidSet(data []byte) (*cid.Set, error) {
list, err := ipldutil.DecodeNode(data)
if err != nil {
return nil, err
func DecodeCidSet(data datamodel.Node) (*cid.Set, error) {
if data.Kind() != datamodel.Kind_List {
return nil, errors.New("did not receive a list of CIDs")
}
set := cid.NewSet()
iter := list.ListIterator()
iter := data.ListIterator()
for !iter.Done() {
_, next, err := iter.Next()
if err != nil {
Expand Down
3 changes: 1 addition & 2 deletions cidset/cidset_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@ func TestDecodeEncodeCidSet(t *testing.T) {
for _, c := range cids {
set.Add(c)
}
encoded, err := EncodeCidSet(set)
require.NoError(t, err, "encode errored")
encoded := EncodeCidSet(set)
decodedCidSet, err := DecodeCidSet(encoded)
require.NoError(t, err, "decode errored")
require.Equal(t, decodedCidSet.Len(), set.Len())
Expand Down
16 changes: 5 additions & 11 deletions dedupkey/dedupkey.go
Original file line number Diff line number Diff line change
@@ -1,27 +1,21 @@
package dedupkey

import (
"github.com/ipld/go-ipld-prime/datamodel"
"github.com/ipld/go-ipld-prime/node/basicnode"

"github.com/ipfs/go-graphsync/ipldutil"
)

// EncodeDedupKey returns encoded cbor data for string key
func EncodeDedupKey(key string) ([]byte, error) {
func EncodeDedupKey(key string) (datamodel.Node, error) {
nb := basicnode.Prototype.String.NewBuilder()
err := nb.AssignString(key)
if err != nil {
return nil, err
}
nd := nb.Build()
return ipldutil.EncodeNode(nd)
return nb.Build(), nil
}

// DecodeDedupKey returns a string key decoded from cbor data
func DecodeDedupKey(data []byte) (string, error) {
nd, err := ipldutil.DecodeNode(data)
if err != nil {
return "", err
}
return nd.AsString()
func DecodeDedupKey(data datamodel.Node) (string, error) {
return data.AsString()
}
Binary file removed docs/async-loading.png
Binary file not shown.
75 changes: 0 additions & 75 deletions docs/async-loading.puml

This file was deleted.

Binary file modified docs/processes.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
21 changes: 11 additions & 10 deletions docs/processes.puml
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,17 @@ partition "Top Level Interface" {
if (operation type) then (outgoing request or incoming response)
partition "Graphsync Requestor Implementation" {
:RequestManager;
if (operation type) then (incoming response)
partition "Verifying Queries" {
partition "Executing Requests" {
:TaskQueue;
fork
:ipld.Traverse;
:Executor;
fork again
:ipld.Traverse;
:Executor;
fork again
:ipld.Traverse;
:Executor;
end fork
}
if (operation type) then (verified responses)
partition "Collecting Responses" {
fork
:Response Collector;
Expand All @@ -33,21 +34,21 @@ end fork
}
:Responses returned to client;
stop
else (outgoing request)
else (request messages)
:Send Request To Network;
endif
}
else (incoming request)
partition "Graphsync Responder Implementation" {
:ResponseManager;
partition "Performing Queries" {
:PeerTaskQueue;
:TaskQueue;
fork
:ipld.Traverse;
:QueryExecutor;
fork again
:ipld.Traverse;
:QueryExecutor;
fork again
:ipld.Traverse;
:QueryExecutor;
end fork
}
}
Expand Down
Binary file added docs/request-execution.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
102 changes: 102 additions & 0 deletions docs/request-execution.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
@startuml Request Execution
participant "GraphSync\nTop Level\nInterface" as TLI
participant RequestManager
participant TaskQueue
participant RequestExecutor as RE
participant ReconciledLoader
participant TraversalRecord
participant Verifier
participant LocalStorage
participant Traverser
participant Network

== Initialization ==

TLI -> RequestManager ** : Setup
TLI -> RE ** : Setup
TLI -> TaskQueue ** : Setup

== Executing A Request ==

par
note over TLI : Request Initiation
TLI -> RequestManager : New Request
RequestManager -> RequestManager : Create Request Context
RequestManager -> TaskQueue : Push Request
else
note over RE: Request Execution
TaskQueue -> RE : Next Request\nTo Process
RE -> RequestManager : Initiate request execution
RequestManager -> Traverser ** : Create to manage selector traversal
RequestManager -> ReconciledLoader ** : create to manage
RequestManager -> RE : Traverser + ReconciledLoader
note over RE: Local loading phase
loop until traversal complete, request context cancelled, or missing block locally
Traverser -> RE : Request to load blocks\nto perform traversal
RE -> ReconciledLoader : Load next block
ReconciledLoader -> LocalStorage : Load Block
LocalStorage --> ReconciledLoader : Block or missing
ReconciledLoader -> TraversalRecord : Record link traversal
TraversalRecord --> ReconciledLoader
ReconciledLoader --> RE : Block or missing
opt block is present
RE --> Traverser : Next block to load
end
end
RE -> Network : Send Graphsync Request
RE -> ReconciledLoader : remote online
ReconciledLoader -> Verifier ** : Create new from traversal record
ReconciledLoader -> RE
note over RE: Remote loading phase
loop until traversal complete, request context cancelled, or missing block locally
Traverser -> RE : Request to load blocks\nto perform traversal
RE -> ReconciledLoader : Load next block
alt on missing path for remote
ReconciledLoader -> LocalStorage : Load Block
LocalStorage --> ReconciledLoader : Block or missing
else
loop until block loaded, missing, or error
opt new remote responses
alt verification not done
ReconciledLoader -> Verifier : verify next response
alt success
Verifier --> ReconciledLoader : verified
ReconciledLoader -> ReconciledLoader : wait for more responses
else failure
Verifier --> ReconciledLoader : error
end
else verification done
alt next response matches current block load

alt next response contains a block
ReconciledLoader -> LocalStorage : store remote block
LocalStorage --> ReconciledLoader
ReconciledLoader -> ReconciledLoader : block laoded from remote
else next response does not contain block
opt next response is missing
ReconciledLoader -> ReconciledLoader : record missing path
end
ReconciledLoader -> LocalStorage : load block
LocalStorage --> ReconciledLoader : block or missing
end
else next response doesn not match
ReconciledLoader -> ReconciledLoader : error
end
end
end
opt remote goes offline
ReconciledLoader -> LocalStorage : load block
LocalStorage --> ReconciledLoader : block or missing
end
end
ReconciledLoader -> TraversalRecord : Record link traversal
TraversalRecord --> ReconciledLoader
ReconciledLoader --> RE : Block, missing or error
RE -> Traverser : Next block to load
end
end
else
Network -> RequestManager : New Responses
RequestManager -> ReconciledLoader : Ingest Responses
end
@enduml
Loading