From 13f3e0aca4ab5fa50cf2a8e73c483f99a536301a Mon Sep 17 00:00:00 2001 From: Aayush Date: Thu, 22 Sep 2022 12:50:05 -0400 Subject: [PATCH] fix: itest: check for closed connection --- api/api_errors.go | 13 +++++++++++++ itests/kit/blockminer.go | 3 ++- lib/retry/retry.go | 16 +++------------- lib/retry/retry_test.go | 8 +++++--- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/api/api_errors.go b/api/api_errors.go index 53460aea7..fd157be5f 100644 --- a/api/api_errors.go +++ b/api/api_errors.go @@ -1,6 +1,9 @@ package api import ( + "errors" + "reflect" + "github.com/filecoin-project/go-jsonrpc" ) @@ -23,6 +26,16 @@ func (e *ErrActorNotFound) Error() string { var RPCErrors = jsonrpc.NewErrors() +func ErrorIsIn(err error, errorTypes []error) bool { + for _, etype := range errorTypes { + tmp := reflect.New(reflect.PointerTo(reflect.ValueOf(etype).Elem().Type())).Interface() + if errors.As(err, tmp) { + return true + } + } + return false +} + func init() { RPCErrors.Register(EOutOfGas, new(*ErrOutOfGas)) RPCErrors.Register(EActorNotFound, new(*ErrActorNotFound)) diff --git a/itests/kit/blockminer.go b/itests/kit/blockminer.go index 48cebe993..0b99c7830 100644 --- a/itests/kit/blockminer.go +++ b/itests/kit/blockminer.go @@ -13,6 +13,7 @@ import ( "github.com/stretchr/testify/require" "github.com/filecoin-project/go-bitfield" + "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/builtin" minertypes "github.com/filecoin-project/go-state-types/builtin/v8/miner" @@ -191,7 +192,7 @@ func (bm *BlockMiner) MineBlocksMustPost(ctx context.Context, blocktime time.Dur reportSuccessFn := func(success bool, epoch abi.ChainEpoch, err error) { // if api shuts down before mining, we may get an error which we should probably just ignore // (fixing it will require rewriting most of the mining loop) - if err != nil && !strings.Contains(err.Error(), "websocket connection closed") { + if err != nil && !strings.Contains(err.Error(), "websocket connection closed") && !api.ErrorIsIn(err, []error{&jsonrpc.RPCConnectionError{}}) { require.NoError(bm.t, err) } diff --git a/lib/retry/retry.go b/lib/retry/retry.go index 0b53c0fa3..e69d1ef35 100644 --- a/lib/retry/retry.go +++ b/lib/retry/retry.go @@ -1,25 +1,15 @@ package retry import ( - "errors" - "reflect" "time" logging "github.com/ipfs/go-log/v2" + + "github.com/filecoin-project/lotus/api" ) var log = logging.Logger("retry") -func ErrorIsIn(err error, errorTypes []error) bool { - for _, etype := range errorTypes { - tmp := reflect.New(reflect.PointerTo(reflect.ValueOf(etype).Elem().Type())).Interface() - if errors.As(err, tmp) { - return true - } - } - return false -} - func Retry[T any](attempts int, initialBackoff time.Duration, errorTypes []error, f func() (T, error)) (result T, err error) { for i := 0; i < attempts; i++ { if i > 0 { @@ -28,7 +18,7 @@ func Retry[T any](attempts int, initialBackoff time.Duration, errorTypes []error initialBackoff *= 2 } result, err = f() - if err == nil || !ErrorIsIn(err, errorTypes) { + if err == nil || !api.ErrorIsIn(err, errorTypes) { return result, err } } diff --git a/lib/retry/retry_test.go b/lib/retry/retry_test.go index a60d47db2..d3483249b 100644 --- a/lib/retry/retry_test.go +++ b/lib/retry/retry_test.go @@ -7,19 +7,21 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/go-jsonrpc" + + "github.com/filecoin-project/lotus/api" ) func TestRetryErrorIsInTrue(t *testing.T) { errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} - require.True(t, ErrorIsIn(&jsonrpc.RPCConnectionError{}, errorsToRetry)) + require.True(t, api.ErrorIsIn(&jsonrpc.RPCConnectionError{}, errorsToRetry)) } func TestRetryErrorIsInFalse(t *testing.T) { errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} - require.False(t, ErrorIsIn(xerrors.Errorf("random error"), errorsToRetry)) + require.False(t, api.ErrorIsIn(xerrors.Errorf("random error"), errorsToRetry)) } func TestRetryWrappedErrorIsInTrue(t *testing.T) { errorsToRetry := []error{&jsonrpc.RPCConnectionError{}} - require.True(t, ErrorIsIn(xerrors.Errorf("wrapped: %w", &jsonrpc.RPCConnectionError{}), errorsToRetry)) + require.True(t, api.ErrorIsIn(xerrors.Errorf("wrapped: %w", &jsonrpc.RPCConnectionError{}), errorsToRetry)) }