Skip to content

Commit 7178d59

Browse files
committed
dot: use core.ConnPool
1 parent bc82739 commit 7178d59

File tree

1 file changed

+60
-13
lines changed

1 file changed

+60
-13
lines changed

intra/dns53/dot.go

+60-13
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import (
2525
"golang.org/x/net/context"
2626
)
2727

28+
const usepool = true
29+
2830
type dot struct {
2931
ctx context.Context
3032
done context.CancelFunc
@@ -37,6 +39,7 @@ type dot struct {
3739
c *dns.Client
3840
c3 *dns.Client // with ech
3941
rd *protect.RDial
42+
pool *core.MultConnPool[uintptr]
4043
proxies ipn.Proxies // may be nil
4144
relay ipn.Proxy // may be nil
4245
est core.P2QuantileEstimator
@@ -93,6 +96,7 @@ func NewTLSTransport(ctx context.Context, id, rawurl string, addrs []string, px
9396
proxies: px,
9497
rd: rd,
9598
relay: relay,
99+
pool: core.NewMultConnPool[uintptr](ctx),
96100
est: core.NewP50Estimator(ctx),
97101
}
98102
ech := t.ech()
@@ -153,13 +157,19 @@ func (t *dot) doQuery(pid string, q *dns.Msg) (response *dns.Msg, elapsed time.D
153157
return
154158
}
155159

156-
func (t *dot) tlsdial(rd protect.RDialer) (_ *dns.Conn, err error) {
160+
func (t *dot) tlsdial(rd protect.RDialer) (_ *dns.Conn, who uintptr, err error) {
161+
who = rd.Handle()
162+
if c := t.fromPool(who); c != nil {
163+
return c, who, nil
164+
}
165+
166+
var usingech bool
157167
var c net.Conn = nil // dot is always tcp
158168
addr := t.addr // t.addr may be ip or hostname
159169
if t.c3 != nil { // may be nil if ech is not available
160170
cfg := t.c3.TLSConfig // don't clone; may be modified by dialers.DialWithTls
161171
c, err = dialers.DialWithTls(rd, cfg, "tcp", addr)
162-
log.W("dot: tlsdial: (%s) ech; err? %v", t.id, err)
172+
usingech = true
163173
}
164174
if c == nil && core.IsNil(c) { // no ech or ech failed
165175
cfg := t.c.TLSConfig
@@ -169,34 +179,64 @@ func (t *dot) tlsdial(rd protect.RDialer) (_ *dns.Conn, err error) {
169179
_ = c.SetDeadline(time.Now().Add(dottimeout))
170180
// todo: higher timeout for if using proxy dialer
171181
// _ = c.SetDeadline(time.Now().Add(dottimeout * 2))
172-
return &dns.Conn{Conn: c, UDPSize: t.c.UDPSize}, err
182+
return &dns.Conn{Conn: c, UDPSize: t.c.UDPSize}, who, err
173183
} else {
174184
if err == nil {
175-
log.W("dot: tlsdial: (%s) nil conn/err for %s", t.id, addr)
176185
err = errNoNet
177186
}
187+
log.W("dot: tlsdial: (%s) nil conn/err for %s, ech? %t; err? %v",
188+
t.id, addr, usingech, err)
178189
}
179-
return nil, err
190+
return nil, who, err
180191
}
181192

182-
func (t *dot) pxdial(pid string) (*dns.Conn, error) {
193+
func (t *dot) pxdial(pid string) (*dns.Conn, uintptr, error) {
183194
var px ipn.Proxy
184195
if t.relay != nil { // relay takes precedence
185196
px = t.relay
186197
} else if t.proxies != nil { // use proxy, if specified
187198
var err error
188199
if px, err = t.proxies.ProxyFor(pid); err != nil {
189-
return nil, err
200+
return nil, core.Nobody, err
190201
}
191202
}
192203
if px == nil {
193-
return nil, dnsx.ErrNoProxyProvider
204+
return nil, core.Nobody, dnsx.ErrNoProxyProvider
194205
}
206+
pid = px.ID()
195207
log.V("dot: pxdial: (%s) using relay/proxy %s at %s",
196-
t.id, px.ID(), px.GetAddr())
208+
t.id, pid, px.GetAddr())
209+
197210
return t.tlsdial(px.Dialer())
198211
}
199212

213+
func (t *dot) toPool(id uintptr, c *dns.Conn) {
214+
if !usepool || id == core.Nobody {
215+
clos(c)
216+
return
217+
}
218+
ok := t.pool.Put(id, c)
219+
log.V("dot: pool: (%s) put for %v; ok? %t", t.id, id, ok)
220+
}
221+
222+
func (t *dot) fromPool(id uintptr) (c *dns.Conn) {
223+
if !usepool || id == core.Nobody {
224+
return
225+
}
226+
227+
pooled := t.pool.Get(id)
228+
if pooled == nil || core.IsNil(pooled) {
229+
return
230+
}
231+
var ok bool
232+
if c, ok = pooled.(*dns.Conn); !ok { // unlikely
233+
clos(pooled)
234+
return
235+
}
236+
log.V("dot: pool: (%s) got conn from %v; %d", t.id, id)
237+
return
238+
}
239+
200240
func clos(c net.Conn) {
201241
core.CloseConn(c)
202242
}
@@ -210,18 +250,17 @@ func (t *dot) sendRequest(pid string, q *dns.Msg) (ans *dns.Msg, elapsed time.Du
210250
}
211251

212252
var conn *dns.Conn
253+
var who uintptr
213254
userelay := t.relay != nil
214255
useproxy := len(pid) != 0 // pid == dnsx.NetNoProxy => ipn.Base
215256
if useproxy || userelay {
216-
conn, err = t.pxdial(pid)
257+
conn, who, err = t.pxdial(pid)
217258
} else { // ref dns.Client.Dial
218-
conn, err = t.tlsdial(t.rd)
259+
conn, who, err = t.tlsdial(t.rd)
219260
}
220261

221262
if err == nil {
222-
// FIXME: conn pooling using t.c.Dial + ExchangeWithConn
223263
ans, elapsed, err = t.c.ExchangeWithConn(q, conn)
224-
clos(conn)
225264
} // fallthrough
226265

227266
raddr := remoteAddrIfAny(conn)
@@ -232,6 +271,7 @@ func (t *dot) sendRequest(pid string, q *dns.Msg) (ans *dns.Msg, elapsed time.Du
232271
t.id, xdns.Size(q), xdns.EDNS0PadLen(q), err, ok, t.host, raddr)
233272
qerr = dnsx.NewSendFailedQueryError(err)
234273
} else {
274+
t.toPool(who, conn) // or close
235275
dialers.Confirm2(t.host, raddr)
236276
}
237277
return
@@ -321,3 +361,10 @@ func url2addr(url string) string {
321361
}
322362
return url
323363
}
364+
365+
func logev(err error) log.LogFn {
366+
if err != nil {
367+
return log.E
368+
}
369+
return log.V
370+
}

0 commit comments

Comments
 (0)