diff --git a/lib/connections/relay_listen.go b/lib/connections/relay_listen.go index 4d0387a13..5612336a7 100644 --- a/lib/connections/relay_listen.go +++ b/lib/connections/relay_listen.go @@ -16,6 +16,7 @@ import ( "github.com/syncthing/syncthing/lib/dialer" "github.com/syncthing/syncthing/lib/nat" "github.com/syncthing/syncthing/lib/relay/client" + "github.com/syncthing/syncthing/lib/util" ) func init() { @@ -26,6 +27,7 @@ func init() { } type relayListener struct { + util.ServiceWithError onAddressesChangedNotifier uri *url.URL @@ -34,30 +36,22 @@ type relayListener struct { conns chan internalConn factory listenerFactory - err error client client.RelayClient mut sync.RWMutex } -func (t *relayListener) Serve() { - t.mut.Lock() - t.err = nil - t.mut.Unlock() - +func (t *relayListener) serve(stop chan struct{}) error { clnt, err := client.NewClient(t.uri, t.tlsCfg.Certificates, nil, 10*time.Second) - invitations := clnt.Invitations() if err != nil { - t.mut.Lock() - t.err = err - t.mut.Unlock() - l.Warnln("Listen (BEP/relay):", err) - return + l.Infoln("Listen (BEP/relay):", err) + return err } - - go clnt.Serve() + invitations := clnt.Invitations() t.mut.Lock() t.client = clnt + go clnt.Serve() + defer clnt.Stop() t.mut.Unlock() oldURI := clnt.URI() @@ -69,7 +63,10 @@ func (t *relayListener) Serve() { select { case inv, ok := <-invitations: if !ok { - return + if err := clnt.Error(); err != nil { + l.Infoln("Listen (BEP/relay):", err) + } + return err } conn, err := client.JoinSession(inv) @@ -114,18 +111,13 @@ func (t *relayListener) Serve() { oldURI = currentURI t.notifyAddressesChanged(t) } + + case <-stop: + return nil } } } -func (t *relayListener) Stop() { - t.mut.RLock() - if t.client != nil { - t.client.Stop() - } - t.mut.RUnlock() -} - func (t *relayListener) URI() *url.URL { return t.uri } @@ -152,18 +144,16 @@ func (t *relayListener) LANAddresses() []*url.URL { } func (t *relayListener) Error() error { - t.mut.RLock() - err := t.err - var cerr error - if t.client != nil { - cerr = t.client.Error() - } - t.mut.RUnlock() - + err := t.ServiceWithError.Error() if err != nil { return err } - return cerr + t.mut.RLock() + defer t.mut.RUnlock() + if t.client != nil { + return t.client.Error() + } + return nil } func (t *relayListener) Factory() listenerFactory { @@ -181,13 +171,15 @@ func (t *relayListener) NATType() string { type relayListenerFactory struct{} func (f *relayListenerFactory) New(uri *url.URL, cfg config.Wrapper, tlsCfg *tls.Config, conns chan internalConn, natService *nat.Service) genericListener { - return &relayListener{ + t := &relayListener{ uri: uri, cfg: cfg, tlsCfg: tlsCfg, conns: conns, factory: f, } + t.ServiceWithError = util.AsServiceWithError(t.serve) + return t } func (relayListenerFactory) Valid(cfg config.Configuration) error {