mirror of
https://github.com/AdguardTeam/AdGuardHome.git
synced 2024-11-22 21:15:35 +03:00
- fix crash after stats module is closed
Close DNS forward module BEFORE stats.
This commit is contained in:
parent
a71521a658
commit
d7f256ba7f
3 changed files with 20 additions and 0 deletions
|
@ -63,6 +63,13 @@ func NewServer(stats stats.Stats, queryLog querylog.QueryLog) *Server {
|
|||
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
|
||||
// The zero FilteringConfig is empty and ready for use.
|
||||
type FilteringConfig struct {
|
||||
|
@ -467,6 +474,9 @@ func (s *Server) handleDNSRequest(p *proxy.Proxy, d *proxy.DNSContext) error {
|
|||
}
|
||||
|
||||
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 {
|
||||
upstreamAddr := ""
|
||||
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.RUnlock()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -204,8 +204,16 @@ func stopDNSServer() error {
|
|||
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 = nil
|
||||
|
||||
config.queryLog.Close()
|
||||
config.queryLog = nil
|
||||
|
||||
config.auth.Close()
|
||||
config.auth = nil
|
||||
return nil
|
||||
}
|
||||
|
|
|
@ -420,6 +420,7 @@ func (s *statsCtx) Clear() {
|
|||
|
||||
func (s *statsCtx) Update(e Entry) {
|
||||
if e.Result == 0 ||
|
||||
e.Result >= rLast ||
|
||||
len(e.Domain) == 0 ||
|
||||
!(len(e.Client) == 4 || len(e.Client) == 16) {
|
||||
return
|
||||
|
|
Loading…
Reference in a new issue