Skip to content

Commit 0c98c72

Browse files
committed
feat: allow dial timeout and keep alive period to be configurable
Settings are applied to every connection. Signed-off-by: Andrey Smirnov <[email protected]>
1 parent 3c8f347 commit 0c98c72

File tree

3 files changed

+27
-8
lines changed

3 files changed

+27
-8
lines changed

go.mod

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@ module github.com/talos-systems/go-loadbalancer
22

33
go 1.14
44

5+
replace inet.af/tcpproxy => github.com/smira/tcpproxy v0.0.0-20201015133617-de5f7797b95b
6+
57
require (
68
github.com/davecgh/go-spew v1.1.1 // indirect
79
github.com/kr/pretty v0.1.0 // indirect
810
github.com/stretchr/testify v1.6.1
911
github.com/talos-systems/go-retry v0.1.0
12+
golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211 // indirect
1013
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect
1114
inet.af/tcpproxy v0.0.0-20200125044825-b6bb9b5b8252
1215
)

go.sum

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,17 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
88
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
99
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1010
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
11+
github.com/smira/tcpproxy v0.0.0-20201015133617-de5f7797b95b h1:95WXQlM2dDPgIXTlnpwiJPa0l0ipl1RwMvdy8KLUyH8=
12+
github.com/smira/tcpproxy v0.0.0-20201015133617-de5f7797b95b/go.mod h1:yDIWrelwlTRXdKvQqqQ+8lCwCjbSRtkat49REnui7hk=
1113
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
1214
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
1315
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
14-
github.com/talos-systems/go-retry v0.0.0-20200902131929-073067bd95a7 h1:KL8Nz3tlwA1UhTsoGQXwg1gDoYPldiwfTtcipcuALXM=
15-
github.com/talos-systems/go-retry v0.0.0-20200902131929-073067bd95a7/go.mod h1:HiXQqyVStZ35uSY/MTLWVvQVmC3lIW2MS5VdDaMtoKM=
1616
github.com/talos-systems/go-retry v0.1.0 h1:O+OeZR54CQ1+ch99p/81Pqi5GqJH6LIu1MTN/N0vd78=
1717
github.com/talos-systems/go-retry v0.1.0/go.mod h1:HiXQqyVStZ35uSY/MTLWVvQVmC3lIW2MS5VdDaMtoKM=
18+
golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211 h1:9UQO31fZ+0aKQOFldThf7BKPMJTiBfWycGh/u3UoO88=
19+
golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
1820
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
1921
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
2022
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
2123
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
2224
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
23-
inet.af/tcpproxy v0.0.0-20200125044825-b6bb9b5b8252 h1:gmJCKidOfjKDUHF1jjke+I+2iQIyE3HNNxu2OKO/FUI=
24-
inet.af/tcpproxy v0.0.0-20200125044825-b6bb9b5b8252/go.mod h1:zq+R+tLcdHugi7Jt+FtIQY6m6wtX34lr2CdQVH2fhW0=

loadbalancer/loadbalancer.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"fmt"
1111
"log"
1212
"net"
13+
"time"
1314

1415
"inet.af/tcpproxy"
1516

@@ -27,6 +28,10 @@ import (
2728
type TCP struct {
2829
tcpproxy.Proxy
2930

31+
DialTimeout time.Duration
32+
KeepAlivePeriod time.Duration
33+
TCPUserTimeout time.Duration
34+
3035
Logger *log.Logger
3136

3237
routes map[string]*upstream.List
@@ -51,8 +56,11 @@ func (upstream lbUpstream) HealthCheck(ctx context.Context) error {
5156
}
5257

5358
type lbTarget struct {
54-
list *upstream.List
55-
logger *log.Logger
59+
list *upstream.List
60+
logger *log.Logger
61+
dialTimeout time.Duration
62+
keepAlivePeriod time.Duration
63+
tcpUserTimeout time.Duration
5664
}
5765

5866
func (target *lbTarget) HandleConn(conn net.Conn) {
@@ -69,6 +77,9 @@ func (target *lbTarget) HandleConn(conn net.Conn) {
6977
target.logger.Printf("proxying connection %s -> %s", conn.RemoteAddr(), upstream.upstream)
7078

7179
upstreamTarget := tcpproxy.To(upstream.upstream)
80+
upstreamTarget.DialTimeout = target.dialTimeout
81+
upstreamTarget.KeepAlivePeriod = target.keepAlivePeriod
82+
upstreamTarget.TCPUserTimeout = target.tcpUserTimeout
7283
upstreamTarget.OnDialError = func(src net.Conn, dstDialErr error) {
7384
src.Close() //nolint: errcheck
7485

@@ -78,6 +89,8 @@ func (target *lbTarget) HandleConn(conn net.Conn) {
7889
}
7990

8091
upstreamTarget.HandleConn(conn)
92+
93+
target.logger.Printf("closing connection %s -> %s", conn.RemoteAddr(), upstream.upstream)
8194
}
8295

8396
// AddRoute installs load balancer route from listen address ipAddr to list of upstreams.
@@ -109,8 +122,11 @@ func (t *TCP) AddRoute(ipPort string, upstreamAddrs []string, options ...upstrea
109122
t.routes[ipPort] = list
110123

111124
t.Proxy.AddRoute(ipPort, &lbTarget{
112-
list: list,
113-
logger: t.Logger,
125+
list: list,
126+
logger: t.Logger,
127+
dialTimeout: t.DialTimeout,
128+
keepAlivePeriod: t.KeepAlivePeriod,
129+
tcpUserTimeout: t.TCPUserTimeout,
114130
})
115131

116132
return nil

0 commit comments

Comments
 (0)