Skip to content

Commit a68c19d

Browse files
committed
add tcp-pinger for measuring rtt of mailservers
Signed-off-by: Jakub Sokołowski <[email protected]>
1 parent 89659f8 commit a68c19d

File tree

88 files changed

+3308
-146
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

88 files changed

+3308
-146
lines changed

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ require (
2727
github.com/mutecomm/go-sqlcipher v0.0.0-20190227152316-55dbde17881f
2828
github.com/okzk/sdnotify v0.0.0-20180710141335-d9becc38acbd
2929
github.com/pborman/uuid v1.2.0
30+
github.com/pkg/errors v0.8.1
3031
github.com/prometheus/client_golang v1.2.1
3132
github.com/russolsen/transit v0.0.0-20180705123435-0794b4c4505a
3233
github.com/status-im/migrate/v4 v4.6.2-status.2
3334
github.com/status-im/rendezvous v1.3.0
3435
github.com/status-im/status-protocol-go v0.4.5-0.20191107122821-775d17008edf
36+
github.com/status-im/tcp-shaker v0.0.0-20191113131324-2a8efc760922
3537
github.com/status-im/whisper v1.5.2
3638
github.com/stretchr/testify v1.4.0
3739
github.com/syndtr/goleveldb v1.0.0

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,8 @@ github.com/status-im/rendezvous v1.3.0 h1:7RK/MXXW+tlm0asKm1u7Qp7Yni6AO29a7j8+E4
578578
github.com/status-im/rendezvous v1.3.0/go.mod h1:+hzjuP+j/XzLPeF6E50b88pWOTLdTcwjvNYt+Gh1W1s=
579579
github.com/status-im/status-protocol-go v0.4.5-0.20191107122821-775d17008edf h1:1boOd5yMePhXxYei97Rm/hFF45alUpMl87ZAWvlSKtg=
580580
github.com/status-im/status-protocol-go v0.4.5-0.20191107122821-775d17008edf/go.mod h1:r8TgqNOpY+fGKkBfR9PldxSSaBN0EsEEY4a3WsIh9LY=
581+
github.com/status-im/tcp-shaker v0.0.0-20191113131324-2a8efc760922 h1:SH100V6uGyAv5pP186c125A67AZQ+jhY77kE8Ek0lo4=
582+
github.com/status-im/tcp-shaker v0.0.0-20191113131324-2a8efc760922/go.mod h1:5bLqb2K4TvKZrrAY/c/d8Znmz11HnBRv2b03vkWGzzQ=
581583
github.com/status-im/whisper v1.5.2 h1:26NgiKusmPic38eQdtXnaY+iaQ/LuQ3Dh0kCGYT/Uxs=
582584
github.com/status-im/whisper v1.5.2/go.mod h1:emrOxzJme0k66QtbbQ2bdd3P8RCdLZ8sTD7SkwH1s2s=
583585
github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570 h1:gIlAHnH1vJb5vwEjIp5kBj/eu99p/bl0Ay2goiPe5xE=
@@ -716,6 +718,8 @@ golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7w
716718
golang.org/x/sys v0.0.0-20190927073244-c990c680b611/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
717719
golang.org/x/sys v0.0.0-20191010194322-b09406accb47 h1:/XfQ9z7ib8eEJX2hdgFTZJ/ntt0swNk5oYBziWeTCvY=
718720
golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
721+
golang.org/x/sys v0.0.0-20191110163157-d32e6e3b99c4 h1:Hynbrlo6LbYI3H1IqXpkVDOcX/3HiPdhVEuyj5a59RM=
722+
golang.org/x/sys v0.0.0-20191110163157-d32e6e3b99c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
719723
golang.org/x/text v0.0.0-20171227012246-e19ae1496984/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
720724
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
721725
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

rtt/rtt.go

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package rtt
2+
3+
import (
4+
"context"
5+
"sync"
6+
"time"
7+
8+
errors "github.com/pkg/errors"
9+
tcp "github.com/status-im/tcp-shaker"
10+
)
11+
12+
type Result struct {
13+
Address string
14+
RTTMs int
15+
PingErr error
16+
}
17+
18+
func runCheck(c *tcp.Checker, address string, timeout time.Duration) Result {
19+
// mesaure RTT
20+
start := time.Now()
21+
// TCP Ping
22+
err := c.CheckAddr(address, timeout)
23+
// measure RTT
24+
elapsed := time.Since(start)
25+
latency := int(elapsed.Milliseconds())
26+
27+
if err != nil { // don't confuse users with valid latency values on error
28+
latency = -1
29+
if err == tcp.ErrTimeout {
30+
err = errors.Wrap(err, "tcp check timeout")
31+
} else {
32+
switch err.(type) {
33+
case tcp.ErrConnect:
34+
err = errors.Wrap(err, "unable to connect")
35+
default:
36+
err = errors.Wrap(err, "unknown error")
37+
}
38+
}
39+
}
40+
41+
// return results
42+
return Result{
43+
Address: address,
44+
RTTMs: latency,
45+
PingErr: err,
46+
}
47+
}
48+
49+
func waitForResults(errCh <-chan error, resCh <-chan Result) (results []Result, err error) {
50+
for {
51+
select {
52+
case err = <-errCh:
53+
return nil, err
54+
case res, ok := <-resCh:
55+
if !ok {
56+
return
57+
}
58+
results = append(results, res)
59+
}
60+
}
61+
}
62+
63+
func CheckHosts(addresses []string, timeout time.Duration) ([]Result, error) {
64+
c := tcp.NewChecker()
65+
66+
// channel for receiving possible checking loop failure
67+
errCh := make(chan error, 1)
68+
// channel for returning results from concurrent checks
69+
resCh := make(chan Result, len(addresses))
70+
71+
// stop the checking loop when function exists
72+
ctx, stopChecker := context.WithCancel(context.Background())
73+
defer stopChecker()
74+
75+
// loop that queries Epoll and pipes events to CheckAddr() calls
76+
go func() {
77+
errCh <- c.CheckingLoop(ctx)
78+
}()
79+
80+
var wg sync.WaitGroup
81+
for i := 0; i < len(addresses); i++ {
82+
wg.Add(1)
83+
go func(address string, resCh chan<- Result) {
84+
defer wg.Done()
85+
resCh <- runCheck(c, address, timeout)
86+
}(addresses[i], resCh)
87+
}
88+
// wait for all the routines to finish before closing results channel
89+
wg.Wait()
90+
close(resCh)
91+
92+
// wait for the results for all addresses or a checking loop error
93+
return waitForResults(errCh, resCh)
94+
}

services/mailservers/tcp_ping.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package mailservers
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
"github.com/status-im/status-go/rtt"
8+
)
9+
10+
type PingQuery struct {
11+
Addresses []string `json:"addresses"`
12+
TimeoutMs int `json:"timeoutMs"`
13+
}
14+
15+
type PingResult struct {
16+
Address string `json:"address"`
17+
RTTMs *int `json:"latency"`
18+
PingErr *string `json:"error"`
19+
}
20+
21+
func toPingResult(r rtt.Result) PingResult {
22+
var err *string
23+
if r.PingErr != nil {
24+
tmpErr := r.PingErr.Error()
25+
err = &tmpErr
26+
}
27+
return PingResult{
28+
Address: r.Address,
29+
RTTMs: &r.RTTMs,
30+
PingErr: err,
31+
}
32+
}
33+
34+
func (a *API) Ping(ctx context.Context, pq PingQuery) ([]PingResult, error) {
35+
timeout := time.Duration(pq.TimeoutMs) * time.Millisecond
36+
// run the checks concurrently
37+
results, err := rtt.CheckHosts(pq.Addresses, timeout)
38+
if err != nil {
39+
return nil, err
40+
}
41+
// conver to json format
42+
jsonResults := make([]PingResult, len(results))
43+
for i := range results {
44+
jsonResults[i] = toPingResult(results[i])
45+
}
46+
return jsonResults, nil
47+
}

vendor/github.com/status-im/tcp-shaker/.gitignore

Lines changed: 24 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/status-im/tcp-shaker/.travis.yml

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/status-im/tcp-shaker/CONTRIBUTING.md

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/status-im/tcp-shaker/LICENSE

Lines changed: 21 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/status-im/tcp-shaker/README.md

Lines changed: 94 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)