Skip to content
This repository was archived by the owner on May 29, 2020. It is now read-only.

Commit 179d948

Browse files
committed
optionally log errors (used in testing hook to catch non-fatal errors)
1 parent c0a1ffe commit 179d948

File tree

8 files changed

+84
-9
lines changed

8 files changed

+84
-9
lines changed

client.go

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"crypto/tls"
55
"errors"
66
"fmt"
7+
"log"
78
"net"
89
"sync"
910
"sync/atomic"
@@ -40,6 +41,27 @@ var (
4041
ErrTooLarge = errors.New("synapse: message body too large")
4142
)
4243

44+
// ErrorLogger is the logger used
45+
// by the package to log protocol
46+
// errors. (In general, protocol-level
47+
// errors are not returned directly
48+
// to the client.) It can be set during
49+
// initialization. If it is left
50+
// as nil, nothing will be logged.
51+
var ErrorLogger *log.Logger
52+
53+
func errorln(s string) {
54+
if ErrorLogger != nil {
55+
ErrorLogger.Println(s)
56+
}
57+
}
58+
59+
func errorf(s string, args ...interface{}) {
60+
if ErrorLogger != nil {
61+
ErrorLogger.Printf(s, args...)
62+
}
63+
}
64+
4365
// Dial creates a new client by dialing
4466
// the provided network and remote address.
4567
// The provided timeout is used as the timeout
@@ -199,6 +221,7 @@ func (c *Client) readLoop() {
199221
// they are routed to waiters
200222
// precisely the same way
201223
if frame != fCMD && frame != fRES {
224+
errorf("server at addr %s sent a bad frame", c.conn.RemoteAddr())
202225
// ignore
203226
if !c.do(bwr.Skip(sz)) {
204227
return
@@ -458,5 +481,8 @@ func (c *Client) ping() error {
458481

459482
// sync known service addresses
460483
func (c *Client) syncLinks() {
461-
c.sendCommand(cmdListLinks, svclistbytes())
484+
err := c.sendCommand(cmdListLinks, svclistbytes())
485+
if err != nil {
486+
errorf("error synchronizing links: %s", err)
487+
}
462488
}

client_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ func isCode(err error, c Status) bool {
1616
}
1717

1818
func TestClientServiceName(t *testing.T) {
19+
setTestLog(t)
1920
if tcpClient.Service() != "test-endpoint" {
2021
t.Errorf("expected service endpoint to be %q, but got %q", "test-endpoint", tcpClient.Service())
2122
}
@@ -25,6 +26,7 @@ func TestClientServiceName(t *testing.T) {
2526
}
2627

2728
func TestNearest(t *testing.T) {
29+
setTestLog(t)
2830
svc := Nearest("test-endpoint")
2931
if svc == nil {
3032
t.Error("expected Nearest(test-endpoint) to return something")
@@ -51,6 +53,7 @@ func TestNearest(t *testing.T) {
5153
// open up a client and server; make
5254
// some concurrent requests
5355
func TestClient(t *testing.T) {
56+
setTestLog(t)
5457

5558
const concurrent = 5
5659
wg := new(sync.WaitGroup)
@@ -83,6 +86,7 @@ func TestClient(t *testing.T) {
8386
// the output of the debug handler
8487
// is only visible if '-v' is set
8588
func TestDebugClient(t *testing.T) {
89+
setTestLog(t)
8690
attachDebug("debug_echo", t)
8791

8892
instr := String("here's a message body!")
@@ -99,6 +103,7 @@ func TestDebugClient(t *testing.T) {
99103
// test that 'nil' is a safe
100104
// argument to requests and responses
101105
func TestNop(t *testing.T) {
106+
setTestLog(t)
102107
err := tcpClient.Call("nop", nil, nil)
103108
if err != nil {
104109
t.Fatal(err)

command.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,12 +88,13 @@ const (
8888

8989
// client-side ping finalizer
9090
func recvping(cl *Client, res []byte) {
91+
r := cl.conn.RemoteAddr()
9192
var s Service
9293
_, err := s.UnmarshalMsg(res)
9394
if err != nil {
95+
errorf("server at addr %s sent a malformed ping response", r)
9496
return
9597
}
96-
r := cl.conn.RemoteAddr()
9798
s.net = r.Network()
9899
s.addr = r.String()
99100
cache(&s)
@@ -113,6 +114,7 @@ func recvlinks(cl *Client, res []byte) {
113114
sl := serviceTable{}
114115
_, err := sl.UnmarshalMsg(res)
115116
if err != nil {
117+
errorf("server at addr %s sent malformed links: %s", cl.conn.RemoteAddr(), err)
116118
return
117119
}
118120
svcCache.Lock()

server.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ func ServeConn(c net.Conn, service string, h Handler) {
9494
h: h,
9595
remote: c.RemoteAddr(),
9696
writing: make(chan *connWrapper, 32),
97-
route: getRoute(c),
97+
route: getRoute(c.RemoteAddr()),
9898
}
9999
go ch.writeLoop()
100100
ch.connLoop() // returns on connection close
@@ -140,18 +140,17 @@ const (
140140
routeOSLocal // same machine (unix socket / loopback)
141141
)
142142

143-
func getRoute(c net.Conn) route {
144-
raddr := c.RemoteAddr()
143+
func getRoute(raddr net.Addr) route {
145144
nwk := raddr.Network()
146145
switch nwk {
147146
case "unix":
148147
return routeOSLocal
149148
case "tcp", "tcp4", "tcp6":
150-
a, err := net.ResolveIPAddr(nwk, raddr.String())
149+
a, err := net.ResolveTCPAddr(nwk, raddr.String())
151150
if err != nil {
152151
return routeUnknown
153152
}
154-
if a.IP.IsLoopback() {
153+
if a.IP.IsLoopback() || a.IP.IsLinkLocalUnicast() {
155154
return routeOSLocal
156155
} else if a.IP.IsLinkLocalUnicast() {
157156
return routeLinkLocal

service.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,12 @@ func isRoutable(s *Service) bool {
150150
switch s.net {
151151
case "tcp", "tcp6", "tcp4":
152152
a, err := net.ResolveTCPAddr(s.net, s.addr)
153-
153+
if err != nil {
154+
errorf("couldn't resolve tcp addr %s: %s", s.addr, err)
155+
return false
156+
}
154157
// TODO: link-local addresses
155-
return err == nil && a.IP.IsGlobalUnicast()
158+
return a.IP.IsGlobalUnicast()
156159
default:
157160
return false
158161
}

setup_test.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@ package synapse
33
import (
44
"fmt"
55
"io"
6+
"log"
67
"net"
78
"os"
9+
"sync"
810
"testing"
911
"time"
1012

@@ -29,8 +31,32 @@ var (
2931
rt *Router
3032

3133
ct testing.T
34+
35+
loglock sync.Mutex
3236
)
3337

38+
type faillog struct {
39+
t *testing.T
40+
}
41+
42+
func (f *faillog) Write(b []byte) (int, error) {
43+
loglock.Lock()
44+
f.t.Error("error logged")
45+
i, err := os.Stderr.Write(b)
46+
loglock.Unlock()
47+
return i, err
48+
}
49+
50+
func fail(t *testing.T) io.Writer {
51+
return &faillog{t}
52+
}
53+
54+
func setTestLog(t *testing.T) {
55+
loglock.Lock()
56+
ErrorLogger = log.New(fail(t), "synapse-error-log: ", log.LstdFlags)
57+
loglock.Unlock()
58+
}
59+
3460
// attaches a debug(echo handler) at the named
3561
// route w/ the provided *testing.T
3662
func attachDebug(name string, t *testing.T) {

svc_test/sstc/main.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"flag"
55
"fmt"
6+
"log"
67
"os"
78
"time"
89

@@ -36,6 +37,10 @@ func dumpservices(srv string) {
3637
}
3738
}
3839

40+
func init() {
41+
synapse.ErrorLogger = log.New(os.Stderr, "syn-client-log: ", log.LstdFlags)
42+
}
43+
3944
func main() {
4045
cl, err := synapse.Dial("tcp", *port, 25*time.Millisecond)
4146
if err != nil {
@@ -70,6 +75,10 @@ func main() {
7075
if err != nil {
7176
perror("client: couldn't dial socket:", err)
7277
}
78+
// give the second client time
79+
// to complete another round of
80+
// list synchronization.
81+
time.Sleep(50 * time.Millisecond)
7382
err = cl2.Close()
7483
if err != nil {
7584
perror("client: close error:", err)

svc_test/ssts/main.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package main
33
import (
44
"flag"
55
"fmt"
6+
"log"
67
"net"
78
"os"
89
"os/signal"
@@ -44,6 +45,10 @@ func (e echoHandler) ServeCall(req synapse.Request, res synapse.ResponseWriter)
4445
}
4546
}
4647

48+
func init() {
49+
synapse.ErrorLogger = log.New(os.Stderr, "syn-server-log: ", log.LstdFlags)
50+
}
51+
4752
func main() {
4853
go func() {
4954
err := synapse.ListenAndServe("tcp", *port, "service-test", echoHandler{})

0 commit comments

Comments
 (0)