diff --git a/chains/btc/uploader/ipfs.go b/chains/btc/uploader/ipfs.go index 32051736..2956805e 100644 --- a/chains/btc/uploader/ipfs.go +++ b/chains/btc/uploader/ipfs.go @@ -3,12 +3,16 @@ package uploader import ( "bytes" "encoding/json" + "errors" "io" "mime/multipart" "net/http" "time" + "github.com/rs/zerolog/log" + "github.com/ChainSafe/sygma-relayer/config/relayer" + "github.com/cenkalti/backoff/v4" ) const MAX_RETRIES = 3 @@ -55,31 +59,47 @@ func (s *IPFSUploader) Upload(dataToUpload []map[string]interface{}) (string, er req.Header.Add("Authorization", "Bearer "+s.config.AuthToken) req.Header.Add("Content-Type", writer.FormDataContentType()) - var resp *http.Response - for attempt := 1; attempt <= MAX_RETRIES; attempt++ { - client := &http.Client{} - resp, err = client.Do(req) - if err == nil && resp.StatusCode == 200 { - break - } + var ipfsResponse IPFSResponse + + // Define the operation to be retried + operation := func() error { + return s.performRequest(req, &ipfsResponse) + } + expBackoff := backoff.NewExponentialBackOff() + expBackoff.MaxElapsedTime = time.Minute - time.Sleep(time.Duration(attempt) * time.Second) + notify := func(err error, duration time.Duration) { + log.Warn().Err(err).Msg("Unable to upload metadata to ipfs") } + err = backoff.RetryNotify(operation, backoff.WithMaxRetries(expBackoff, 5), notify) if err != nil { return "", err } + + return ipfsResponse.IpfsHash, nil +} + +func (s *IPFSUploader) performRequest(req *http.Request, ipfsResponse *IPFSResponse) error { + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + return err + } defer resp.Body.Close() + if resp.StatusCode != 200 { + return errors.New("received non-200 status code") + } + respBody, err := io.ReadAll(resp.Body) if err != nil { - return "", err + return err } - var ipfsResponse IPFSResponse if err := json.Unmarshal(respBody, &ipfsResponse); err != nil { - return "", err + return err } - return ipfsResponse.IpfsHash, nil + return nil } diff --git a/go.mod b/go.mod index c6b391ab..0f2db091 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f // indirect github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd // indirect github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect github.com/crate-crypto/go-kzg-4844 v0.3.0 // indirect diff --git a/go.sum b/go.sum index d4bd1121..8863740c 100644 --- a/go.sum +++ b/go.sum @@ -123,6 +123,8 @@ github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46f github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/centrifuge/go-substrate-rpc-client/v4 v4.2.1 h1:io49TJ8IOIlzipioJc9pJlrjgdJvqktpUWYxVY5AUjE= github.com/centrifuge/go-substrate-rpc-client/v4 v4.2.1/go.mod h1:k61SBXqYmnZO4frAJyH3iuqjolYrYsq79r8EstmklDY=