1
0
Эх сурвалжийг харах

lib/model: Never send unpaused folder without index info (#7134)

Simon Frei 4 жил өмнө
parent
commit
b43eccf2fe

+ 7 - 5
lib/model/model.go

@@ -2187,13 +2187,15 @@ func (m *model) generateClusterConfig(device protocol.DeviceID) protocol.Cluster
 			IgnorePermissions:  folderCfg.IgnorePerms,
 			IgnoreDelete:       folderCfg.IgnoreDelete,
 			DisableTempIndexes: folderCfg.DisableTempIndexes,
-			Paused:             folderCfg.Paused,
 		}
 
-		var fs *db.FileSet
-		if !folderCfg.Paused {
-			fs = m.folderFiles[folderCfg.ID]
-		}
+		fs := m.folderFiles[folderCfg.ID]
+
+		// 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 || fs == nil
 
 		for _, device := range folderCfg.Devices {
 			deviceCfg, _ := m.cfg.Device(device.DeviceID)

+ 28 - 0
lib/model/model_test.go

@@ -4341,6 +4341,34 @@ func TestCcCheckEncryption(t *testing.T) {
 	}
 }
 
+func TestCCFolderNotRunning(t *testing.T) {
+	// Create the folder, but don't start it.
+	w, fcfg := tmpDefaultWrapper()
+	tfs := fcfg.Filesystem()
+	m := newModel(w, myID, "syncthing", "dev", db.NewLowlevel(backend.OpenMemory()), nil)
+	defer cleanupModelAndRemoveDir(m, tfs.URI())
+
+	// A connection can happen before all the folders are started.
+	cc := m.generateClusterConfig(device1)
+	if l := len(cc.Folders); l != 1 {
+		t.Fatalf("Expected 1 folder in CC, got %v", l)
+	}
+	folder := cc.Folders[0]
+	if id := folder.ID; id != fcfg.ID {
+		t.Fatalf("Expected folder %v, got %v", fcfg.ID, id)
+	}
+	if l := len(folder.Devices); l != 2 {
+		t.Fatalf("Expected 2 devices in CC, got %v", l)
+	}
+	local := folder.Devices[1]
+	if local.ID != myID {
+		local = folder.Devices[0]
+	}
+	if !folder.Paused && local.IndexID == 0 {
+		t.Errorf("Folder isn't paused, but index-id is zero")
+	}
+}
+
 func equalStringsInAnyOrder(a, b []string) bool {
 	if len(a) != len(b) {
 		return false