From 397cb3bdb0a46ca4fb3759fc563e765ea0dcd2e2 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Mon, 13 Apr 2015 14:21:59 +0100 Subject: [PATCH] Let ConnectionMaker report the reason the connection broke --- router/connection.go | 2 +- router/connection_maker.go | 16 ++++++++++------ site/troubleshooting.md | 6 +++--- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/router/connection.go b/router/connection.go index d7cebcd0bb..2d10f6926e 100644 --- a/router/connection.go +++ b/router/connection.go @@ -402,7 +402,7 @@ func (conn *LocalConnection) shutdown(err error) { // try to send any more conn.stopForwarders() - conn.Router.ConnectionMaker.ConnectionTerminated(conn.remoteTCPAddr) + conn.Router.ConnectionMaker.ConnectionTerminated(conn.remoteTCPAddr, err) } // Helpers diff --git a/router/connection_maker.go b/router/connection_maker.go index c50b194487..35e171d8ba 100644 --- a/router/connection_maker.go +++ b/router/connection_maker.go @@ -26,6 +26,7 @@ type ConnectionMaker struct { // Information about an address where we may find a peer type Target struct { attempting bool // are we currently attempting to connect there? + lastError error // reason for disconnection last time tryAfter time.Time // next time to try this address tryInterval time.Duration // backoff time on next failure } @@ -64,10 +65,11 @@ func (cm *ConnectionMaker) ForgetConnection(address string) { } } -func (cm *ConnectionMaker) ConnectionTerminated(address string) { +func (cm *ConnectionMaker) ConnectionTerminated(address string, err error) { cm.actionChan <- func() bool { if target, found := cm.targets[address]; found { target.attempting = false + target.lastError = err target.tryAfter, target.tryInterval = tryAfter(target.tryInterval) } return true @@ -89,13 +91,15 @@ func (cm *ConnectionMaker) String() string { cm.actionChan <- func() bool { var buf bytes.Buffer for address, target := range cm.targets { - var fmtStr string + fmt.Fprint(&buf, address) + if target.lastError != nil { + fmt.Fprintf(&buf, " (%s)", target.lastError) + } if target.attempting { - fmtStr = "%s (trying since %v)\n" + fmt.Fprintf(&buf, " (trying since %v)\n", target.tryAfter) } else { - fmtStr = "%s (next try at %v)\n" + fmt.Fprintf(&buf, "(next try at %v)\n", target.tryAfter) } - fmt.Fprintf(&buf, fmtStr, address, target.tryAfter) } resultChan <- buf.String() return false @@ -201,7 +205,7 @@ func (cm *ConnectionMaker) attemptConnection(address string, acceptNewPeer bool) log.Printf("->[%s] attempting connection\n", address) if err := cm.ourself.CreateConnection(address, acceptNewPeer); err != nil { log.Printf("->[%s] error during connection attempt: %v\n", address, err) - cm.ConnectionTerminated(address) + cm.ConnectionTerminated(address, err) } } diff --git a/site/troubleshooting.md b/site/troubleshooting.md index 490df9a0bd..172ed8a082 100644 --- a/site/troubleshooting.md +++ b/site/troubleshooting.md @@ -79,7 +79,7 @@ broadcast: 7a:f4:56:87:76:3b -> [7a:16:dd:5b:83:de] 7a:16:dd:5b:83:de -> [] Reconnects: -192.168.32.1:6783 (next try at 2014-10-23 16:39:50.585932102 +0000 UTC) +192.168.32.1:6783 (dial tcp4 192.168.32.1:6783: connection timed out) (next try at 2014-10-23 16:39:50.585932102 +0000 UTC) weavedns container is not present; have you launched it? ```` @@ -121,8 +121,8 @@ for a full explanation. The 'Reconnects' section lists peers that this router is aware of, but is not currently connected to. Each line contains some information about -whether it is attempting to connect or is waiting for a while before -connecting again. +what went wrong the last time; whether it is attempting to connect or +is waiting for a while before connecting again. Finally, status information from weave DNS is included. In this example, the DNS container has not been launched so no status information is