diff --git a/pkg/storage/postgres/backend.go b/pkg/storage/postgres/backend.go index 81e48a33e..63bd25095 100644 --- a/pkg/storage/postgres/backend.go +++ b/pkg/storage/postgres/backend.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "net" "sync" "time" @@ -320,7 +321,7 @@ func (backend *Backend) init(ctx context.Context) (serverVersion uint64, pool *p return serverVersion, pool, nil } - config, err := pgxpool.ParseConfig(backend.dsn) + config, err := ParseConfig(backend.dsn) if err != nil { return serverVersion, nil, err } @@ -374,3 +375,23 @@ func (backend *Backend) doPeriodically(f func(ctx context.Context) error, dur ti } } } + +// ParseConfig parses a DSN into a pgxpool.Config. +func ParseConfig(dsn string) (*pgxpool.Config, error) { + config, err := pgxpool.ParseConfig(dsn) + if err != nil { + return nil, err + } + config.ConnConfig.LookupFunc = lookup + return config, nil +} + +func lookup(ctx context.Context, host string) (addrs []string, err error) { + addrs, err = net.DefaultResolver.LookupHost(ctx, host) + // ignore no such host errors + if e := new(net.DNSError); errors.As(err, &e) && e.IsNotFound { + addrs = nil + err = nil + } + return addrs, err +} diff --git a/pkg/storage/postgres/backend_test.go b/pkg/storage/postgres/backend_test.go index e32dc7d70..69a030731 100644 --- a/pkg/storage/postgres/backend_test.go +++ b/pkg/storage/postgres/backend_test.go @@ -184,3 +184,17 @@ func TestBackend(t *testing.T) { return nil })) } + +func TestLookup(t *testing.T) { + t.Parallel() + + ctx, clearTimeout := context.WithTimeout(context.Background(), time.Second*10) + t.Cleanup(clearTimeout) + + cfg, err := ParseConfig("host=localhost") + assert.NoError(t, err) + + addrs, err := cfg.ConnConfig.LookupFunc(ctx, "test.unknown") + assert.NoError(t, err) + assert.Empty(t, addrs) +}