Browse Source

lib/model: Fix locking when resending cluster-configs (#7107)

Simon Frei 5 years ago
parent
commit
54643e86b5
1 changed files with 7 additions and 2 deletions
  1. 7 2
      lib/model/model.go

+ 7 - 2
lib/model/model.go

@@ -2375,13 +2375,18 @@ func (m *model) CommitConfiguration(from, to config.Configuration) bool {
 			go conn.Close(errDeviceRemoved)
 		}
 	}
+	ccConns := make([]protocol.Connection, 0, len(clusterConfigDevices))
 	for id := range clusterConfigDevices {
 		if conn, ok := m.conn[id]; ok {
-			cm := m.generateClusterConfig(conn.ID())
-			go conn.ClusterConfig(cm)
+			ccConns = append(ccConns, conn)
 		}
 	}
 	m.pmut.RUnlock()
+	// Generating cluster-configs acquires fmut -> must happen outside of pmut.
+	for _, conn := range ccConns {
+		cm := m.generateClusterConfig(conn.ID())
+		go conn.ClusterConfig(cm)
+	}
 
 	m.globalRequestLimiter.setCapacity(1024 * to.Options.MaxConcurrentIncomingRequestKiB())
 	m.folderIOLimiter.setCapacity(to.Options.MaxFolderConcurrency())