1
0
mirror of https://blitiri.com.ar/repos/chasquid synced 2025-12-18 14:47:03 +00:00

aliases: Add tracing to Exists and Resolve

This patch adds tracing to aliases' Exist and Resolve functions, to help
troubleshoot problems with alias resolution.
This commit is contained in:
Alberto Bertogli
2022-01-21 11:55:57 +00:00
parent feb10299be
commit d7ca50c3e0

View File

@@ -139,7 +139,9 @@ func NewResolver() *Resolver {
// Resolve the given address, returning the list of corresponding recipients // Resolve the given address, returning the list of corresponding recipients
// (if any). // (if any).
func (v *Resolver) Resolve(addr string) ([]Recipient, error) { func (v *Resolver) Resolve(addr string) ([]Recipient, error) {
return v.resolve(0, addr) tr := trace.New("Alias.Resolve", addr)
defer tr.Finish()
return v.resolve(0, addr, tr)
} }
// Exists check that the address exists in the database. // Exists check that the address exists in the database.
@@ -147,13 +149,16 @@ func (v *Resolver) Resolve(addr string) ([]Recipient, error) {
// The clean address can be used to look it up in other databases, even if it // The clean address can be used to look it up in other databases, even if it
// doesn't exist. It must only be called for local addresses. // doesn't exist. It must only be called for local addresses.
func (v *Resolver) Exists(addr string) (string, bool) { func (v *Resolver) Exists(addr string) (string, bool) {
tr := trace.New("Alias.Exists", addr)
defer tr.Finish()
addr = v.cleanIfLocal(addr) addr = v.cleanIfLocal(addr)
rcpts, _ := v.lookup(addr) rcpts, _ := v.lookup(addr, tr)
return addr, len(rcpts) > 0 return addr, len(rcpts) > 0
} }
func (v *Resolver) lookup(addr string) ([]Recipient, error) { func (v *Resolver) lookup(addr string, tr *trace.Trace) ([]Recipient, error) {
v.mu.Lock() v.mu.Lock()
rcpts := v.aliases[addr] rcpts := v.aliases[addr]
v.mu.Unlock() v.mu.Unlock()
@@ -161,12 +166,16 @@ func (v *Resolver) lookup(addr string) ([]Recipient, error) {
// Augment with the hook results. // Augment with the hook results.
hr, err := v.runResolveHook(addr) hr, err := v.runResolveHook(addr)
if err != nil { if err != nil {
tr.Debugf("lookup(%q) hook error: %v", addr, err)
return nil, err return nil, err
} }
tr.Debugf("lookup(%q) -> %v + %v", addr, rcpts, hr)
return append(rcpts, hr...), nil return append(rcpts, hr...), nil
} }
func (v *Resolver) resolve(rcount int, addr string) ([]Recipient, error) { func (v *Resolver) resolve(rcount int, addr string, tr *trace.Trace) ([]Recipient, error) {
tr.Debugf("%d| resolve(%d, %q)", rcount, rcount, addr)
if rcount >= recursionLimit { if rcount >= recursionLimit {
return nil, ErrRecursionLimitExceeded return nil, ErrRecursionLimitExceeded
} }
@@ -175,6 +184,7 @@ func (v *Resolver) resolve(rcount int, addr string) ([]Recipient, error) {
// attempted against it. // attempted against it.
// Example: an alias that resolves to a non-local address. // Example: an alias that resolves to a non-local address.
if _, ok := v.domains[envelope.DomainOf(addr)]; !ok { if _, ok := v.domains[envelope.DomainOf(addr)]; !ok {
tr.Debugf("%d| non-local domain, returning %q", rcount, addr)
return []Recipient{{addr, EMAIL}}, nil return []Recipient{{addr, EMAIL}}, nil
} }
@@ -184,12 +194,14 @@ func (v *Resolver) resolve(rcount int, addr string) ([]Recipient, error) {
addr = v.cleanIfLocal(addr) addr = v.cleanIfLocal(addr)
// Lookup in the aliases database. // Lookup in the aliases database.
rcpts, err := v.lookup(addr) rcpts, err := v.lookup(addr, tr)
if err != nil { if err != nil {
tr.Debugf("%d| error in lookup: %v", rcount, err)
return nil, err return nil, err
} }
if len(rcpts) == 0 { if len(rcpts) == 0 {
tr.Debugf("%d| no aliases found, returning %q", rcount, addr)
return []Recipient{{addr, EMAIL}}, nil return []Recipient{{addr, EMAIL}}, nil
} }
@@ -201,14 +213,16 @@ func (v *Resolver) resolve(rcount int, addr string) ([]Recipient, error) {
continue continue
} }
ar, err := v.resolve(rcount+1, r.Addr) ar, err := v.resolve(rcount+1, r.Addr, tr)
if err != nil { if err != nil {
tr.Debugf("%d| resolve(%q) returned error: %v", rcount, r.Addr, err)
return nil, err return nil, err
} }
ret = append(ret, ar...) ret = append(ret, ar...)
} }
tr.Debugf("%d| returning %v", rcount, ret)
return ret, nil return ret, nil
} }