fix: network failure err check should ignore context canceled errors (#10567)

context canceled errors bubbling up from the network
layer has the potential to be misconstrued as network
errors, taking prematurely a server offline and triggering
a health check routine avoid this potential occurrence.
This commit is contained in:
Harshavardhana 2020-09-25 14:35:47 -07:00 committed by GitHub
parent 9603489dd3
commit 66b4a862e0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 8 additions and 1 deletions

View File

@ -112,7 +112,7 @@ func (c *Client) Call(ctx context.Context, method string, values url.Values, bod
}
resp, err := c.httpClient.Do(req)
if err != nil {
if xnet.IsNetworkOrHostDown(err) || errors.Is(err, context.DeadlineExceeded) {
if xnet.IsNetworkOrHostDown(err) {
c.MarkOffline()
}
return nil, &NetworkError{err}
@ -141,6 +141,9 @@ func (c *Client) Call(ctx context.Context, method string, values url.Values, bod
// Limit the ReadAll(), just in case, because of a bug, the server responds with large data.
b, err := ioutil.ReadAll(io.LimitReader(resp.Body, c.MaxErrResponseSize))
if err != nil {
if xnet.IsNetworkOrHostDown(err) {
c.MarkOffline()
}
return nil, err
}
if len(b) > 0 {

View File

@ -17,6 +17,7 @@
package net
import (
"context"
"encoding/json"
"errors"
"fmt"
@ -144,6 +145,9 @@ func IsNetworkOrHostDown(err error) bool {
if err == nil {
return false
}
if errors.Is(err, context.Canceled) {
return false
}
// We need to figure if the error either a timeout
// or a non-temporary error.
e, ok := err.(net.Error)