- fix crash after stats module is closed
Close DNS forward module BEFORE stats.
This commit is contained in:
parent
a71521a658
commit
d7f256ba7f
|
@ -63,6 +63,13 @@ func NewServer(stats stats.Stats, queryLog querylog.QueryLog) *Server {
|
||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *Server) Close() {
|
||||||
|
s.Lock()
|
||||||
|
s.stats = nil
|
||||||
|
s.queryLog = nil
|
||||||
|
s.Unlock()
|
||||||
|
}
|
||||||
|
|
||||||
// FilteringConfig represents the DNS filtering configuration of AdGuard Home
|
// FilteringConfig represents the DNS filtering configuration of AdGuard Home
|
||||||
// The zero FilteringConfig is empty and ready for use.
|
// The zero FilteringConfig is empty and ready for use.
|
||||||
type FilteringConfig struct {
|
type FilteringConfig struct {
|
||||||
|
@ -467,6 +474,9 @@ func (s *Server) handleDNSRequest(p *proxy.Proxy, d *proxy.DNSContext) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
elapsed := time.Since(start)
|
elapsed := time.Since(start)
|
||||||
|
s.RLock()
|
||||||
|
// Synchronize access to s.queryLog and s.stats so they won't be suddenly uninitialized while in use.
|
||||||
|
// This can happen after proxy server has been stopped, but its workers haven't yet exited.
|
||||||
if s.conf.QueryLogEnabled && shouldLog && s.queryLog != nil {
|
if s.conf.QueryLogEnabled && shouldLog && s.queryLog != nil {
|
||||||
upstreamAddr := ""
|
upstreamAddr := ""
|
||||||
if d.Upstream != nil {
|
if d.Upstream != nil {
|
||||||
|
@ -476,6 +486,7 @@ func (s *Server) handleDNSRequest(p *proxy.Proxy, d *proxy.DNSContext) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
s.updateStats(d, elapsed, *res)
|
s.updateStats(d, elapsed, *res)
|
||||||
|
s.RUnlock()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,8 +204,16 @@ func stopDNSServer() error {
|
||||||
return errorx.Decorate(err, "Couldn't stop forwarding DNS server")
|
return errorx.Decorate(err, "Couldn't stop forwarding DNS server")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DNS forward module must be closed BEFORE stats or queryLog because it depends on them
|
||||||
|
config.dnsServer.Close()
|
||||||
|
|
||||||
config.stats.Close()
|
config.stats.Close()
|
||||||
|
config.stats = nil
|
||||||
|
|
||||||
config.queryLog.Close()
|
config.queryLog.Close()
|
||||||
|
config.queryLog = nil
|
||||||
|
|
||||||
config.auth.Close()
|
config.auth.Close()
|
||||||
|
config.auth = nil
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -420,6 +420,7 @@ func (s *statsCtx) Clear() {
|
||||||
|
|
||||||
func (s *statsCtx) Update(e Entry) {
|
func (s *statsCtx) Update(e Entry) {
|
||||||
if e.Result == 0 ||
|
if e.Result == 0 ||
|
||||||
|
e.Result >= rLast ||
|
||||||
len(e.Domain) == 0 ||
|
len(e.Domain) == 0 ||
|
||||||
!(len(e.Client) == 4 || len(e.Client) == 16) {
|
!(len(e.Client) == 4 || len(e.Client) == 16) {
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in New Issue