Skip to content

Commit d441010

Browse files
authored
Merge pull request #15 from threefoldtech/client_backoff
add backoff in client so it will retry to connect forever until the process is stopped
2 parents 103f516 + 1ce0ea8 commit d441010

File tree

7 files changed

+129
-66
lines changed

7 files changed

+129
-66
lines changed

client.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package tcprouter
22

33
import (
44
"fmt"
5+
"github.com/rs/zerolog/log"
56
"io"
6-
"log"
77
"net"
88
)
99

@@ -77,7 +77,7 @@ func (c *client) Forward() {
7777

7878
err := <-cErr
7979
if err != nil {
80-
log.Printf("Error during connection: %v", err)
80+
log.Error().Err(err).Msg("Error during connection")
8181
}
8282

8383
<-cErr
@@ -90,7 +90,7 @@ func forward(dst, src net.Conn, cErr chan<- error) {
9090
tcpConn, ok := dst.(*net.TCPConn)
9191
if ok {
9292
if err := tcpConn.CloseWrite(); err != nil {
93-
log.Printf("Error while terminating connection: %v", err)
93+
log.Error().Err(err).Msg("Error while terminating connection")
9494
}
9595
}
9696
}

cmds/client/main.go

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,66 @@ package main
22

33
import (
44
"flag"
5-
"log"
5+
"fmt"
6+
"os"
7+
"time"
68

9+
"github.com/cenkalti/backoff/v3"
10+
"github.com/rs/zerolog"
11+
"github.com/rs/zerolog/log"
712
"github.com/xmonader/tcprouter"
813
)
914

1015
var (
1116
secret string
1217
remoteAddr string
1318
localAddr string
19+
boDuration int
1420
)
1521

1622
func main() {
23+
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
24+
1725
flag.StringVar(&secret, "secret", "", "secret to identity the connection")
1826
flag.StringVar(&remoteAddr, "remote", "", "address to the TCP router server")
1927
flag.StringVar(&localAddr, "local", "", "address to the local application")
28+
flag.IntVar(&boDuration, "backoff", 5, "backoff in second")
2029
flag.Parse()
2130

22-
// // TODO: validate secret format
23-
// s := tcprouter.Secret(secret)
24-
// if err := s.Validate(); err != nil {
25-
// log.Fatalf("invalid secret format: %v", err)
26-
// }
27-
2831
client := tcprouter.NewClient(secret)
29-
for {
30-
log.Printf("connect to TCP router server at %v", remoteAddr)
31-
if err := client.ConnectRemote(remoteAddr); err != nil {
32-
log.Fatalf("failed to connect to TCP router server %v", err)
33-
}
32+
op := func() error {
33+
for {
34+
log.Info().
35+
Str("addr", remoteAddr).
36+
Msg("connect to TCP router server")
37+
if err := client.ConnectRemote(remoteAddr); err != nil {
38+
return fmt.Errorf("failed to connect to TCP router server: %w", err)
39+
}
3440

35-
log.Printf("start hanshake")
36-
if err := client.Handshake(); err != nil {
37-
log.Fatalf("failed to hanshake with TCP router server %v", err)
38-
}
39-
log.Printf("hanshake done")
41+
log.Info().Msg("start hanshake")
42+
if err := client.Handshake(); err != nil {
43+
return fmt.Errorf("failed to hanshake with TCP router server: %w", err)
44+
}
45+
log.Info().Msg("hanshake done")
4046

41-
log.Printf("connect to local application at %v", localAddr)
42-
if err := client.ConnectLocal(localAddr); err != nil {
43-
log.Fatalf("failed to connect to local application %v", err)
47+
log.Info().
48+
Str("addr", localAddr).
49+
Msg("connect to local application")
50+
if err := client.ConnectLocal(localAddr); err != nil {
51+
return fmt.Errorf("failed to connect to local application: %w", err)
52+
}
53+
54+
log.Info().Msg("wait incoming traffic")
55+
client.Forward()
4456
}
57+
}
4558

46-
log.Printf("wait incoming traffic")
47-
client.Forward()
59+
bo := backoff.NewConstantBackOff(time.Second * time.Duration(boDuration))
60+
notify := func(err error, d time.Duration) {
61+
log.Error().Err(err).Msgf("retry in %s", d)
4862
}
4963

64+
if err := backoff.RetryNotify(op, bo, notify); err != nil {
65+
log.Fatal().Err(err).Send()
66+
}
5067
}

cmds/server/main.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ import (
44
"context"
55
"flag"
66
"fmt"
7+
"github.com/rs/zerolog"
8+
"github.com/rs/zerolog/log"
79
"os/signal"
810

9-
"log"
1011
"os"
1112
"time"
1213

@@ -25,7 +26,10 @@ var validBackends = map[string]store.Backend{
2526
func readConfig(path string) (tcprouter.Config, error) {
2627
f, err := os.Open(path)
2728
if err != nil {
28-
log.Fatalf("failed to open configuration file at %s: %v", path, err)
29+
log.Fatal().
30+
Str("path", path).
31+
Err(err).
32+
Msg("failed to open configuration file")
2933
}
3034
defer f.Close()
3135

@@ -63,25 +67,30 @@ var (
6367

6468
func main() {
6569

70+
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
71+
6672
flag.StringVar(&cfgPath, "config", "", "Configuration file path")
6773
flag.Parse()
6874

6975
log.Printf("reading config from: %v", cfgPath)
7076
cfg, err := readConfig(cfgPath)
7177
if err != nil {
72-
log.Fatalf("failed to read configuration: %v", err)
78+
log.Fatal().Err(err).Msg("failed to read configuration")
7379
}
7480
log.Printf("main config: %+v", cfg)
7581

7682
if err := initBackend(cfg); err != nil {
77-
log.Fatalf("failed to initialize database backend: %v", err)
83+
log.Fatal().Err(err).Msg("failed to initialize database backend")
7884
}
7985

8086
backend := cfg.Server.DbBackend.Backend()
8187
addr := cfg.Server.DbBackend.Addr()
8288
kv, err := initStore(backend, addr)
8389
if err != nil {
84-
log.Fatalf("Cannot create %s store: %v", backend, err)
90+
log.Fatal().
91+
Err(err).
92+
Str("backend type", string(backend)).
93+
Msg("Cannot create backend store")
8594
}
8695

8796
serverOpts := tcprouter.ServerOptions{

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ go 1.13
55
require (
66
github.com/BurntSushi/toml v0.3.1
77
github.com/abronan/valkeyrie v0.0.0-20191010124425-1ae9442de16e
8+
github.com/cenkalti/backoff/v3 v3.1.1
89
github.com/magiconair/properties v1.8.1
10+
github.com/rs/zerolog v1.15.0
911
github.com/stretchr/testify v1.3.0
1012
)

go.sum

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
1515
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
1616
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
1717
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
18+
github.com/cenkalti/backoff/v3 v3.1.1 h1:UBHElAnr3ODEbpqPzX8g5sBcASjoLFtt3L/xwJ01L6E=
19+
github.com/cenkalti/backoff/v3 v3.1.1/go.mod h1:cIeZDE3IrqwwJl6VUwCN6trj1oXrTS4rc0ij+ULvLYs=
1820
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
1921
github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
2022
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
2123
github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
2224
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
2325
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
26+
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
2427
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
2528
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
2629
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -133,9 +136,13 @@ github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R
133136
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
134137
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
135138
github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
139+
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
140+
github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY=
141+
github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc=
136142
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
137143
github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
138144
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
145+
github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
139146
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
140147
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
141148
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
@@ -146,6 +153,7 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
146153
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
147154
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
148155
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
156+
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
149157
go.etcd.io/bbolt v1.3.1-etcd.8/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
150158
go.etcd.io/etcd v3.3.13+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI=
151159
go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
@@ -154,6 +162,7 @@ go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
154162
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
155163
golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
156164
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
165+
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc=
157166
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
158167
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
159168
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -162,6 +171,7 @@ golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73r
162171
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
163172
golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
164173
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
174+
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
165175
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
166176
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU=
167177
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -171,6 +181,7 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ
171181
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
172182
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
173183
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
184+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
174185
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
175186
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
176187
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -186,6 +197,7 @@ golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
186197
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
187198
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
188199
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
200+
golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
189201
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
190202
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
191203
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=

0 commit comments

Comments
 (0)