From 364f61bda61dba63885a0e8b1c796e20f48c473a Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Sat, 27 Jan 2018 09:09:13 +0000 Subject: [PATCH] lib/db: Update global counts on invalidation (fixes #4701) GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/4702 --- lib/db/leveldb_transactions.go | 2 +- lib/db/set_test.go | 41 ++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/lib/db/leveldb_transactions.go b/lib/db/leveldb_transactions.go index bcb2f514..f34a159f 100644 --- a/lib/db/leveldb_transactions.go +++ b/lib/db/leveldb_transactions.go @@ -168,7 +168,7 @@ insert: if insertedAt == 0 { // We just inserted a new newest version. Fixup the global size // calculation. - if !file.Version.Equal(oldFile.Version) { + if !file.Version.Equal(oldFile.Version) || file.Invalid != oldFile.Invalid { meta.addFile(globalDeviceID, file) if hasOldFile { // We have the old file that was removed at the head of the list. diff --git a/lib/db/set_test.go b/lib/db/set_test.go index cf2d9783..2716a301 100644 --- a/lib/db/set_test.go +++ b/lib/db/set_test.go @@ -820,6 +820,47 @@ func TestDropFiles(t *testing.T) { } } +func TestIssue4701(t *testing.T) { + ldb := db.OpenMemory() + + s := db.NewFileSet("test)", fs.NewFilesystem(fs.FilesystemTypeBasic, "."), ldb) + + localHave := fileList{ + protocol.FileInfo{Name: "a", Version: protocol.Vector{Counters: []protocol.Counter{{ID: myID, Value: 1000}}}}, + protocol.FileInfo{Name: "b", Version: protocol.Vector{Counters: []protocol.Counter{{ID: myID, Value: 1000}}}, Invalid: true}, + } + + s.Update(protocol.LocalDeviceID, localHave) + + if c := s.LocalSize(); c.Files != 1 { + t.Errorf("Expected 1 local file, got %v", c.Files) + } + if c := s.GlobalSize(); c.Files != 1 { + t.Errorf("Expected 1 global file, got %v", c.Files) + } + + localHave[1].Invalid = false + s.Update(protocol.LocalDeviceID, localHave) + + if c := s.LocalSize(); c.Files != 2 { + t.Errorf("Expected 2 local files, got %v", c.Files) + } + if c := s.GlobalSize(); c.Files != 2 { + t.Errorf("Expected 2 global files, got %v", c.Files) + } + + localHave[0].Invalid = true + localHave[1].Invalid = true + s.Update(protocol.LocalDeviceID, localHave) + + if c := s.LocalSize(); c.Files != 0 { + t.Errorf("Expected 0 local files, got %v", c.Files) + } + if c := s.GlobalSize(); c.Files != 0 { + t.Errorf("Expected 0 global files, got %v", c.Files) + } +} + func replace(fs *db.FileSet, device protocol.DeviceID, files []protocol.FileInfo) { fs.Drop(device) fs.Update(device, files)