lib/model: Don't include unshared folders in ClusterConfig (fixes #4926)

Also fixes a data race where ClusterConfig would access folderFiles
without a lock. Tweaked the ClusterConfig unit test to verify the
behavior.
This commit is contained in:
Jakob Borg 2018-05-08 09:19:34 +02:00 committed by Audrius Butkevicius
parent 616883304e
commit 2343c82c33
2 changed files with 28 additions and 9 deletions

View File

@ -2207,12 +2207,21 @@ func (m *Model) generateClusterConfig(device protocol.DeviceID) protocol.Cluster
var message protocol.ClusterConfig
m.fmut.RLock()
folderFiles := m.folderFiles
m.fmut.RUnlock()
var fs *db.FileSet
defer m.fmut.RUnlock()
for _, folderCfg := range m.cfg.FolderList() {
isShared := false
for _, sharedWith := range folderCfg.Devices {
if sharedWith.DeviceID == device {
isShared = true
break
}
}
if !isShared {
continue
}
protocolFolder := protocol.Folder{
ID: folderCfg.ID,
Label: folderCfg.Label,
@ -2223,8 +2232,9 @@ func (m *Model) generateClusterConfig(device protocol.DeviceID) protocol.Cluster
Paused: folderCfg.Paused,
}
var fs *db.FileSet
if !folderCfg.Paused {
fs = folderFiles[folderCfg.ID]
fs = m.folderFiles[folderCfg.ID]
}
for _, device := range folderCfg.Devices {
@ -2239,7 +2249,7 @@ func (m *Model) generateClusterConfig(device protocol.DeviceID) protocol.Cluster
Introducer: deviceCfg.Introducer,
}
if !folderCfg.Paused {
if fs != nil {
if deviceCfg.DeviceID == m.id {
protocolDevice.IndexID = fs.IndexID(protocol.LocalDeviceID)
protocolDevice.MaxSequence = fs.Sequence(protocol.LocalDeviceID)

View File

@ -607,20 +607,29 @@ func TestClusterConfig(t *testing.T) {
cfg.Folders = []config.FolderConfiguration{
{
ID: "folder1",
Path: "testdata",
Path: "testdata1",
Devices: []config.FolderDeviceConfiguration{
{DeviceID: device1},
{DeviceID: device2},
},
},
{
ID: "folder2",
Path: "testdata",
ID: "folder2",
Path: "testdata2",
Paused: true, // should still be included
Devices: []config.FolderDeviceConfiguration{
{DeviceID: device1},
{DeviceID: device2},
},
},
{
ID: "folder3",
Path: "testdata3",
Devices: []config.FolderDeviceConfiguration{
{DeviceID: device1},
// should not be included, does not include device2
},
},
}
db := db.OpenMemory()