mirror of
https://github.com/minio/minio.git
synced 2025-11-10 14:09:48 -05:00
Handle connection failures on webhook/url pings (#8204)
Properly handle connection failures while replaying events Fixes #8194
This commit is contained in:
committed by
Harshavardhana
parent
ff6aabd9c0
commit
8700945cdf
@@ -83,11 +83,8 @@ func (target *ElasticsearchTarget) Save(eventData event.Event) error {
|
||||
return target.store.Put(eventData)
|
||||
}
|
||||
if dErr := target.args.URL.DialHTTP(); dErr != nil {
|
||||
if urlErr, ok := dErr.(*url.Error); ok {
|
||||
// To treat "connection refused" errors as errNotConnected.
|
||||
if IsConnRefusedErr(urlErr.Err) {
|
||||
return errNotConnected
|
||||
}
|
||||
if xnet.IsNetworkOrHostDown(dErr) {
|
||||
return errNotConnected
|
||||
}
|
||||
return dErr
|
||||
}
|
||||
@@ -157,11 +154,8 @@ func (target *ElasticsearchTarget) Send(eventKey string) error {
|
||||
}
|
||||
|
||||
if dErr := target.args.URL.DialHTTP(); dErr != nil {
|
||||
if urlErr, ok := dErr.(*url.Error); ok {
|
||||
// To treat "connection refused" errors as errNotConnected.
|
||||
if IsConnRefusedErr(urlErr.Err) {
|
||||
return errNotConnected
|
||||
}
|
||||
if xnet.IsNetworkOrHostDown(dErr) {
|
||||
return errNotConnected
|
||||
}
|
||||
return dErr
|
||||
}
|
||||
|
||||
@@ -87,11 +87,8 @@ func (target *WebhookTarget) Save(eventData event.Event) error {
|
||||
return pErr
|
||||
}
|
||||
if dErr := u.DialHTTP(); dErr != nil {
|
||||
if urlErr, ok := dErr.(*url.Error); ok {
|
||||
// To treat "connection refused" errors as errNotConnected.
|
||||
if IsConnRefusedErr(urlErr.Err) {
|
||||
return errNotConnected
|
||||
}
|
||||
if xnet.IsNetworkOrHostDown(dErr) {
|
||||
return errNotConnected
|
||||
}
|
||||
return dErr
|
||||
}
|
||||
@@ -136,17 +133,13 @@ func (target *WebhookTarget) send(eventData event.Event) error {
|
||||
|
||||
// Send - reads an event from store and sends it to webhook.
|
||||
func (target *WebhookTarget) Send(eventKey string) error {
|
||||
|
||||
u, pErr := xnet.ParseURL(target.args.Endpoint.String())
|
||||
if pErr != nil {
|
||||
return pErr
|
||||
}
|
||||
if dErr := u.DialHTTP(); dErr != nil {
|
||||
if urlErr, ok := dErr.(*url.Error); ok {
|
||||
// To treat "connection refused" errors as errNotConnected.
|
||||
if IsConnRefusedErr(urlErr.Err) {
|
||||
return errNotConnected
|
||||
}
|
||||
if xnet.IsNetworkOrHostDown(dErr) {
|
||||
return errNotConnected
|
||||
}
|
||||
return dErr
|
||||
}
|
||||
|
||||
@@ -134,3 +134,43 @@ func ParseURL(s string) (u *URL, err error) {
|
||||
u = &v
|
||||
return u, nil
|
||||
}
|
||||
|
||||
// IsNetworkOrHostDown - if there was a network error or if the host is down.
|
||||
func IsNetworkOrHostDown(err error) bool {
|
||||
if err == nil {
|
||||
return false
|
||||
}
|
||||
// We need to figure if the error either a timeout
|
||||
// or a non-temporary error.
|
||||
e, ok := err.(net.Error)
|
||||
if ok {
|
||||
urlErr, ok := e.(*url.Error)
|
||||
if ok {
|
||||
switch urlErr.Err.(type) {
|
||||
case *net.DNSError, *net.OpError, net.UnknownNetworkError:
|
||||
return true
|
||||
}
|
||||
}
|
||||
if e.Timeout() {
|
||||
return true
|
||||
}
|
||||
}
|
||||
ok = false
|
||||
// Fallback to other mechanisms.
|
||||
if strings.Contains(err.Error(), "Connection closed by foreign host") {
|
||||
ok = true
|
||||
} else if strings.Contains(err.Error(), "TLS handshake timeout") {
|
||||
// If error is - tlsHandshakeTimeoutError.
|
||||
ok = true
|
||||
} else if strings.Contains(err.Error(), "i/o timeout") {
|
||||
// If error is - tcp timeoutError.
|
||||
ok = true
|
||||
} else if strings.Contains(err.Error(), "connection timed out") {
|
||||
// If err is a net.Dial timeout.
|
||||
ok = true
|
||||
} else if strings.Contains(strings.ToLower(err.Error()), "503 service unavailable") {
|
||||
// Denial errors
|
||||
ok = true
|
||||
}
|
||||
return ok
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user