Skip to content

Commit

Permalink
Fix/handle context deadline exceeded (#1268)
Browse files Browse the repository at this point in the history
  • Loading branch information
trkhoi authored Dec 5, 2023
1 parent 426ba32 commit 34d66a3
Showing 1 changed file with 35 additions and 16 deletions.
51 changes: 35 additions & 16 deletions pkg/util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (
"encoding/base64"
"encoding/hex"
"encoding/json"
errs "errors"
"fmt"
"image"
_ "image/color"
Expand Down Expand Up @@ -42,6 +41,7 @@ import (
gonanoid "github.com/matoous/go-nanoid"
"github.com/nfnt/resize"

"github.com/defipod/mochi/pkg/logger"
"github.com/defipod/mochi/pkg/model/errors"
)

Expand Down Expand Up @@ -518,21 +518,37 @@ func Uint8ToIntPointer(u uint8) *int {
}

func FetchData(url string, parseForm interface{}) (int, error) {
client := &http.Client{Timeout: time.Second * 60}
client := &http.Client{Timeout: time.Second * 3}
resp, err := client.Get(url)
if err != nil {
return http.StatusInternalServerError, err
if strings.Contains(err.Error(), "context deadline exceeded") {
for i := 0; i < 3; i++ {
logger.NewLogrusLogger().Fields(logger.Fields{"url": url}).Infof(fmt.Sprintf("context deadline exceeded for service, retrying %dth ...", i+1))
resp, err = client.Get(url)
if err == nil {
break
}
}
} else {
return http.StatusInternalServerError, err
}
}

if resp == nil {
return http.StatusInternalServerError, fmt.Errorf("cannot get data from url: %s", url)
}
defer resp.Body.Close()

statusCode := resp.StatusCode
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return statusCode, err
}

resp.Body.Close()

return statusCode, json.Unmarshal(b, parseForm)
}

func GetMaxFloat64(arr []float64) float64 {
max := arr[0]
for _, ele := range arr {
Expand Down Expand Up @@ -654,28 +670,29 @@ func SendRequest(q SendRequestQuery) (int, error) {
if q.Method == "" {
q.Method = http.MethodGet
}
client := &http.Client{Timeout: time.Second * 30}
client := &http.Client{Timeout: time.Second * 5}
req, _ := http.NewRequest(q.Method, q.URL, q.Body)
for k, v := range q.Headers {
req.Header.Set(k, v)
}
res, err := client.Do(req)
if err != nil {
// if context dealine exceeded, wait a bit and retry 3 times
if !errs.Is(err, context.DeadlineExceeded) {
if strings.Contains(err.Error(), "context deadline exceeded") {
for i := 0; i < 3; i++ {
logger.NewLogrusLogger().Fields(logger.Fields{"q": q}).Infof(fmt.Sprintf("context deadline exceeded for service, retrying %dth ...", i+1))
res, err = client.Do(req)
if err == nil {
break
}
}
} else {
return http.StatusInternalServerError, err
}
}

log.Info("context deadline exceeded for 3rd party, retrying...")
time.Sleep(3 * time.Second)
for i := 0; i < 3; i++ {
res, err = client.Do(req)
if err == nil {
break
}
}
if res == nil {
return http.StatusInternalServerError, fmt.Errorf("cannot get data from url: %s", q.URL)
}
defer res.Body.Close()

statusCode := res.StatusCode
if q.ParseForm != nil {
Expand All @@ -689,6 +706,8 @@ func SendRequest(q SendRequestQuery) (int, error) {
return statusCode, nil
}

res.Body.Close()

return statusCode, nil
}

Expand Down

0 comments on commit 34d66a3

Please sign in to comment.