From 06ac631351e0efcd52e1321abecf7d2c824e6afa Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Thu, 27 Aug 2020 16:01:46 +0200 Subject: [PATCH] lib/model: Reduce fmut locking in ClusterConfig (#6913) The FileSet.Drop operation in there needs to potentially update a whole lot of global lists, which can take a while (longer than the deadlock interval apparently) --- lib/model/model.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/model/model.go b/lib/model/model.go index b2e3ddfd8..2e92f6bf6 100644 --- a/lib/model/model.go +++ b/lib/model/model.go @@ -1022,7 +1022,6 @@ func (m *model) ClusterConfig(deviceID protocol.DeviceID, cm protocol.ClusterCon } } - m.fmut.RLock() var paused []string for _, folder := range cm.Folders { cfg, ok := m.cfg.Folder(folder.ID) @@ -1048,7 +1047,9 @@ func (m *model) ClusterConfig(deviceID protocol.DeviceID, cm protocol.ClusterCon if cfg.Paused { continue } + m.fmut.RLock() fs, ok := m.folderFiles[folder.ID] + m.fmut.RUnlock() if !ok { // Shouldn't happen because !cfg.Paused, but might happen // if the folder is about to be unpaused, but not yet. @@ -1122,9 +1123,11 @@ func (m *model) ClusterConfig(deviceID protocol.DeviceID, cm protocol.ClusterCon // likely use delta indexes. We might already have files // that we need to pull so let the folder runner know // that it should recheck the index data. + m.fmut.RLock() if runner := m.folderRunners[folder.ID]; runner != nil { defer runner.SchedulePull() } + m.fmut.RUnlock() } } } @@ -1143,7 +1146,6 @@ func (m *model) ClusterConfig(deviceID protocol.DeviceID, cm protocol.ClusterCon // implementing suture.IsCompletable). m.Add(is) } - m.fmut.RUnlock() m.pmut.Lock() m.remotePausedFolders[deviceID] = paused