Skip to content

Commit

Permalink
feat(requesttype): introduce RequestType enum to replace cancel&updat…
Browse files Browse the repository at this point in the history
…e bools (#352)

Closes: #345
  • Loading branch information
rvagg authored Feb 4, 2022
1 parent 21a4546 commit ff4d7ad
Show file tree
Hide file tree
Showing 14 changed files with 107 additions and 101 deletions.
15 changes: 14 additions & 1 deletion graphsync.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,9 +171,22 @@ type RequestData interface {
Extension(name ExtensionName) (datamodel.Node, bool)

// IsCancel returns true if this particular request is being cancelled
IsCancel() bool
Type() RequestType
}

type RequestType string

const (
// RequestTypeNew means a new request
RequestTypeNew = RequestType("New")

// RequestTypeCancel means cancel the request referenced by request ID
RequestTypeCancel = RequestType("Cancel")

// RequestTypeUpdate means the extensions contain an update about this request
RequestTypeUpdate = RequestType("Update")
)

// ResponseData describes a received Graphsync response
type ResponseData interface {
// RequestID returns the request ID for this response
Expand Down
11 changes: 5 additions & 6 deletions message/ipldbind/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,11 @@ func (gse GraphSyncExtensions) ToExtensionsList() []graphsync.ExtensionData {
type GraphSyncRequest struct {
Id []byte

Root *cid.Cid
Selector *datamodel.Node
Extensions GraphSyncExtensions
Priority graphsync.Priority
Cancel bool
Update bool
Root *cid.Cid
Selector *datamodel.Node
Extensions GraphSyncExtensions
Priority graphsync.Priority
RequestType graphsync.RequestType
}

// GraphSyncResponse is an struct to capture data on a response sent back
Expand Down
25 changes: 18 additions & 7 deletions message/ipldbind/schema.ipldsch
Original file line number Diff line number Diff line change
Expand Up @@ -50,14 +50,25 @@ type GraphSyncResponseStatusCode enum {
| RequestCancelled ("35")
} representation int

type GraphSyncRequestType enum {
# New means a new request
| New ("n")
# Cancel means cancel the request referenced by request ID
| Cancel ("c")
# Update means the extensions contain an update about this request
| Update ("u")
# Restart means restart this request from the begging, respecting the any DoNotSendCids/DoNotSendBlocks contained
# in the extensions -- essentially a cancel followed by a new
# TODO: | Restart ("r")
} representation string

type GraphSyncRequest struct {
id GraphSyncRequestID (rename "ID") # unique id set on the requester side
root optional Link (rename "Root") # a CID for the root node in the query
selector optional Any (rename "Sel") # see https://github.com/ipld/specs/blob/master/selectors/selectors.md
extensions GraphSyncExtensions (rename "Ext") # side channel information
priority GraphSyncPriority (rename "Pri") # the priority (normalized). default to 1
cancel Bool (rename "Canc") # whether this cancels a request
update Bool (rename "Updt") # whether this is an update to an in progress request
id GraphSyncRequestID (rename "ID") # unique id set on the requester side
root optional Link (rename "Root") # a CID for the root node in the query
selector optional Any (rename "Sel") # see https://github.com/ipld/specs/blob/master/selectors/selectors.md
extensions GraphSyncExtensions (rename "Ext") # side channel information
priority GraphSyncPriority (rename "Pri") # the priority (normalized). default to 1
requestType GraphSyncRequestType (rename "Typ") # the request type
} representation map

type GraphSyncResponse struct {
Expand Down
51 changes: 22 additions & 29 deletions message/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,13 +35,12 @@ type MessagePartWithExtensions interface {
// GraphSyncRequest is a struct to capture data on a request contained in a
// GraphSyncMessage.
type GraphSyncRequest struct {
root cid.Cid
selector ipld.Node
priority graphsync.Priority
id graphsync.RequestID
extensions map[string]datamodel.Node
isCancel bool
isUpdate bool
root cid.Cid
selector ipld.Node
priority graphsync.Priority
id graphsync.RequestID
extensions map[string]datamodel.Node
requestType graphsync.RequestType
}

// String returns a human-readable form of a GraphSyncRequest
Expand All @@ -57,13 +56,12 @@ func (gsr GraphSyncRequest) String() string {
extStr.WriteString(string(name))
extStr.WriteString("|")
}
return fmt.Sprintf("GraphSyncRequest<root=%s, selector=%s, priority=%d, id=%s, cancel=%v, update=%v, exts=%s>",
return fmt.Sprintf("GraphSyncRequest<root=%s, selector=%s, priority=%d, id=%s, type=%v, exts=%s>",
gsr.root.String(),
sel,
gsr.priority,
gsr.id.String(),
gsr.isCancel,
gsr.isUpdate,
gsr.requestType,
extStr.String(),
)
}
Expand Down Expand Up @@ -146,17 +144,17 @@ func NewRequest(id graphsync.RequestID,
priority graphsync.Priority,
extensions ...graphsync.ExtensionData) GraphSyncRequest {

return newRequest(id, root, selector, priority, false, false, toExtensionsMap(extensions))
return newRequest(id, root, selector, priority, graphsync.RequestTypeNew, toExtensionsMap(extensions))
}

// NewCancelRequest request generates a request to cancel an in progress request
func NewCancelRequest(id graphsync.RequestID) GraphSyncRequest {
return newRequest(id, cid.Cid{}, nil, 0, true, false, nil)
return newRequest(id, cid.Cid{}, nil, 0, graphsync.RequestTypeCancel, nil)
}

// NewUpdateRequest generates a new request to update an in progress request with the given extensions
func NewUpdateRequest(id graphsync.RequestID, extensions ...graphsync.ExtensionData) GraphSyncRequest {
return newRequest(id, cid.Cid{}, nil, 0, false, true, toExtensionsMap(extensions))
return newRequest(id, cid.Cid{}, nil, 0, graphsync.RequestTypeUpdate, toExtensionsMap(extensions))
}

// NewLinkMetadata generates a new graphsync.LinkMetadata compatible object,
Expand All @@ -179,18 +177,16 @@ func newRequest(id graphsync.RequestID,
root cid.Cid,
selector ipld.Node,
priority graphsync.Priority,
isCancel bool,
isUpdate bool,
requestType graphsync.RequestType,
extensions map[string]datamodel.Node) GraphSyncRequest {

return GraphSyncRequest{
id: id,
root: root,
selector: selector,
priority: priority,
isCancel: isCancel,
isUpdate: isUpdate,
extensions: extensions,
id: id,
root: root,
selector: selector,
priority: priority,
requestType: requestType,
extensions: extensions,
}
}

Expand Down Expand Up @@ -310,11 +306,8 @@ func (gsr GraphSyncRequest) ExtensionNames() []graphsync.ExtensionName {
return extNames
}

// IsCancel returns true if this particular request is being cancelled
func (gsr GraphSyncRequest) IsCancel() bool { return gsr.isCancel }

// IsUpdate returns true if this particular request is being updated
func (gsr GraphSyncRequest) IsUpdate() bool { return gsr.isUpdate }
// RequestType returns the type of this request (new, cancel, update, etc.)
func (gsr GraphSyncRequest) Type() graphsync.RequestType { return gsr.requestType }

// RequestID returns the request ID for this response
func (gsr GraphSyncResponse) RequestID() graphsync.RequestID { return gsr.requestID }
Expand Down Expand Up @@ -379,7 +372,7 @@ func (gsr GraphSyncRequest) ReplaceExtensions(extensions []graphsync.ExtensionDa
// the result
func (gsr GraphSyncRequest) MergeExtensions(extensions []graphsync.ExtensionData, mergeFunc func(name graphsync.ExtensionName, oldData datamodel.Node, newData datamodel.Node) (datamodel.Node, error)) (GraphSyncRequest, error) {
if gsr.extensions == nil {
return newRequest(gsr.id, gsr.root, gsr.selector, gsr.priority, gsr.isCancel, gsr.isUpdate, toExtensionsMap(extensions)), nil
return newRequest(gsr.id, gsr.root, gsr.selector, gsr.priority, gsr.requestType, toExtensionsMap(extensions)), nil
}
newExtensionMap := toExtensionsMap(extensions)
combinedExtensions := make(map[string]datamodel.Node)
Expand All @@ -403,5 +396,5 @@ func (gsr GraphSyncRequest) MergeExtensions(extensions []graphsync.ExtensionData
}
combinedExtensions[name] = oldData
}
return newRequest(gsr.id, gsr.root, gsr.selector, gsr.priority, gsr.isCancel, gsr.isUpdate, combinedExtensions), nil
return newRequest(gsr.id, gsr.root, gsr.selector, gsr.priority, gsr.requestType, combinedExtensions), nil
}
5 changes: 3 additions & 2 deletions message/v1/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,13 +119,14 @@ func (mh *MessageHandler) ToProto(p peer.ID, gsm message.GraphSyncMessage) (*pb.
if err != nil {
return nil, err
}

pbm.Requests = append(pbm.Requests, &pb.Message_Request{
Id: rid,
Root: request.Root().Bytes(),
Selector: selector,
Priority: int32(request.Priority()),
Cancel: request.IsCancel(),
Update: request.IsUpdate(),
Cancel: request.Type() == graphsync.RequestTypeCancel,
Update: request.Type() == graphsync.RequestTypeUpdate,
Extensions: ext,
})
}
Expand Down
18 changes: 7 additions & 11 deletions message/v1/message_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ func TestAppendingRequests(t *testing.T) {
request := requests[0]
extensionData, found := request.Extension(extensionName)
require.Equal(t, id, request.ID())
require.False(t, request.IsCancel())
require.Equal(t, request.Type(), graphsync.RequestTypeNew)
require.Equal(t, priority, request.Priority())
require.Equal(t, root.String(), request.Root().String())
require.Equal(t, selector, request.Selector())
Expand Down Expand Up @@ -76,8 +76,7 @@ func TestAppendingRequests(t *testing.T) {
deserializedRequest := deserializedRequests[0]
extensionData, found = deserializedRequest.Extension(extensionName)
require.Equal(t, id, deserializedRequest.ID())
require.False(t, deserializedRequest.IsCancel())
require.False(t, deserializedRequest.IsUpdate())
require.Equal(t, deserializedRequest.Type(), graphsync.RequestTypeNew)
require.Equal(t, priority, deserializedRequest.Priority())
require.Equal(t, root.String(), deserializedRequest.Root().String())
require.Equal(t, selector, deserializedRequest.Selector())
Expand Down Expand Up @@ -179,7 +178,7 @@ func TestRequestCancel(t *testing.T) {
require.Len(t, requests, 1, "did not add cancel request")
request := requests[0]
require.Equal(t, id, request.ID())
require.True(t, request.IsCancel())
require.Equal(t, request.Type(), graphsync.RequestTypeCancel)

mh := NewMessageHandler()

Expand All @@ -192,7 +191,7 @@ func TestRequestCancel(t *testing.T) {
require.Len(t, deserializedRequests, 1, "did not add request to deserialized message")
deserializedRequest := deserializedRequests[0]
require.Equal(t, request.ID(), deserializedRequest.ID())
require.Equal(t, request.IsCancel(), deserializedRequest.IsCancel())
require.Equal(t, request.Type(), deserializedRequest.Type())
}

func TestRequestUpdate(t *testing.T) {
Expand All @@ -213,8 +212,7 @@ func TestRequestUpdate(t *testing.T) {
require.Len(t, requests, 1, "did not add cancel request")
request := requests[0]
require.Equal(t, id, request.ID())
require.True(t, request.IsUpdate())
require.False(t, request.IsCancel())
require.Equal(t, request.Type(), graphsync.RequestTypeUpdate)
extensionData, found := request.Extension(extensionName)
require.True(t, found)
require.Equal(t, extension.Data, extensionData)
Expand All @@ -232,8 +230,7 @@ func TestRequestUpdate(t *testing.T) {
deserializedRequest := deserializedRequests[0]
extensionData, found = deserializedRequest.Extension(extensionName)
require.Equal(t, request.ID(), deserializedRequest.ID())
require.Equal(t, request.IsCancel(), deserializedRequest.IsCancel())
require.Equal(t, request.IsUpdate(), deserializedRequest.IsUpdate())
require.Equal(t, request.Type(), deserializedRequest.Type())
require.Equal(t, request.Priority(), deserializedRequest.Priority())
require.Equal(t, request.Root().String(), deserializedRequest.Root().String())
require.Equal(t, request.Selector(), deserializedRequest.Selector())
Expand Down Expand Up @@ -281,8 +278,7 @@ func TestToNetFromNetEquivalency(t *testing.T) {
deserializedRequest := deserializedRequests[0]
extensionData, found := deserializedRequest.Extension(extensionName)
require.Equal(t, request.ID(), deserializedRequest.ID())
require.False(t, deserializedRequest.IsCancel())
require.False(t, deserializedRequest.IsUpdate())
require.Equal(t, deserializedRequest.Type(), graphsync.RequestTypeNew)
require.Equal(t, request.Priority(), deserializedRequest.Priority())
require.Equal(t, request.Root().String(), deserializedRequest.Root().String())
require.Equal(t, request.Selector(), deserializedRequest.Selector())
Expand Down
17 changes: 8 additions & 9 deletions message/v2/message.go
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,12 @@ func (mh *MessageHandler) toIPLD(gsm message.GraphSyncMessage) (*ipldbind.GraphS
rootPtr = nil
}
ibm.Requests = append(ibm.Requests, ipldbind.GraphSyncRequest{
Id: request.ID().Bytes(),
Root: rootPtr,
Selector: selPtr,
Priority: request.Priority(),
Cancel: request.IsCancel(),
Update: request.IsUpdate(),
Extensions: ipldbind.NewGraphSyncExtensions(request),
Id: request.ID().Bytes(),
Root: rootPtr,
Selector: selPtr,
Priority: request.Priority(),
RequestType: request.Type(),
Extensions: ipldbind.NewGraphSyncExtensions(request),
})
}

Expand Down Expand Up @@ -142,12 +141,12 @@ func (mh *MessageHandler) fromIPLD(ibm *ipldbind.GraphSyncMessage) (message.Grap
return message.GraphSyncMessage{}, err
}

if req.Cancel {
if req.RequestType == graphsync.RequestTypeCancel {
requests[id] = message.NewCancelRequest(id)
continue
}

if req.Update {
if req.RequestType == graphsync.RequestTypeUpdate {
requests[id] = message.NewUpdateRequest(id, req.Extensions.ToExtensionsList()...)
continue
}
Expand Down
21 changes: 8 additions & 13 deletions message/v2/message_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ func TestAppendingRequests(t *testing.T) {
request := requests[0]
extensionData, found := request.Extension(extensionName)
require.Equal(t, id, request.ID())
require.False(t, request.IsCancel())
require.Equal(t, request.Type(), graphsync.RequestTypeNew)
require.Equal(t, priority, request.Priority())
require.Equal(t, root.String(), request.Root().String())
require.Equal(t, selector, request.Selector())
Expand All @@ -55,8 +55,7 @@ func TestAppendingRequests(t *testing.T) {

gsrIpld := gsmIpld.Requests[0]
require.Equal(t, priority, gsrIpld.Priority)
require.False(t, gsrIpld.Cancel)
require.False(t, gsrIpld.Update)
require.Equal(t, request.Type(), graphsync.RequestTypeNew)
require.Equal(t, root, *gsrIpld.Root)
require.Equal(t, selector, *gsrIpld.Selector)
require.Equal(t, 1, len(gsrIpld.Extensions.Keys))
Expand All @@ -72,8 +71,7 @@ func TestAppendingRequests(t *testing.T) {
deserializedRequest := deserializedRequests[0]
extensionData, found = deserializedRequest.Extension(extensionName)
require.Equal(t, id, deserializedRequest.ID())
require.False(t, deserializedRequest.IsCancel())
require.False(t, deserializedRequest.IsUpdate())
require.Equal(t, request.Type(), graphsync.RequestTypeNew)
require.Equal(t, priority, deserializedRequest.Priority())
require.Equal(t, root.String(), deserializedRequest.Root().String())
require.Equal(t, selector, deserializedRequest.Selector())
Expand Down Expand Up @@ -174,7 +172,7 @@ func TestRequestCancel(t *testing.T) {
require.Len(t, requests, 1, "did not add cancel request")
request := requests[0]
require.Equal(t, id, request.ID())
require.True(t, request.IsCancel())
require.Equal(t, request.Type(), graphsync.RequestTypeCancel)

mh := NewMessageHandler()

Expand All @@ -187,7 +185,7 @@ func TestRequestCancel(t *testing.T) {
require.Len(t, deserializedRequests, 1, "did not add request to deserialized message")
deserializedRequest := deserializedRequests[0]
require.Equal(t, request.ID(), deserializedRequest.ID())
require.Equal(t, request.IsCancel(), deserializedRequest.IsCancel())
require.Equal(t, request.Type(), deserializedRequest.Type())
}

func TestRequestUpdate(t *testing.T) {
Expand All @@ -208,8 +206,7 @@ func TestRequestUpdate(t *testing.T) {
require.Len(t, requests, 1, "did not add cancel request")
request := requests[0]
require.Equal(t, id, request.ID())
require.True(t, request.IsUpdate())
require.False(t, request.IsCancel())
require.Equal(t, request.Type(), graphsync.RequestTypeUpdate)
extensionData, found := request.Extension(extensionName)
require.True(t, found)
require.Equal(t, extension.Data, extensionData)
Expand All @@ -227,8 +224,7 @@ func TestRequestUpdate(t *testing.T) {
deserializedRequest := deserializedRequests[0]
extensionData, found = deserializedRequest.Extension(extensionName)
require.Equal(t, request.ID(), deserializedRequest.ID())
require.Equal(t, request.IsCancel(), deserializedRequest.IsCancel())
require.Equal(t, request.IsUpdate(), deserializedRequest.IsUpdate())
require.Equal(t, request.Type(), deserializedRequest.Type())
require.Equal(t, request.Priority(), deserializedRequest.Priority())
require.Equal(t, request.Root().String(), deserializedRequest.Root().String())
require.Equal(t, request.Selector(), deserializedRequest.Selector())
Expand Down Expand Up @@ -276,8 +272,7 @@ func TestToNetFromNetEquivalency(t *testing.T) {
deserializedRequest := deserializedRequests[0]
extensionData, found := deserializedRequest.Extension(extensionName)
require.Equal(t, request.ID(), deserializedRequest.ID())
require.False(t, deserializedRequest.IsCancel())
require.False(t, deserializedRequest.IsUpdate())
require.Equal(t, request.Type(), graphsync.RequestTypeNew)
require.Equal(t, request.Priority(), deserializedRequest.Priority())
require.Equal(t, request.Root().String(), deserializedRequest.Root().String())
require.Equal(t, request.Selector(), deserializedRequest.Selector())
Expand Down
Loading

0 comments on commit ff4d7ad

Please sign in to comment.