chore(protocol): minor cleanup of ClusterConfig messages; remove DisableTempIndexes option (#10202)

This makes a couple of backwards compatible changes to the
ClusterConfig:

- Remove the `ignore_permissions` and `ignore_delete` booleans which
we've never read or used for anything
- Remove the `disable_temp_indexes` boolean and option entirely. We did
use this one, and about 1% of users have set the option. The only thing
it does is inhibits sending of periodical DownloadProgress messages
while downloading data, which is a minuscule bandwidth optimisation
given that we're already sending data at the time.
- Change the `read_only` boolean (which indicated send-only folders) to
an enum `FolderType`, where the values zero and one match the existing
usage. Again, we don't actually use this value, but I can see that we
might want to and then it makes more sense for it to be more
comprehensive.
- Change the `paused` boolean to an enum `StopReason`, where zero
indicates not stopped and one indicates paused, exactly the same wire
representation as previously but leaves space for additional stop
reasons (errors etc).
This commit is contained in:
Jakob Borg
2025-06-29 10:18:51 +02:00
committed by GitHub
parent f2a5b62733
commit 95187bcc64
13 changed files with 523 additions and 420 deletions
+10 -13
View File
@@ -1422,7 +1422,7 @@ func (m *model) ccHandleFolders(folders []protocol.Folder, deviceCfg config.Devi
if err := m.observed.AddOrUpdatePendingFolder(folder.ID, of, deviceID); err != nil {
l.Warnf("Failed to persist pending folder entry to database: %v", err)
}
if !folder.Paused {
if folder.IsRunning() {
indexHandlers.AddIndexInfo(folder.ID, ccDeviceInfos[folder.ID])
}
updatedPending = append(updatedPending, updatedPendingFolder{
@@ -1442,7 +1442,7 @@ func (m *model) ccHandleFolders(folders []protocol.Folder, deviceCfg config.Devi
continue
}
if folder.Paused {
if !folder.IsRunning() {
indexHandlers.Remove(folder.ID)
seenFolders[cfg.ID] = remoteFolderPaused
continue
@@ -1488,10 +1488,9 @@ func (m *model) ccHandleFolders(folders []protocol.Folder, deviceCfg config.Devi
// Handle indexes
if !folder.DisableTempIndexes {
if folder.Type != protocol.FolderTypeReceiveEncrypted {
tempIndexFolders = append(tempIndexFolders, folder.ID)
}
indexHandlers.AddIndexInfo(folder.ID, ccDeviceInfos[folder.ID])
}
@@ -2043,7 +2042,7 @@ func (m *model) Request(conn protocol.Connection, req *protocol.Request) (out pr
// Only check temp files if the flag is set, and if we are set to advertise
// the temp indexes.
if req.FromTemporary && !folderCfg.DisableTempIndexes {
if req.FromTemporary {
tempFn := fs.TempName(req.Name)
if info, err := folderFs.Lstat(tempFn); err != nil || !info.IsRegular() {
@@ -2420,7 +2419,7 @@ func (m *model) DownloadProgress(conn protocol.Connection, p *protocol.DownloadP
cfg, ok := m.folderCfgs[p.Folder]
m.mut.RUnlock()
if !ok || cfg.DisableTempIndexes || !cfg.SharedWith(deviceID) {
if !ok || !cfg.SharedWith(deviceID) {
return nil
}
@@ -2601,19 +2600,17 @@ func (m *model) generateClusterConfigRLocked(device protocol.DeviceID) (*protoco
}
protocolFolder := protocol.Folder{
ID: folderCfg.ID,
Label: folderCfg.Label,
ReadOnly: folderCfg.Type == config.FolderTypeSendOnly,
IgnorePermissions: folderCfg.IgnorePerms,
IgnoreDelete: folderCfg.IgnoreDelete,
DisableTempIndexes: folderCfg.DisableTempIndexes,
ID: folderCfg.ID,
Label: folderCfg.Label,
}
// Even if we aren't paused, if we haven't started the folder yet
// pretend we are. Otherwise the remote might get confused about
// the missing index info (and drop all the info). We will send
// another cluster config once the folder is started.
protocolFolder.Paused = folderCfg.Paused
if folderCfg.Paused {
protocolFolder.StopReason = protocol.FolderStopReasonPaused
}
for _, folderDevice := range folderCfg.Devices {
deviceCfg, _ := m.cfg.Device(folderDevice.DeviceID)
+1 -1
View File
@@ -3871,7 +3871,7 @@ func TestCCFolderNotRunning(t *testing.T) {
if local.ID != myID {
local = folder.Devices[0]
}
if !folder.Paused && local.IndexID == 0 {
if folder.StopReason != protocol.FolderStopReasonPaused && local.IndexID == 0 {
t.Errorf("Folder isn't paused, but index-id is zero")
}
}
+4 -4
View File
@@ -1118,7 +1118,7 @@ func TestRequestIndexSenderPause(t *testing.T) {
// Remote paused
cc := basicClusterConfig(device1, myID, fcfg.ID)
cc.Folders[0].Paused = true
cc.Folders[0].StopReason = protocol.FolderStopReasonPaused
m.ClusterConfig(fc, cc)
seq++
@@ -1139,7 +1139,7 @@ func TestRequestIndexSenderPause(t *testing.T) {
// Remote unpaused
cc.Folders[0].Paused = false
cc.Folders[0].StopReason = protocol.FolderStopReasonRunning
m.ClusterConfig(fc, cc)
select {
case <-time.After(5 * time.Second):
@@ -1164,12 +1164,12 @@ func TestRequestIndexSenderPause(t *testing.T) {
// Local and remote paused, then first resume remote, then local
cc.Folders[0].Paused = true
cc.Folders[0].StopReason = protocol.FolderStopReasonPaused
m.ClusterConfig(fc, cc)
pauseFolder(t, m.cfg, fcfg.ID, true)
cc.Folders[0].Paused = false
cc.Folders[0].StopReason = protocol.FolderStopReasonRunning
m.ClusterConfig(fc, cc)
pauseFolder(t, m.cfg, fcfg.ID, false)