From 54643e86b569ce3fd99cf6a5a2031372fd043644 Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Mon, 9 Nov 2020 14:05:21 +0100 Subject: [PATCH] lib/model: Fix locking when resending cluster-configs (#7107) --- lib/model/model.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/model/model.go b/lib/model/model.go index ead2cc8c8..789d9b7ba 100644 --- a/lib/model/model.go +++ b/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())