From de55d167ade372f1f77b8bbf633a4acadea1fe20 Mon Sep 17 00:00:00 2001 From: arnaudberger Date: Wed, 17 Jan 2024 09:47:00 -0500 Subject: [PATCH] fixing retry when not able to fetch a block --- block/fetcher/rpc.go | 14 ++++++++++++-- cmd/firesol/rpc/fetcher.go | 20 +++++++++++++++++--- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/block/fetcher/rpc.go b/block/fetcher/rpc.go index 9c0be2ce..58f67052 100644 --- a/block/fetcher/rpc.go +++ b/block/fetcher/rpc.go @@ -86,8 +86,18 @@ func (f *RPCFetcher) Fetch(ctx context.Context, requestedSlot uint64) (out *pbbs } resolvedSlot, blockResult, err := f.fetch(ctx, requestedSlot) - if err != nil { - return nil, fmt.Errorf("fetching block %d: %w", requestedSlot, err) + for { + blockResult, err = f.rpcClient.GetBlockWithOpts(ctx, requestedSlot, GetBlockOpts) + if err != nil { + var rpcErr *jsonrpc.RPCError + errors.As(err, &rpcErr) + if rpcErr != nil && rpcErr.Code == -32009 { + requestedSlot += 1 + continue + } + return nil, fmt.Errorf("fetching block %d: %w", requestedSlot, err) + } + break } block, err := blockFromBlockResult(resolvedSlot, f.latestConfirmedSlot, f.latestFinalizedSlot, blockResult) diff --git a/cmd/firesol/rpc/fetcher.go b/cmd/firesol/rpc/fetcher.go index a68f5d08..ad239ec2 100644 --- a/cmd/firesol/rpc/fetcher.go +++ b/cmd/firesol/rpc/fetcher.go @@ -1,11 +1,13 @@ package rpc import ( + "errors" "fmt" "strconv" "time" "github.com/gagliardetto/solana-go/rpc" + "github.com/gagliardetto/solana-go/rpc/jsonrpc" "github.com/spf13/cobra" "github.com/streamingfast/bstream" "github.com/streamingfast/cli/sflags" @@ -68,9 +70,21 @@ func fetchRunE(logger *zap.Logger, tracer logging.Tracer) firecore.CommandExecut } logger.Info("Found latest slot", zap.Uint64("slot_number", latestSlot)) - requestedBlock, err := rpcClient.GetBlockWithOpts(ctx, latestSlot, fetcher.GetBlockOpts) - if err != nil { - return fmt.Errorf("getting requested block %d: %w", latestSlot, err) + + var requestedBlock *rpc.GetBlockResult + for { + requestedBlock, err = rpcClient.GetBlockWithOpts(ctx, latestSlot, fetcher.GetBlockOpts) + if err != nil { + var rpcErr *jsonrpc.RPCError + if errors.As(err, &rpcErr) { + if rpcErr.Code == -32004 { + time.Sleep(latestBlockRetryInterval) + continue + } + } + return fmt.Errorf("getting requested block %d: %w", latestSlot, err) + } + break } err = poller.Run(ctx, startBlock, bstream.NewBlockRef(requestedBlock.Blockhash.String(), latestSlot))