Skip to content

Commit

Permalink
AppRequestFailed handling
Browse files Browse the repository at this point in the history
Signed-off-by: Joshua Kim <20001595+joshua-kim@users.noreply.github.com>
  • Loading branch information
joshua-kim committed Nov 2, 2023
1 parent 20f3580 commit de8c863
Show file tree
Hide file tree
Showing 25 changed files with 632 additions and 414 deletions.
20 changes: 20 additions & 0 deletions message/inbound_msg_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,26 @@ func InboundAppRequest(
}
}

func InboundAppRequestFailed(
nodeID ids.NodeID,
chainID ids.ID,
requestID uint32,
errorCode uint32,
errorMessage string,
) InboundMessage {
return &inboundMessage{
nodeID: nodeID,
op: AppRequestFailedOp,
message: &p2p.AppRequestFailed{
ChainId: chainID[:],
RequestId: requestID,
ErrorCode: errorCode,
ErrorMessage: errorMessage,
},
expiration: mockable.MaxTime,
}
}

func InboundAppResponse(
chainID ids.ID,
requestID uint32,
Expand Down
46 changes: 6 additions & 40 deletions message/internal_msg_builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,6 @@ var (
_ requestIDGetter = (*QueryFailed)(nil)
_ engineTypeGetter = (*QueryFailed)(nil)

_ fmt.Stringer = (*AppRequestFailed)(nil)
_ chainIDGetter = (*AppRequestFailed)(nil)
_ requestIDGetter = (*AppRequestFailed)(nil)

_ fmt.Stringer = (*CrossChainAppRequest)(nil)
_ sourceChainIDGetter = (*CrossChainAppRequest)(nil)
_ chainIDGetter = (*CrossChainAppRequest)(nil)
Expand Down Expand Up @@ -365,42 +361,6 @@ func InternalQueryFailed(
}
}

type AppRequestFailed struct {
ChainID ids.ID `json:"chain_id,omitempty"`
RequestID uint32 `json:"request_id,omitempty"`
}

func (m *AppRequestFailed) String() string {
return fmt.Sprintf(
"ChainID: %s RequestID: %d",
m.ChainID, m.RequestID,
)
}

func (m *AppRequestFailed) GetChainId() []byte {
return m.ChainID[:]
}

func (m *AppRequestFailed) GetRequestId() uint32 {
return m.RequestID
}

func InternalAppRequestFailed(
nodeID ids.NodeID,
chainID ids.ID,
requestID uint32,
) InboundMessage {
return &inboundMessage{
nodeID: nodeID,
op: AppRequestFailedOp,
message: &AppRequestFailed{
ChainID: chainID,
RequestID: requestID,
},
expiration: mockable.MaxTime,
}
}

type CrossChainAppRequest struct {
SourceChainID ids.ID `json:"source_chain_id,omitempty"`
DestinationChainID ids.ID `json:"destination_chain_id,omitempty"`
Expand Down Expand Up @@ -452,6 +412,8 @@ type CrossChainAppRequestFailed struct {
SourceChainID ids.ID `json:"source_chain_id,omitempty"`
DestinationChainID ids.ID `json:"destination_chain_id,omitempty"`
RequestID uint32 `json:"request_id,omitempty"`
ErrorCode uint32 `json:"error_code,omitempty"`
ErrorMessage string `json:"error_message,omitempty"`
}

func (m *CrossChainAppRequestFailed) String() string {
Expand All @@ -478,6 +440,8 @@ func InternalCrossChainAppRequestFailed(
sourceChainID ids.ID,
destinationChainID ids.ID,
requestID uint32,
errorCode uint32,
errorMessage string,
) InboundMessage {
return &inboundMessage{
nodeID: nodeID,
Expand All @@ -486,6 +450,8 @@ func InternalCrossChainAppRequestFailed(
SourceChainID: sourceChainID,
DestinationChainID: destinationChainID,
RequestID: requestID,
ErrorCode: errorCode,
ErrorMessage: errorMessage,
},
expiration: mockable.MaxTime,
}
Expand Down
5 changes: 2 additions & 3 deletions network/p2p/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,8 @@ import (
)

var (
ErrAppRequestFailed = errors.New("app request failed")
ErrRequestPending = errors.New("request pending")
ErrNoPeers = errors.New("no peers")
ErrRequestPending = errors.New("request pending")
ErrNoPeers = errors.New("no peers")
)

// AppResponseCallback is called upon receiving an AppResponse for an AppRequest
Expand Down
8 changes: 4 additions & 4 deletions network/p2p/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -220,14 +220,14 @@ func (r *Router) AppRequest(ctx context.Context, nodeID ids.NodeID, requestID ui
return nil
}

func (r *Router) AppRequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
func (r *Router) AppRequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32, err error) error {
start := time.Now()
pending, ok := r.clearAppRequest(requestID)
if !ok {
return ErrUnrequestedResponse
}

pending.AppResponseCallback(ctx, nodeID, nil, ErrAppRequestFailed)
pending.AppResponseCallback(ctx, nodeID, nil, err)
pending.appRequestFailedTime.Observe(float64(time.Since(start)))
return nil
}
Expand Down Expand Up @@ -290,14 +290,14 @@ func (r *Router) CrossChainAppRequest(
return nil
}

func (r *Router) CrossChainAppRequestFailed(ctx context.Context, chainID ids.ID, requestID uint32) error {
func (r *Router) CrossChainAppRequestFailed(ctx context.Context, chainID ids.ID, requestID uint32, err error) error {
start := time.Now()
pending, ok := r.clearCrossChainAppRequest(requestID)
if !ok {
return ErrUnrequestedResponse
}

pending.CrossChainAppResponseCallback(ctx, chainID, nil, ErrAppRequestFailed)
pending.CrossChainAppResponseCallback(ctx, chainID, nil, err)
pending.crossChainAppRequestFailedTime.Observe(float64(time.Since(start)))
return nil
}
Expand Down
16 changes: 10 additions & 6 deletions network/p2p/router_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package p2p

import (
"context"
"errors"
"sync"
"testing"
"time"
Expand Down Expand Up @@ -34,6 +35,8 @@ func TestAppRequestResponse(t *testing.T) {
*ctxKey = "foo"
*ctxVal = "bar"

errFoo := errors.New("foo")

tests := []struct {
name string
requestFunc func(t *testing.T, router *Router, client *Client, sender *common.MockSender, handler *mocks.MockHandler, wg *sync.WaitGroup)
Expand Down Expand Up @@ -81,15 +84,15 @@ func TestAppRequestResponse(t *testing.T) {
Do(func(ctx context.Context, nodeIDs set.Set[ids.NodeID], requestID uint32, request []byte) {
for range nodeIDs {
go func() {
require.NoError(t, router.AppRequestFailed(ctx, nodeID, requestID))
require.NoError(t, router.AppRequestFailed(ctx, nodeID, requestID, errFoo))
}()
}
})

callback := func(_ context.Context, actualNodeID ids.NodeID, actualResponse []byte, err error) {
defer wg.Done()

require.ErrorIs(t, err, ErrAppRequestFailed)
require.ErrorIs(t, err, errFoo)
require.Equal(t, nodeID, actualNodeID)
require.Nil(t, actualResponse)
}
Expand Down Expand Up @@ -137,14 +140,15 @@ func TestAppRequestResponse(t *testing.T) {
sender.EXPECT().SendCrossChainAppRequest(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).
Do(func(ctx context.Context, chainID ids.ID, requestID uint32, request []byte) {
go func() {
require.NoError(t, router.CrossChainAppRequestFailed(ctx, chainID, requestID))
require.NoError(t,
router.CrossChainAppRequestFailed(ctx, chainID, requestID, errFoo))
}()
})

callback := func(_ context.Context, actualChainID ids.ID, actualResponse []byte, err error) {
defer wg.Done()

require.ErrorIs(t, err, ErrAppRequestFailed)
require.ErrorIs(t, err, errFoo)
require.Equal(t, chainID, actualChainID)
require.Nil(t, actualResponse)
}
Expand Down Expand Up @@ -269,7 +273,7 @@ func TestRouterDropMessage(t *testing.T) {
{
name: "drop unrequested app request failed",
requestFunc: func(router *Router) error {
return router.AppRequestFailed(context.Background(), ids.GenerateTestNodeID(), 0)
return router.AppRequestFailed(context.Background(), ids.GenerateTestNodeID(), 0, nil)
},
err: ErrUnrequestedResponse,
},
Expand All @@ -283,7 +287,7 @@ func TestRouterDropMessage(t *testing.T) {
{
name: "drop unrequested cross-chain request failed",
requestFunc: func(router *Router) error {
return router.CrossChainAppRequestFailed(context.Background(), ids.GenerateTestID(), 0)
return router.CrossChainAppRequestFailed(context.Background(), ids.GenerateTestID(), 0, nil)
},
err: ErrUnrequestedResponse,
},
Expand Down

0 comments on commit de8c863

Please sign in to comment.