Skip to content

Commit af944e5

Browse files
committed
AppRequestFailed handling
Signed-off-by: Joshua Kim <20001595+joshua-kim@users.noreply.github.com>
1 parent 4957ccb commit af944e5

File tree

25 files changed

+632
-414
lines changed

25 files changed

+632
-414
lines changed

message/inbound_msg_builder.go

+20
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,26 @@ func InboundAppRequest(
284284
}
285285
}
286286

287+
func InboundAppRequestFailed(
288+
nodeID ids.NodeID,
289+
chainID ids.ID,
290+
requestID uint32,
291+
errorCode uint32,
292+
errorMessage string,
293+
) InboundMessage {
294+
return &inboundMessage{
295+
nodeID: nodeID,
296+
op: AppRequestFailedOp,
297+
message: &p2p.AppRequestFailed{
298+
ChainId: chainID[:],
299+
RequestId: requestID,
300+
ErrorCode: errorCode,
301+
ErrorMessage: errorMessage,
302+
},
303+
expiration: mockable.MaxTime,
304+
}
305+
}
306+
287307
func InboundAppResponse(
288308
chainID ids.ID,
289309
requestID uint32,

message/internal_msg_builder.go

+6-40
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@ var (
5252
_ requestIDGetter = (*QueryFailed)(nil)
5353
_ engineTypeGetter = (*QueryFailed)(nil)
5454

55-
_ fmt.Stringer = (*AppRequestFailed)(nil)
56-
_ chainIDGetter = (*AppRequestFailed)(nil)
57-
_ requestIDGetter = (*AppRequestFailed)(nil)
58-
5955
_ fmt.Stringer = (*CrossChainAppRequest)(nil)
6056
_ sourceChainIDGetter = (*CrossChainAppRequest)(nil)
6157
_ chainIDGetter = (*CrossChainAppRequest)(nil)
@@ -365,42 +361,6 @@ func InternalQueryFailed(
365361
}
366362
}
367363

368-
type AppRequestFailed struct {
369-
ChainID ids.ID `json:"chain_id,omitempty"`
370-
RequestID uint32 `json:"request_id,omitempty"`
371-
}
372-
373-
func (m *AppRequestFailed) String() string {
374-
return fmt.Sprintf(
375-
"ChainID: %s RequestID: %d",
376-
m.ChainID, m.RequestID,
377-
)
378-
}
379-
380-
func (m *AppRequestFailed) GetChainId() []byte {
381-
return m.ChainID[:]
382-
}
383-
384-
func (m *AppRequestFailed) GetRequestId() uint32 {
385-
return m.RequestID
386-
}
387-
388-
func InternalAppRequestFailed(
389-
nodeID ids.NodeID,
390-
chainID ids.ID,
391-
requestID uint32,
392-
) InboundMessage {
393-
return &inboundMessage{
394-
nodeID: nodeID,
395-
op: AppRequestFailedOp,
396-
message: &AppRequestFailed{
397-
ChainID: chainID,
398-
RequestID: requestID,
399-
},
400-
expiration: mockable.MaxTime,
401-
}
402-
}
403-
404364
type CrossChainAppRequest struct {
405365
SourceChainID ids.ID `json:"source_chain_id,omitempty"`
406366
DestinationChainID ids.ID `json:"destination_chain_id,omitempty"`
@@ -452,6 +412,8 @@ type CrossChainAppRequestFailed struct {
452412
SourceChainID ids.ID `json:"source_chain_id,omitempty"`
453413
DestinationChainID ids.ID `json:"destination_chain_id,omitempty"`
454414
RequestID uint32 `json:"request_id,omitempty"`
415+
ErrorCode uint32 `json:"error_code,omitempty"`
416+
ErrorMessage string `json:"error_message,omitempty"`
455417
}
456418

457419
func (m *CrossChainAppRequestFailed) String() string {
@@ -478,6 +440,8 @@ func InternalCrossChainAppRequestFailed(
478440
sourceChainID ids.ID,
479441
destinationChainID ids.ID,
480442
requestID uint32,
443+
errorCode uint32,
444+
errorMessage string,
481445
) InboundMessage {
482446
return &inboundMessage{
483447
nodeID: nodeID,
@@ -486,6 +450,8 @@ func InternalCrossChainAppRequestFailed(
486450
SourceChainID: sourceChainID,
487451
DestinationChainID: destinationChainID,
488452
RequestID: requestID,
453+
ErrorCode: errorCode,
454+
ErrorMessage: errorMessage,
489455
},
490456
expiration: mockable.MaxTime,
491457
}

network/p2p/client.go

+2-3
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,8 @@ import (
1414
)
1515

1616
var (
17-
ErrAppRequestFailed = errors.New("app request failed")
18-
ErrRequestPending = errors.New("request pending")
19-
ErrNoPeers = errors.New("no peers")
17+
ErrRequestPending = errors.New("request pending")
18+
ErrNoPeers = errors.New("no peers")
2019
)
2120

2221
// AppResponseCallback is called upon receiving an AppResponse for an AppRequest

network/p2p/router.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -220,14 +220,14 @@ func (r *Router) AppRequest(ctx context.Context, nodeID ids.NodeID, requestID ui
220220
return nil
221221
}
222222

223-
func (r *Router) AppRequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
223+
func (r *Router) AppRequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32, err error) error {
224224
start := time.Now()
225225
pending, ok := r.clearAppRequest(requestID)
226226
if !ok {
227227
return ErrUnrequestedResponse
228228
}
229229

230-
pending.AppResponseCallback(ctx, nodeID, nil, ErrAppRequestFailed)
230+
pending.AppResponseCallback(ctx, nodeID, nil, err)
231231
pending.appRequestFailedTime.Observe(float64(time.Since(start)))
232232
return nil
233233
}
@@ -290,14 +290,14 @@ func (r *Router) CrossChainAppRequest(
290290
return nil
291291
}
292292

293-
func (r *Router) CrossChainAppRequestFailed(ctx context.Context, chainID ids.ID, requestID uint32) error {
293+
func (r *Router) CrossChainAppRequestFailed(ctx context.Context, chainID ids.ID, requestID uint32, err error) error {
294294
start := time.Now()
295295
pending, ok := r.clearCrossChainAppRequest(requestID)
296296
if !ok {
297297
return ErrUnrequestedResponse
298298
}
299299

300-
pending.CrossChainAppResponseCallback(ctx, chainID, nil, ErrAppRequestFailed)
300+
pending.CrossChainAppResponseCallback(ctx, chainID, nil, err)
301301
pending.crossChainAppRequestFailedTime.Observe(float64(time.Since(start)))
302302
return nil
303303
}

network/p2p/router_test.go

+10-6
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package p2p
55

66
import (
77
"context"
8+
"errors"
89
"sync"
910
"testing"
1011
"time"
@@ -34,6 +35,8 @@ func TestAppRequestResponse(t *testing.T) {
3435
*ctxKey = "foo"
3536
*ctxVal = "bar"
3637

38+
errFoo := errors.New("foo")
39+
3740
tests := []struct {
3841
name string
3942
requestFunc func(t *testing.T, router *Router, client *Client, sender *common.MockSender, handler *mocks.MockHandler, wg *sync.WaitGroup)
@@ -81,15 +84,15 @@ func TestAppRequestResponse(t *testing.T) {
8184
Do(func(ctx context.Context, nodeIDs set.Set[ids.NodeID], requestID uint32, request []byte) {
8285
for range nodeIDs {
8386
go func() {
84-
require.NoError(t, router.AppRequestFailed(ctx, nodeID, requestID))
87+
require.NoError(t, router.AppRequestFailed(ctx, nodeID, requestID, errFoo))
8588
}()
8689
}
8790
})
8891

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

92-
require.ErrorIs(t, err, ErrAppRequestFailed)
95+
require.ErrorIs(t, err, errFoo)
9396
require.Equal(t, nodeID, actualNodeID)
9497
require.Nil(t, actualResponse)
9598
}
@@ -137,14 +140,15 @@ func TestAppRequestResponse(t *testing.T) {
137140
sender.EXPECT().SendCrossChainAppRequest(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).
138141
Do(func(ctx context.Context, chainID ids.ID, requestID uint32, request []byte) {
139142
go func() {
140-
require.NoError(t, router.CrossChainAppRequestFailed(ctx, chainID, requestID))
143+
require.NoError(t,
144+
router.CrossChainAppRequestFailed(ctx, chainID, requestID, errFoo))
141145
}()
142146
})
143147

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

147-
require.ErrorIs(t, err, ErrAppRequestFailed)
151+
require.ErrorIs(t, err, errFoo)
148152
require.Equal(t, chainID, actualChainID)
149153
require.Nil(t, actualResponse)
150154
}
@@ -269,7 +273,7 @@ func TestRouterDropMessage(t *testing.T) {
269273
{
270274
name: "drop unrequested app request failed",
271275
requestFunc: func(router *Router) error {
272-
return router.AppRequestFailed(context.Background(), ids.GenerateTestNodeID(), 0)
276+
return router.AppRequestFailed(context.Background(), ids.GenerateTestNodeID(), 0, nil)
273277
},
274278
err: ErrUnrequestedResponse,
275279
},
@@ -283,7 +287,7 @@ func TestRouterDropMessage(t *testing.T) {
283287
{
284288
name: "drop unrequested cross-chain request failed",
285289
requestFunc: func(router *Router) error {
286-
return router.CrossChainAppRequestFailed(context.Background(), ids.GenerateTestID(), 0)
290+
return router.CrossChainAppRequestFailed(context.Background(), ids.GenerateTestID(), 0, nil)
287291
},
288292
err: ErrUnrequestedResponse,
289293
},

0 commit comments

Comments
 (0)