mirror of
https://github.com/safing/portmaster
synced 2025-09-04 11:39:29 +00:00
Improve resolver unfailing
This commit is contained in:
parent
986e868c27
commit
18617fc617
7 changed files with 52 additions and 3 deletions
|
@ -174,7 +174,7 @@ The format is: "protocol://ip:port?parameter=value¶meter=value"
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
nameserverRetryRate = config.Concurrent.GetAsInt(CfgOptionNameserverRetryRateKey, 600)
|
nameserverRetryRate = config.Concurrent.GetAsInt(CfgOptionNameserverRetryRateKey, 300)
|
||||||
|
|
||||||
err = config.Register(&config.Option{
|
err = config.Register(&config.Option{
|
||||||
Name: "Ignore System/Network Servers",
|
Name: "Ignore System/Network Servers",
|
||||||
|
|
|
@ -377,6 +377,10 @@ resolveLoop:
|
||||||
if rrCache.RCode != dns.RcodeSuccess && tryAll {
|
if rrCache.RCode != dns.RcodeSuccess && tryAll {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Report a successful connection.
|
||||||
|
resolver.Conn.ResetFailure()
|
||||||
|
|
||||||
break resolveLoop
|
break resolveLoop
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,3 +124,5 @@ func (er *envResolverConn) ReportFailure() {}
|
||||||
func (er *envResolverConn) IsFailing() bool {
|
func (er *envResolverConn) IsFailing() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (er *envResolverConn) ResetFailure() {}
|
||||||
|
|
|
@ -54,6 +54,8 @@ func (mrc *mDNSResolverConn) IsFailing() bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (mrc *mDNSResolverConn) ResetFailure() {}
|
||||||
|
|
||||||
type savedQuestion struct {
|
type savedQuestion struct {
|
||||||
question dns.Question
|
question dns.Question
|
||||||
expires time.Time
|
expires time.Time
|
||||||
|
|
|
@ -24,11 +24,13 @@ type PlainResolver struct {
|
||||||
|
|
||||||
// NewPlainResolver returns a new TPCResolver.
|
// NewPlainResolver returns a new TPCResolver.
|
||||||
func NewPlainResolver(resolver *Resolver) *PlainResolver {
|
func NewPlainResolver(resolver *Resolver) *PlainResolver {
|
||||||
return &PlainResolver{
|
newResolver := &PlainResolver{
|
||||||
BasicResolverConn: BasicResolverConn{
|
BasicResolverConn: BasicResolverConn{
|
||||||
resolver: resolver,
|
resolver: resolver,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
newResolver.BasicResolverConn.init()
|
||||||
|
return newResolver
|
||||||
}
|
}
|
||||||
|
|
||||||
// Query executes the given query against the resolver.
|
// Query executes the given query against the resolver.
|
||||||
|
|
|
@ -62,7 +62,7 @@ func (ifq *InFlightQuery) MakeCacheRecord(reply *dns.Msg) *RRCache {
|
||||||
// NewTCPResolver returns a new TPCResolver.
|
// NewTCPResolver returns a new TPCResolver.
|
||||||
func NewTCPResolver(resolver *Resolver) *TCPResolver {
|
func NewTCPResolver(resolver *Resolver) *TCPResolver {
|
||||||
var instanceID uint32
|
var instanceID uint32
|
||||||
return &TCPResolver{
|
newResolver := &TCPResolver{
|
||||||
BasicResolverConn: BasicResolverConn{
|
BasicResolverConn: BasicResolverConn{
|
||||||
resolver: resolver,
|
resolver: resolver,
|
||||||
},
|
},
|
||||||
|
@ -79,6 +79,8 @@ func NewTCPResolver(resolver *Resolver) *TCPResolver {
|
||||||
queries: make(chan *dns.Msg, 1000),
|
queries: make(chan *dns.Msg, 1000),
|
||||||
inFlightQueries: make(map[uint16]*InFlightQuery),
|
inFlightQueries: make(map[uint16]*InFlightQuery),
|
||||||
}
|
}
|
||||||
|
newResolver.BasicResolverConn.init()
|
||||||
|
return newResolver
|
||||||
}
|
}
|
||||||
|
|
||||||
// UseTLS enabled TLS for the TCPResolver. TLS settings must be correctly configured in the Resolver.
|
// UseTLS enabled TLS for the TCPResolver. TLS settings must be correctly configured in the Resolver.
|
||||||
|
|
|
@ -8,6 +8,9 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/miekg/dns"
|
"github.com/miekg/dns"
|
||||||
|
"github.com/tevino/abool"
|
||||||
|
|
||||||
|
"github.com/safing/portbase/utils"
|
||||||
"github.com/safing/portmaster/netenv"
|
"github.com/safing/portmaster/netenv"
|
||||||
"github.com/safing/portmaster/network/netutils"
|
"github.com/safing/portmaster/network/netutils"
|
||||||
)
|
)
|
||||||
|
@ -179,6 +182,7 @@ type ResolverConn interface { //nolint:go-lint // TODO
|
||||||
Query(ctx context.Context, q *Query) (*RRCache, error)
|
Query(ctx context.Context, q *Query) (*RRCache, error)
|
||||||
ReportFailure()
|
ReportFailure()
|
||||||
IsFailing() bool
|
IsFailing() bool
|
||||||
|
ResetFailure()
|
||||||
}
|
}
|
||||||
|
|
||||||
// BasicResolverConn implements ResolverConn for standard dns clients.
|
// BasicResolverConn implements ResolverConn for standard dns clients.
|
||||||
|
@ -187,8 +191,18 @@ type BasicResolverConn struct {
|
||||||
|
|
||||||
resolver *Resolver
|
resolver *Resolver
|
||||||
|
|
||||||
|
failing *abool.AtomicBool
|
||||||
failingUntil time.Time
|
failingUntil time.Time
|
||||||
fails int
|
fails int
|
||||||
|
failLock sync.Mutex
|
||||||
|
|
||||||
|
networkChangedFlag *utils.Flag
|
||||||
|
}
|
||||||
|
|
||||||
|
// init initializes the basic resolver connection.
|
||||||
|
func (brc *BasicResolverConn) init() {
|
||||||
|
brc.failing = abool.New()
|
||||||
|
brc.networkChangedFlag = netenv.GetNetworkChangedFlag()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReportFailure reports that an error occurred with this resolver.
|
// ReportFailure reports that an error occurred with this resolver.
|
||||||
|
@ -203,6 +217,7 @@ func (brc *BasicResolverConn) ReportFailure() {
|
||||||
|
|
||||||
brc.fails++
|
brc.fails++
|
||||||
if brc.fails > FailThreshold {
|
if brc.fails > FailThreshold {
|
||||||
|
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
|
||||||
}
|
}
|
||||||
|
@ -210,8 +225,30 @@ func (brc *BasicResolverConn) ReportFailure() {
|
||||||
|
|
||||||
// IsFailing returns if this resolver is currently failing.
|
// IsFailing returns if this resolver is currently failing.
|
||||||
func (brc *BasicResolverConn) IsFailing() bool {
|
func (brc *BasicResolverConn) IsFailing() bool {
|
||||||
|
// Check if not failing.
|
||||||
|
if !brc.failing.IsSet() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
brc.Lock()
|
brc.Lock()
|
||||||
defer brc.Unlock()
|
defer brc.Unlock()
|
||||||
|
|
||||||
|
// Reset failure status if the network changed since the last query.
|
||||||
|
if brc.networkChangedFlag.IsSet() {
|
||||||
|
brc.networkChangedFlag.Refresh()
|
||||||
|
brc.ResetFailure()
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if we are still
|
||||||
return time.Now().Before(brc.failingUntil)
|
return time.Now().Before(brc.failingUntil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ResetFailure resets the failure status.
|
||||||
|
func (brc *BasicResolverConn) ResetFailure() {
|
||||||
|
if brc.failing.SetToIf(true, false) {
|
||||||
|
brc.Lock()
|
||||||
|
defer brc.Unlock()
|
||||||
|
brc.fails = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue