make the TestRPC_RPCMaxConnsPerClient test less flaky (#7255)

This commit is contained in:
R.B. Boyer 2020-02-10 15:13:53 -06:00 committed by GitHub
parent 833b9efd0b
commit c37d00791c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 35 additions and 8 deletions

View File

@ -631,7 +631,13 @@ func TestRPC_RPCMaxConnsPerClient(t *testing.T) {
defer conn3.Close() defer conn3.Close()
// If we close one of the earlier ones, we should be able to open another // If we close one of the earlier ones, we should be able to open another
addr := conn1.RemoteAddr()
conn1.Close() conn1.Close()
retry.Run(t, func(r *retry.R) {
if n := s1.rpcConnLimiter.NumOpen(addr); n >= 2 {
r.Fatal("waiting for open conns to drop")
}
})
conn4 := connectClient(t, s1, tc.magicByte, tc.tlsEnabled, true, "conn4") conn4 := connectClient(t, s1, tc.magicByte, tc.tlsEnabled, true, "conn4")
defer conn4.Close() defer conn4.Close()

2
go.mod
View File

@ -32,7 +32,7 @@ require (
github.com/hashicorp/go-bexpr v0.1.2 github.com/hashicorp/go-bexpr v0.1.2
github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de
github.com/hashicorp/go-cleanhttp v0.5.1 github.com/hashicorp/go-cleanhttp v0.5.1
github.com/hashicorp/go-connlimit v0.1.0 github.com/hashicorp/go-connlimit v0.2.0
github.com/hashicorp/go-discover v0.0.0-20191202160150-7ec2cfbda7a2 github.com/hashicorp/go-discover v0.0.0-20191202160150-7ec2cfbda7a2
github.com/hashicorp/go-hclog v0.12.0 github.com/hashicorp/go-hclog v0.12.0
github.com/hashicorp/go-memdb v1.0.3 github.com/hashicorp/go-memdb v1.0.3

4
go.sum
View File

@ -122,8 +122,8 @@ github.com/hashicorp/go-checkpoint v0.0.0-20171009173528-1545e56e46de/go.mod h1:
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-connlimit v0.1.0 h1:j8XwYaCBgm7n82jaQpaUeaDlsJH1x5/ycAJhlkrXv7E= github.com/hashicorp/go-connlimit v0.2.0 h1:OZjcfNxH/hPh/bT2Iw5yOJcLzz+zuIWpsp3I1S4Pjw4=
github.com/hashicorp/go-connlimit v0.1.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0= github.com/hashicorp/go-connlimit v0.2.0/go.mod h1:OUj9FGL1tPIhl/2RCfzYHrIiWj+VVPGNyVPnUX8AqS0=
github.com/hashicorp/go-discover v0.0.0-20191202160150-7ec2cfbda7a2 h1:r7GtRT+VXoM5WqHMxSVDIKgVCfK9T8CoS51RDKeOjBM= github.com/hashicorp/go-discover v0.0.0-20191202160150-7ec2cfbda7a2 h1:r7GtRT+VXoM5WqHMxSVDIKgVCfK9T8CoS51RDKeOjBM=
github.com/hashicorp/go-discover v0.0.0-20191202160150-7ec2cfbda7a2/go.mod h1:NnH5X4UCBEBdTuK2L8s4e4ilJm3UmGX0bANHCz0HSs0= github.com/hashicorp/go-discover v0.0.0-20191202160150-7ec2cfbda7a2/go.mod h1:NnH5X4UCBEBdTuK2L8s4e4ilJm3UmGX0bANHCz0HSs0=
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI= github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=

View File

@ -64,7 +64,7 @@ func NewLimiter(cfg Config) *Limiter {
// or transient failure to read or parse the remote IP. The free func will be a // or transient failure to read or parse the remote IP. The free func will be a
// no-op in this case and need not be called. // no-op in this case and need not be called.
func (l *Limiter) Accept(conn net.Conn) (func(), error) { func (l *Limiter) Accept(conn net.Conn) (func(), error) {
addrKey := addrKey(conn) addrKey := connKey(conn)
// Load config outside locked section since it's not updated under lock anyway // Load config outside locked section since it's not updated under lock anyway
// and the atomic Load might be slower/contented so better to do outside lock. // and the atomic Load might be slower/contented so better to do outside lock.
@ -101,8 +101,29 @@ func (l *Limiter) Accept(conn net.Conn) (func(), error) {
return free, nil return free, nil
} }
func addrKey(conn net.Conn) string { func (l *Limiter) NumOpen(addr net.Addr) int {
addr := conn.RemoteAddr() addrKey := addrKey(addr)
l.l.Lock()
defer l.l.Unlock()
if l.cs == nil {
return 0
}
cs := l.cs[addrKey]
if cs == nil {
return 0
}
return len(cs)
}
func connKey(conn net.Conn) string {
return addrKey(conn.RemoteAddr())
}
func addrKey(addr net.Addr) string {
switch a := addr.(type) { switch a := addr.(type) {
case *net.TCPAddr: case *net.TCPAddr:
return "ip:" + a.IP.String() return "ip:" + a.IP.String()
@ -119,7 +140,7 @@ func addrKey(conn net.Conn) string {
// freeConn removes a connection from the map if it's present. It is a no-op if // freeConn removes a connection from the map if it's present. It is a no-op if
// the conn was never accepted by Accept. // the conn was never accepted by Accept.
func (l *Limiter) freeConn(conn net.Conn) { func (l *Limiter) freeConn(conn net.Conn) {
addrKey := addrKey(conn) addrKey := connKey(conn)
l.l.Lock() l.l.Lock()
defer l.l.Unlock() defer l.l.Unlock()

2
vendor/modules.txt vendored
View File

@ -177,7 +177,7 @@ github.com/hashicorp/go-bexpr
github.com/hashicorp/go-checkpoint github.com/hashicorp/go-checkpoint
# github.com/hashicorp/go-cleanhttp v0.5.1 # github.com/hashicorp/go-cleanhttp v0.5.1
github.com/hashicorp/go-cleanhttp github.com/hashicorp/go-cleanhttp
# github.com/hashicorp/go-connlimit v0.1.0 # github.com/hashicorp/go-connlimit v0.2.0
github.com/hashicorp/go-connlimit github.com/hashicorp/go-connlimit
# github.com/hashicorp/go-discover v0.0.0-20191202160150-7ec2cfbda7a2 # github.com/hashicorp/go-discover v0.0.0-20191202160150-7ec2cfbda7a2
github.com/hashicorp/go-discover github.com/hashicorp/go-discover