Browse Source

lib/connections: Accept new connections in place of old ones (fixes #5224) (#6548)

MikolajTwarog 5 years ago
parent
commit
4aa2199d5b
2 changed files with 11 additions and 6 deletions
  1. 4 3
      lib/connections/service.go
  2. 7 3
      lib/protocol/protocol.go

+ 4 - 3
lib/connections/service.go

@@ -46,8 +46,9 @@ var (
 )
 
 const (
-	perDeviceWarningIntv = 15 * time.Minute
-	tlsHandshakeTimeout  = 10 * time.Second
+	perDeviceWarningIntv    = 15 * time.Minute
+	tlsHandshakeTimeout     = 10 * time.Second
+	minConnectionReplaceAge = 10 * time.Second
 )
 
 // From go/src/crypto/tls/cipher_suites.go
@@ -276,7 +277,7 @@ func (s *service) handle(ctx context.Context) {
 		ct, connected := s.model.Connection(remoteID)
 
 		// Lower priority is better, just like nice etc.
-		if connected && ct.Priority() > c.priority {
+		if connected && (ct.Priority() > c.priority || time.Since(ct.Statistics().StartedAt) > minConnectionReplaceAge) {
 			l.Debugf("Switching connections %s (existing: %s new: %s)", remoteID, ct, c)
 		} else if connected {
 			// We should not already be connected to the other party. TODO: This

+ 7 - 3
lib/protocol/protocol.go

@@ -145,9 +145,10 @@ type Connection interface {
 }
 
 type rawConnection struct {
-	id       DeviceID
-	name     string
-	receiver Model
+	id        DeviceID
+	name      string
+	receiver  Model
+	startTime time.Time
 
 	cr *countingReader
 	cw *countingWriter
@@ -236,6 +237,7 @@ func (c *rawConnection) Start() {
 	go c.writerLoop()
 	go c.pingSender()
 	go c.pingReceiver()
+	c.startTime = time.Now()
 }
 
 func (c *rawConnection) ID() DeviceID {
@@ -958,6 +960,7 @@ type Statistics struct {
 	At            time.Time
 	InBytesTotal  int64
 	OutBytesTotal int64
+	StartedAt     time.Time
 }
 
 func (c *rawConnection) Statistics() Statistics {
@@ -965,6 +968,7 @@ func (c *rawConnection) Statistics() Statistics {
 		At:            time.Now(),
 		InBytesTotal:  c.cr.Tot(),
 		OutBytesTotal: c.cw.Tot(),
+		StartedAt:     c.startTime,
 	}
 }