Fix resolver fail status locking
This commit is contained in:
@@ -187,7 +187,7 @@ type ResolverConn interface { //nolint:go-lint // TODO
|
|||||||
|
|
||||||
// BasicResolverConn implements ResolverConn for standard dns clients.
|
// BasicResolverConn implements ResolverConn for standard dns clients.
|
||||||
type BasicResolverConn struct {
|
type BasicResolverConn struct {
|
||||||
sync.Mutex // for lastFail
|
sync.Mutex // Also used by inheriting structs.
|
||||||
|
|
||||||
resolver *Resolver
|
resolver *Resolver
|
||||||
|
|
||||||
@@ -212,14 +212,18 @@ func (brc *BasicResolverConn) ReportFailure() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
brc.Lock()
|
brc.failLock.Lock()
|
||||||
defer brc.Unlock()
|
defer brc.failLock.Unlock()
|
||||||
|
|
||||||
brc.fails++
|
brc.fails++
|
||||||
if brc.fails > FailThreshold {
|
if brc.fails > FailThreshold {
|
||||||
brc.failing.Set()
|
brc.failing.Set()
|
||||||
brc.failingUntil = time.Now().Add(time.Duration(nameserverRetryRate()) * time.Second)
|
brc.failingUntil = time.Now().Add(time.Duration(nameserverRetryRate()) * time.Second)
|
||||||
brc.fails = 0
|
brc.fails = 0
|
||||||
|
|
||||||
|
// Refresh the network changed flag in order to only regard changes after
|
||||||
|
// the fail.
|
||||||
|
brc.networkChangedFlag.Refresh()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,8 +234,8 @@ func (brc *BasicResolverConn) IsFailing() bool {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
brc.Lock()
|
brc.failLock.Lock()
|
||||||
defer brc.Unlock()
|
defer brc.failLock.Unlock()
|
||||||
|
|
||||||
// Reset failure status if the network changed since the last query.
|
// Reset failure status if the network changed since the last query.
|
||||||
if brc.networkChangedFlag.IsSet() {
|
if brc.networkChangedFlag.IsSet() {
|
||||||
@@ -247,8 +251,8 @@ func (brc *BasicResolverConn) IsFailing() bool {
|
|||||||
// ResetFailure resets the failure status.
|
// ResetFailure resets the failure status.
|
||||||
func (brc *BasicResolverConn) ResetFailure() {
|
func (brc *BasicResolverConn) ResetFailure() {
|
||||||
if brc.failing.SetToIf(true, false) {
|
if brc.failing.SetToIf(true, false) {
|
||||||
brc.Lock()
|
brc.failLock.Lock()
|
||||||
defer brc.Unlock()
|
defer brc.failLock.Unlock()
|
||||||
brc.fails = 0
|
brc.fails = 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user