Browse Source

Invert initialization dependence on relay/conns

This makes it so we can initialize the relay management and then give
that to the connection management, instead of the other way around.

This is important to me in the discovery revamp I'm doing, as otherwise
I get a circular dependency when constructing stuff, with relaying
depending on connection, connection depending on discovery, and
discovery depending on relaying.

With this fixed, discovery will depend on relaying, and connection will
depend on both discovery and relaying.
Jakob Borg 10 years ago
parent
commit
596a49c112
3 changed files with 35 additions and 12 deletions
  1. 14 1
      cmd/syncthing/connections.go
  2. 9 6
      cmd/syncthing/main.go
  3. 12 5
      lib/relay/relay.go

+ 14 - 1
cmd/syncthing/connections.go

@@ -22,6 +22,7 @@ import (
 	"github.com/syncthing/syncthing/lib/events"
 	"github.com/syncthing/syncthing/lib/events"
 	"github.com/syncthing/syncthing/lib/model"
 	"github.com/syncthing/syncthing/lib/model"
 	"github.com/syncthing/syncthing/lib/osutil"
 	"github.com/syncthing/syncthing/lib/osutil"
+	"github.com/syncthing/syncthing/lib/relay"
 
 
 	"github.com/thejerf/suture"
 	"github.com/thejerf/suture"
 )
 )
@@ -44,6 +45,7 @@ type connectionSvc struct {
 	tlsCfg     *tls.Config
 	tlsCfg     *tls.Config
 	discoverer *discover.Discoverer
 	discoverer *discover.Discoverer
 	conns      chan model.IntermediateConnection
 	conns      chan model.IntermediateConnection
+	relaySvc   *relay.Svc
 
 
 	lastRelayCheck map[protocol.DeviceID]time.Time
 	lastRelayCheck map[protocol.DeviceID]time.Time
 
 
@@ -52,7 +54,7 @@ type connectionSvc struct {
 	relaysEnabled bool
 	relaysEnabled bool
 }
 }
 
 
-func newConnectionSvc(cfg *config.Wrapper, myID protocol.DeviceID, mdl *model.Model, tlsCfg *tls.Config, discoverer *discover.Discoverer) *connectionSvc {
+func newConnectionSvc(cfg *config.Wrapper, myID protocol.DeviceID, mdl *model.Model, tlsCfg *tls.Config, discoverer *discover.Discoverer, relaySvc *relay.Svc) *connectionSvc {
 	svc := &connectionSvc{
 	svc := &connectionSvc{
 		Supervisor: suture.NewSimple("connectionSvc"),
 		Supervisor: suture.NewSimple("connectionSvc"),
 		cfg:        cfg,
 		cfg:        cfg,
@@ -60,6 +62,7 @@ func newConnectionSvc(cfg *config.Wrapper, myID protocol.DeviceID, mdl *model.Mo
 		model:      mdl,
 		model:      mdl,
 		tlsCfg:     tlsCfg,
 		tlsCfg:     tlsCfg,
 		discoverer: discoverer,
 		discoverer: discoverer,
+		relaySvc:   relaySvc,
 		conns:      make(chan model.IntermediateConnection),
 		conns:      make(chan model.IntermediateConnection),
 
 
 		connType:       make(map[protocol.DeviceID]model.ConnectionType),
 		connType:       make(map[protocol.DeviceID]model.ConnectionType),
@@ -104,6 +107,10 @@ func newConnectionSvc(cfg *config.Wrapper, myID protocol.DeviceID, mdl *model.Mo
 	}
 	}
 	svc.Add(serviceFunc(svc.handle))
 	svc.Add(serviceFunc(svc.handle))
 
 
+	if svc.relaySvc != nil {
+		svc.Add(serviceFunc(svc.acceptRelayConns))
+	}
+
 	return svc
 	return svc
 }
 }
 
 
@@ -385,6 +392,12 @@ func (s *connectionSvc) connect() {
 	}
 	}
 }
 }
 
 
+func (s *connectionSvc) acceptRelayConns() {
+	for {
+		s.conns <- s.relaySvc.Accept()
+	}
+}
+
 func (s *connectionSvc) shouldLimit(addr net.Addr) bool {
 func (s *connectionSvc) shouldLimit(addr net.Addr) bool {
 	if s.cfg.Options().LimitBandwidthInLan {
 	if s.cfg.Options().LimitBandwidthInLan {
 		return true
 		return true

+ 9 - 6
cmd/syncthing/main.go

@@ -711,16 +711,19 @@ func syncthingMain() {
 
 
 	setupGUI(mainSvc, cfg, m, apiSub, discoverer)
 	setupGUI(mainSvc, cfg, m, apiSub, discoverer)
 
 
-	// Start connection management
-
-	connectionSvc := newConnectionSvc(cfg, myID, m, tlsCfg, discoverer)
-	mainSvc.Add(connectionSvc)
+	// Start relay management
 
 
+	var relaySvc *relay.Svc
 	if opts.RelaysEnabled && (opts.GlobalAnnEnabled || opts.RelayWithoutGlobalAnn) {
 	if opts.RelaysEnabled && (opts.GlobalAnnEnabled || opts.RelayWithoutGlobalAnn) {
-		relaySvc = relay.NewSvc(cfg, tlsCfg, connectionSvc.conns)
-		connectionSvc.Add(relaySvc)
+		relaySvc = relay.NewSvc(cfg, tlsCfg)
+		mainSvc.Add(relaySvc)
 	}
 	}
 
 
+	// Start connection management
+
+	connectionSvc := newConnectionSvc(cfg, myID, m, tlsCfg, discoverer, relaySvc)
+	mainSvc.Add(connectionSvc)
+
 	if cpuProfile {
 	if cpuProfile {
 		f, err := os.Create(fmt.Sprintf("cpu-%d.pprof", os.Getpid()))
 		f, err := os.Create(fmt.Sprintf("cpu-%d.pprof", os.Getpid()))
 		if err != nil {
 		if err != nil {

+ 12 - 5
lib/relay/relay.go

@@ -25,7 +25,9 @@ import (
 	"github.com/thejerf/suture"
 	"github.com/thejerf/suture"
 )
 )
 
 
-func NewSvc(cfg *config.Wrapper, tlsCfg *tls.Config, conns chan<- model.IntermediateConnection) *Svc {
+func NewSvc(cfg *config.Wrapper, tlsCfg *tls.Config) *Svc {
+	conns := make(chan model.IntermediateConnection)
+
 	svc := &Svc{
 	svc := &Svc{
 		Supervisor: suture.New("Svc", suture.Spec{
 		Supervisor: suture.New("Svc", suture.Spec{
 			Log: func(log string) {
 			Log: func(log string) {
@@ -40,11 +42,11 @@ func NewSvc(cfg *config.Wrapper, tlsCfg *tls.Config, conns chan<- model.Intermed
 		cfg:    cfg,
 		cfg:    cfg,
 		tlsCfg: tlsCfg,
 		tlsCfg: tlsCfg,
 
 
-		tokens:  make(map[string]suture.ServiceToken),
-		clients: make(map[string]*client.ProtocolClient),
-		mut:     sync.NewRWMutex(),
-
+		tokens:      make(map[string]suture.ServiceToken),
+		clients:     make(map[string]*client.ProtocolClient),
+		mut:         sync.NewRWMutex(),
 		invitations: make(chan protocol.SessionInvitation),
 		invitations: make(chan protocol.SessionInvitation),
+		conns:       conns,
 	}
 	}
 
 
 	rcfg := cfg.Raw()
 	rcfg := cfg.Raw()
@@ -72,6 +74,7 @@ type Svc struct {
 	clients     map[string]*client.ProtocolClient
 	clients     map[string]*client.ProtocolClient
 	mut         sync.RWMutex
 	mut         sync.RWMutex
 	invitations chan protocol.SessionInvitation
 	invitations chan protocol.SessionInvitation
+	conns       chan model.IntermediateConnection
 }
 }
 
 
 func (s *Svc) VerifyConfiguration(from, to config.Configuration) error {
 func (s *Svc) VerifyConfiguration(from, to config.Configuration) error {
@@ -207,6 +210,10 @@ func (s *Svc) ClientStatus() map[string]bool {
 	return status
 	return status
 }
 }
 
 
+func (s *Svc) Accept() model.IntermediateConnection {
+	return <-s.conns
+}
+
 type invitationReceiver struct {
 type invitationReceiver struct {
 	invitations chan protocol.SessionInvitation
 	invitations chan protocol.SessionInvitation
 	tlsCfg      *tls.Config
 	tlsCfg      *tls.Config