Fix resolver fail status locking

This commit is contained in:
Daniel
2021-03-31 15:59:01 +02:00
parent 18617fc617
commit b956fff1b0

View File

@@ -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
} }
} }