From 68d13fcc2b949bbf3c782076a54d6bd5fb1d3a8e Mon Sep 17 00:00:00 2001
From: Eugene Burkov <e.burkov@adguard.com>
Date: Thu, 20 Oct 2022 18:22:37 +0300
Subject: [PATCH] Pull request: 5052 Close errors

Merge in DNS/adguard-home from 5052-nonfatal-close to master

Updates #5052.

Squashed commit of the following:

commit 8411de465a29517640556e7d2390059482e01e8a
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date:   Thu Oct 20 16:54:52 2022 +0300

    dnsforward: imp code

commit d6dff964397d6d878267f24b844bc6040edec316
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date:   Thu Oct 20 16:48:55 2022 +0300

    dnsforward: revert tmp stuff

commit 519aaf21cd1929141ea1902388d40599dced55ea
Author: Eugene Burkov <E.Burkov@AdGuard.COM>
Date:   Thu Oct 20 16:28:32 2022 +0300

    dnsforward: fix ups closing errors
---
 internal/dnsforward/dnsforward.go | 32 +++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)

diff --git a/internal/dnsforward/dnsforward.go b/internal/dnsforward/dnsforward.go
index f31e28b4..b6f5c4cf 100644
--- a/internal/dnsforward/dnsforward.go
+++ b/internal/dnsforward/dnsforward.go
@@ -560,31 +560,43 @@ func (s *Server) Stop() error {
 
 // stopLocked stops the DNS server without locking.  For internal use only.
 func (s *Server) stopLocked() (err error) {
-	var errs []error
-
 	if s.dnsProxy != nil {
 		err = s.dnsProxy.Stop()
 		if err != nil {
-			errs = append(errs, fmt.Errorf("could not stop primary resolvers properly: %w", err))
+			return fmt.Errorf("closing primary resolvers: %w", err)
 		}
 	}
 
-	if s.internalProxy != nil && s.internalProxy.UpstreamConfig != nil {
-		err = s.internalProxy.UpstreamConfig.Close()
+	var errs []error
+
+	if upsConf := s.internalProxy.UpstreamConfig; upsConf != nil {
+		const action = "closing internal resolvers"
+
+		err = upsConf.Close()
 		if err != nil {
-			errs = append(errs, fmt.Errorf("could not stop internal resolvers properly: %w", err))
+			if errors.Is(err, net.ErrClosed) {
+				log.Debug("dnsforward: %s: %s", action, err)
+			} else {
+				errs = append(errs, fmt.Errorf("%s: %w", action, err))
+			}
 		}
 	}
 
-	if s.localResolvers != nil && s.localResolvers.UpstreamConfig != nil {
-		err = s.localResolvers.UpstreamConfig.Close()
+	if upsConf := s.localResolvers.UpstreamConfig; upsConf != nil {
+		const action = "closing local resolvers"
+
+		err = upsConf.Close()
 		if err != nil {
-			errs = append(errs, fmt.Errorf("could not stop local resolvers properly: %w", err))
+			if errors.Is(err, net.ErrClosed) {
+				log.Debug("dnsforward: %s: %s", action, err)
+			} else {
+				errs = append(errs, fmt.Errorf("%s: %w", action, err))
+			}
 		}
 	}
 
 	if len(errs) > 0 {
-		return errors.List("stopping DNS server", errs...)
+		return errors.List("stopping dns server", errs...)
 	} else {
 		s.isRunning = false
 	}