summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/db/meta.go11
-rw-r--r--lib/db/set_test.go18
2 files changed, 27 insertions, 2 deletions
diff --git a/lib/db/meta.go b/lib/db/meta.go
index b5632f9b2..b8a462ae2 100644
--- a/lib/db/meta.go
+++ b/lib/db/meta.go
@@ -118,9 +118,16 @@ func (m *metadataTracker) countsPtr(dev protocol.DeviceID, flag uint32) *Counts
idx = len(m.counts.Counts)
m.counts.Counts = append(m.counts.Counts, Counts{DeviceID: dev[:], LocalFlags: flag})
m.indexes[key] = idx
- if flag == needFlag {
+ // Need bucket must be initialized when a device first occurs in
+ // the metadatatracker, even if there's no change to the need
+ // bucket itself.
+ nkey := metaKey{dev, needFlag}
+ nidx, ok := m.indexes[nkey]
+ if !ok {
// Initially a new device needs everything, except deletes
- m.counts.Counts[idx] = m.allNeededCounts(dev)
+ nidx = len(m.counts.Counts)
+ m.counts.Counts = append(m.counts.Counts, m.allNeededCounts(dev))
+ m.indexes[nkey] = nidx
}
}
return &m.counts.Counts[idx]
diff --git a/lib/db/set_test.go b/lib/db/set_test.go
index b6b2cd777..bd5f2346c 100644
--- a/lib/db/set_test.go
+++ b/lib/db/set_test.go
@@ -1653,6 +1653,24 @@ func TestUpdateWithOneFileTwice(t *testing.T) {
}
}
+// https://github.com/syncthing/syncthing/issues/6668
+func TestNeedRemoteOnly(t *testing.T) {
+ ldb := db.NewLowlevel(backend.OpenMemory())
+ defer ldb.Close()
+
+ s := db.NewFileSet("test", fs.NewFilesystem(fs.FilesystemTypeFake, ""), ldb)
+
+ remote0Have := fileList{
+ protocol.FileInfo{Name: "b", Version: protocol.Vector{Counters: []protocol.Counter{{ID: myID, Value: 1001}}}, Blocks: genBlocks(2)},
+ }
+ s.Update(remoteDevice0, remote0Have)
+
+ need := needSize(s, remoteDevice0)
+ if !need.Equal(db.Counts{}) {
+ t.Error("Expected nothing needed, got", need)
+ }
+}
+
func replace(fs *db.FileSet, device protocol.DeviceID, files []protocol.FileInfo) {
fs.Drop(device)
fs.Update(device, files)