mirror of
https://github.com/tailscale/tailscale.git
synced 2025-11-16 19:07:42 +00:00
control/controlclient: restore aggressive Direct.Close teardown
In the earlier http2 package migration (1d93bdce20, #17394) I had
removed Direct.Close's tracking of the connPool, thinking it wasn't
necessary.
Some tests (in another repo) are strict and like it to tear down the
world and wait, to check for leaked goroutines. And they caught this
letting some goroutines idle past Close, even if they'd eventually
close down on their own.
This restores the connPool accounting and the aggressife close.
Updates #17305
Updates #17394
Change-Id: I5fed283a179ff7c3e2be104836bbe58b05130cc7
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
committed by
Brad Fitzpatrick
parent
cd523eae52
commit
206d98e84b
@@ -31,6 +31,7 @@ import (
|
||||
type Conn struct {
|
||||
*controlbase.Conn
|
||||
|
||||
onClose func() // or nil
|
||||
readHeaderOnce sync.Once // guards init of reader field
|
||||
reader io.Reader // (effectively Conn.Reader after header)
|
||||
earlyPayloadReady chan struct{} // closed after earlyPayload is set (including set to nil)
|
||||
@@ -44,11 +45,12 @@ type Conn struct {
|
||||
// http2.ClientConn will be created that reads from the returned Conn.
|
||||
//
|
||||
// connID should be a unique ID for this connection. When the Conn is closed,
|
||||
// the onClose function will be called with the connID if it is non-nil.
|
||||
func NewConn(conn *controlbase.Conn) *Conn {
|
||||
// the onClose function will be called if it is non-nil.
|
||||
func NewConn(conn *controlbase.Conn, onClose func()) *Conn {
|
||||
return &Conn{
|
||||
Conn: conn,
|
||||
earlyPayloadReady: make(chan struct{}),
|
||||
onClose: sync.OnceFunc(onClose),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,6 +105,14 @@ func (c *Conn) Read(p []byte) (n int, err error) {
|
||||
return c.reader.Read(p)
|
||||
}
|
||||
|
||||
// Close closes the connection.
|
||||
func (c *Conn) Close() error {
|
||||
if c.onClose != nil {
|
||||
defer c.onClose()
|
||||
}
|
||||
return c.Conn.Close()
|
||||
}
|
||||
|
||||
// readHeader reads the optional "early payload" from the server that arrives
|
||||
// after the Noise handshake but before the HTTP/2 session begins.
|
||||
//
|
||||
|
||||
Reference in New Issue
Block a user