diff --git a/internal/client/storage.go b/internal/client/storage.go index 411d869a..8d563703 100644 --- a/internal/client/storage.go +++ b/internal/client/storage.go @@ -167,7 +167,7 @@ func NewStorage(ctx context.Context, conf *StorageConfig) (s *Storage, err error mu: &sync.Mutex{}, index: newIndex(), runtimeIndex: newRuntimeIndex(), - upstreamManager: newUpstreamManager(), + upstreamManager: newUpstreamManager(conf.Logger), dhcp: conf.DHCP, etcHosts: conf.EtcHosts, arpDB: conf.ARPDB, diff --git a/internal/client/upstreammanager.go b/internal/client/upstreammanager.go index 2e79a024..34222222 100644 --- a/internal/client/upstreammanager.go +++ b/internal/client/upstreammanager.go @@ -1,6 +1,7 @@ package client import ( + "log/slog" "slices" "time" @@ -8,6 +9,7 @@ import ( "github.com/AdguardTeam/dnsproxy/proxy" "github.com/AdguardTeam/dnsproxy/upstream" "github.com/AdguardTeam/golibs/errors" + "github.com/AdguardTeam/golibs/logutil/slogutil" "github.com/AdguardTeam/golibs/stringutil" ) @@ -33,6 +35,12 @@ type customUpstreamConfig struct { // upstreamManager stores and updates custom client upstream configurations. type upstreamManager struct { + // logger is used for logging the operation of the upstream manager. It + // must not be nil. + // + // TODO(s.chzhen): Consider using a logger with its own prefix. + logger *slog.Logger + // uidToCustomConf maps persistent client UID to the custom client upstream // configuration. uidToCustomConf map[UID]*customUpstreamConfig @@ -46,8 +54,9 @@ type upstreamManager struct { } // newUpstreamManager returns the new properly initialized upstream manager. -func newUpstreamManager() (m *upstreamManager) { +func newUpstreamManager(logger *slog.Logger) (m *upstreamManager) { return &upstreamManager{ + logger: logger, uidToCustomConf: make(map[UID]*customUpstreamConfig), } } @@ -68,6 +77,14 @@ func (m *upstreamManager) customUpstreamConfig( return cliConf.prxConf } + if ok && cliConf.prxConf != nil { + err := cliConf.prxConf.Close() + if err != nil { + // TODO(s.chzhen): Pass context. + m.logger.Debug("closing custom upstream config", slogutil.KeyError, err) + } + } + prxConf = newCustomUpstreamConfig(c, m.commonConf) m.uidToCustomConf[c.UID] = &customUpstreamConfig{ prxConf: prxConf,