lib/db, lib/model: Resolve identical recv only items (fixes #5130) (#5230)

This commit is contained in:
Simon Frei
2018-10-10 12:43:07 +02:00
committed by Jakob Borg
parent caa2356409
commit d10773c311
5 changed files with 173 additions and 14 deletions

View File

@@ -1178,8 +1178,8 @@ func TestReceiveOnlyAccounting(t *testing.T) {
if n := s.GlobalSize().Files; n != 3 {
t.Fatal("expected 3 global files after local change, not", n)
}
if n := s.GlobalSize().Bytes; n != 120 {
t.Fatal("expected 120 global bytes after local change, not", n)
if n := s.GlobalSize().Bytes; n != 30 {
t.Fatal("expected 30 global files after local change, not", n)
}
if n := s.ReceiveOnlyChangedSize().Files; n != 1 {
t.Fatal("expected 1 receive only changed file after local change, not", n)
@@ -1271,6 +1271,44 @@ func TestRemoteInvalidNotAccounted(t *testing.T) {
}
}
func TestNeedWithNewerInvalid(t *testing.T) {
ldb := db.OpenMemory()
s := db.NewFileSet("default", fs.NewFilesystem(fs.FilesystemTypeBasic, "."), ldb)
rem0ID := remoteDevice0.Short()
rem1ID := remoteDevice1.Short()
// Initial state: file present on rem0 and rem1, but not locally.
file := protocol.FileInfo{Name: "foo"}
file.Version = file.Version.Update(rem0ID)
s.Update(remoteDevice0, fileList{file})
s.Update(remoteDevice1, fileList{file})
need := needList(s, protocol.LocalDeviceID)
if len(need) != 1 {
t.Fatal("Locally missing file should be needed")
}
if !need[0].IsEquivalent(file) {
t.Fatalf("Got needed file %v, expected %v", need[0], file)
}
// rem1 sends an invalid file with increased version
inv := file
inv.Version = inv.Version.Update(rem1ID)
inv.RawInvalid = true
s.Update(remoteDevice1, fileList{inv})
// We still have an old file, we need the newest valid file
need = needList(s, protocol.LocalDeviceID)
if len(need) != 1 {
t.Fatal("Locally missing file should be needed regardless of invalid files")
}
if !need[0].IsEquivalent(file) {
t.Fatalf("Got needed file %v, expected %v", need[0], file)
}
}
func replace(fs *db.FileSet, device protocol.DeviceID, files []protocol.FileInfo) {
fs.Drop(device)
fs.Update(device, files)