Skip to content

Commit aed63eb

Browse files
committed
AppError handling
Signed-off-by: Joshua Kim <20001595+joshua-kim@users.noreply.github.com>
1 parent d2ce17f commit aed63eb

File tree

26 files changed

+656
-415
lines changed

26 files changed

+656
-415
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ require (
1111
github.com/DataDog/zstd v1.5.2
1212
github.com/Microsoft/go-winio v0.5.2
1313
github.com/NYTimes/gziphandler v1.1.1
14-
github.com/ava-labs/coreth v0.12.10-rc.0
14+
github.com/ava-labs/coreth v0.12.9-rc.9.0.20231206185357-69fafe99826a
1515
github.com/ava-labs/ledger-avalanche/go v0.0.0-20231102202641-ae2ebdaeac34
1616
github.com/btcsuite/btcd/btcutil v1.1.3
1717
github.com/cockroachdb/pebble v0.0.0-20230209160836-829675f94811

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@ github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah
6666
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
6767
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
6868
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
69-
github.com/ava-labs/coreth v0.12.10-rc.0 h1:qmuom7rtH5hc1E3lnqrMFNLFL1TMnEVa/2O8poB1YLU=
70-
github.com/ava-labs/coreth v0.12.10-rc.0/go.mod h1:plFm/xzvWmx1+qJ3JQSTzF8+FdaA2xu7GgY/AdaZDfk=
69+
github.com/ava-labs/coreth v0.12.9-rc.9.0.20231206185357-69fafe99826a h1:8U05FGQkIJGNrdraQCcHSn+3oYuh+RXlKeWiu+5SOOs=
70+
github.com/ava-labs/coreth v0.12.9-rc.9.0.20231206185357-69fafe99826a/go.mod h1:PXsfjJVVlHDjdZ9FixIGijVvL3H1GC00heExDMt6Do8=
7171
github.com/ava-labs/ledger-avalanche/go v0.0.0-20231102202641-ae2ebdaeac34 h1:mg9Uw6oZFJKytJxgxnl3uxZOs/SB8CVHg6Io4Tf99Zc=
7272
github.com/ava-labs/ledger-avalanche/go v0.0.0-20231102202641-ae2ebdaeac34/go.mod h1:pJxaT9bUgeRNVmNRgtCHb7sFDIRKy7CzTQVi8gGNT6g=
7373
github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g=

message/inbound_msg_builder.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,26 @@ func InboundAppRequest(
284284
}
285285
}
286286

287+
func InboundAppError(
288+
nodeID ids.NodeID,
289+
chainID ids.ID,
290+
requestID uint32,
291+
errorCode int32,
292+
errorMessage string,
293+
) InboundMessage {
294+
return &inboundMessage{
295+
nodeID: nodeID,
296+
op: AppRequestFailedOp,
297+
message: &p2p.AppError{
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

Lines changed: 6 additions & 40 deletions
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 int32 `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 int32,
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

Lines changed: 2 additions & 3 deletions
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/network.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ func (n *Network) AppResponse(ctx context.Context, nodeID ids.NodeID, requestID
8787
return n.router.AppResponse(ctx, nodeID, requestID, response)
8888
}
8989

90-
func (n *Network) AppRequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
91-
return n.router.AppRequestFailed(ctx, nodeID, requestID)
90+
func (n *Network) AppRequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32, appErr *common.AppError) error {
91+
return n.router.AppRequestFailed(ctx, nodeID, requestID, appErr)
9292
}
9393

9494
func (n *Network) AppGossip(ctx context.Context, nodeID ids.NodeID, msg []byte) error {
@@ -103,8 +103,8 @@ func (n *Network) CrossChainAppResponse(ctx context.Context, chainID ids.ID, req
103103
return n.router.CrossChainAppResponse(ctx, chainID, requestID, response)
104104
}
105105

106-
func (n *Network) CrossChainAppRequestFailed(ctx context.Context, chainID ids.ID, requestID uint32) error {
107-
return n.router.CrossChainAppRequestFailed(ctx, chainID, requestID)
106+
func (n *Network) CrossChainAppRequestFailed(ctx context.Context, chainID ids.ID, requestID uint32, appErr *common.AppError) error {
107+
return n.router.CrossChainAppRequestFailed(ctx, chainID, requestID, appErr)
108108
}
109109

110110
func (n *Network) Connected(_ context.Context, nodeID ids.NodeID, _ *version.Application) error {

network/p2p/network_test.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ import (
2525
"github.com/ava-labs/avalanchego/version"
2626
)
2727

28+
var errFoo = &common.AppError{
29+
Code: 123,
30+
Message: "foo",
31+
}
32+
2833
func TestAppRequestResponse(t *testing.T) {
2934
handlerID := uint64(0x0)
3035
request := []byte("request")
@@ -85,7 +90,7 @@ func TestAppRequestResponse(t *testing.T) {
8590
sender.SendAppRequestF = func(ctx context.Context, nodeIDs set.Set[ids.NodeID], requestID uint32, request []byte) error {
8691
for range nodeIDs {
8792
go func() {
88-
require.NoError(t, network.AppRequestFailed(ctx, nodeID, requestID))
93+
require.NoError(t, network.AppRequestFailed(ctx, nodeID, requestID, errFoo))
8994
}()
9095
}
9196

@@ -95,7 +100,7 @@ func TestAppRequestResponse(t *testing.T) {
95100
callback := func(_ context.Context, actualNodeID ids.NodeID, actualResponse []byte, err error) {
96101
defer wg.Done()
97102

98-
require.ErrorIs(t, err, ErrAppRequestFailed)
103+
require.ErrorIs(t, err, errFoo)
99104
require.Equal(t, nodeID, actualNodeID)
100105
require.Nil(t, actualResponse)
101106
}
@@ -140,14 +145,14 @@ func TestAppRequestResponse(t *testing.T) {
140145
requestFunc: func(t *testing.T, network *Network, client *Client, sender *common.SenderTest, handler *mocks.MockHandler, wg *sync.WaitGroup) {
141146
sender.SendCrossChainAppRequestF = func(ctx context.Context, chainID ids.ID, requestID uint32, request []byte) {
142147
go func() {
143-
require.NoError(t, network.CrossChainAppRequestFailed(ctx, chainID, requestID))
148+
require.NoError(t, network.CrossChainAppRequestFailed(ctx, chainID, requestID, errFoo))
144149
}()
145150
}
146151

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

150-
require.ErrorIs(t, err, ErrAppRequestFailed)
155+
require.ErrorIs(t, err, errFoo)
151156
require.Equal(t, chainID, actualChainID)
152157
require.Nil(t, actualResponse)
153158
}
@@ -273,7 +278,7 @@ func TestNetworkDropMessage(t *testing.T) {
273278
{
274279
name: "drop unrequested app request failed",
275280
requestFunc: func(network *Network) error {
276-
return network.AppRequestFailed(context.Background(), ids.GenerateTestNodeID(), 0)
281+
return network.AppRequestFailed(context.Background(), ids.GenerateTestNodeID(), 0, errFoo)
277282
},
278283
err: ErrUnrequestedResponse,
279284
},
@@ -287,7 +292,7 @@ func TestNetworkDropMessage(t *testing.T) {
287292
{
288293
name: "drop unrequested cross-chain request failed",
289294
requestFunc: func(network *Network) error {
290-
return network.CrossChainAppRequestFailed(context.Background(), ids.GenerateTestID(), 0)
295+
return network.CrossChainAppRequestFailed(context.Background(), ids.GenerateTestID(), 0, errFoo)
291296
},
292297
err: ErrUnrequestedResponse,
293298
},

network/p2p/router.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -223,15 +223,15 @@ func (r *router) AppRequest(ctx context.Context, nodeID ids.NodeID, requestID ui
223223
//
224224
// Any error condition propagated outside Handler application logic is
225225
// considered fatal
226-
func (r *router) AppRequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32) error {
226+
func (r *router) AppRequestFailed(ctx context.Context, nodeID ids.NodeID, requestID uint32, appErr *common.AppError) error {
227227
start := time.Now()
228228
pending, ok := r.clearAppRequest(requestID)
229229
if !ok {
230230
// we should never receive a timeout without a corresponding requestID
231231
return ErrUnrequestedResponse
232232
}
233233

234-
pending.AppResponseCallback(ctx, nodeID, nil, ErrAppRequestFailed)
234+
pending.AppResponseCallback(ctx, nodeID, nil, appErr)
235235
pending.appRequestFailedTime.Observe(float64(time.Since(start)))
236236
return nil
237237
}
@@ -316,15 +316,15 @@ func (r *router) CrossChainAppRequest(
316316
//
317317
// Any error condition propagated outside Handler application logic is
318318
// considered fatal
319-
func (r *router) CrossChainAppRequestFailed(ctx context.Context, chainID ids.ID, requestID uint32) error {
319+
func (r *router) CrossChainAppRequestFailed(ctx context.Context, chainID ids.ID, requestID uint32, appErr *common.AppError) error {
320320
start := time.Now()
321321
pending, ok := r.clearCrossChainAppRequest(requestID)
322322
if !ok {
323323
// we should never receive a timeout without a corresponding requestID
324324
return ErrUnrequestedResponse
325325
}
326326

327-
pending.CrossChainAppResponseCallback(ctx, chainID, nil, ErrAppRequestFailed)
327+
pending.CrossChainAppResponseCallback(ctx, chainID, nil, appErr)
328328
pending.crossChainAppRequestFailedTime.Observe(float64(time.Since(start)))
329329
return nil
330330
}

0 commit comments

Comments
 (0)