From 9d535b13cfc41353959ad289c9de8bbb29bc2ce4 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Mon, 14 Apr 2014 11:44:29 +0200 Subject: [PATCH] Speed up Global() at the price of Update() in fileset --- files/set.go | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/files/set.go b/files/set.go index cd62e7d4a..4f3e71e80 100644 --- a/files/set.go +++ b/files/set.go @@ -11,8 +11,9 @@ import ( ) type fileRecord struct { - Usage int - File scanner.File + File scanner.File + Usage int + Global bool } type bitset uint64 @@ -110,13 +111,17 @@ func (m *Set) Need(id uint) []scanner.File { var fs = make([]scanner.File, 0, len(m.globalKey)/2) // Just a guess, but avoids too many reallocations m.Lock() rkID := m.remoteKey[id] - for name, gk := range m.globalKey { - if gk.newerThan(rkID[name]) { - file := m.files[gk].File - if file.Flags&protocol.FlagDirectory == 0 || // Regular file - file.Flags&(protocol.FlagDirectory|protocol.FlagDeleted) == protocol.FlagDirectory { // Non-deleted directory - fs = append(fs, file) - } + for gk, gf := range m.files { + if !gf.Global { + continue + } + + file := gf.File + switch { + case file.Flags&protocol.FlagDirectory == 0 && gk.newerThan(rkID[gk.Name]): + fs = append(fs, file) + case file.Flags&(protocol.FlagDirectory|protocol.FlagDeleted) == protocol.FlagDirectory && gk.newerThan(rkID[gk.Name]): + fs = append(fs, file) } } m.Unlock() @@ -142,8 +147,10 @@ func (m *Set) Global() []scanner.File { } var fs = make([]scanner.File, 0, len(m.globalKey)) m.Lock() - for _, rk := range m.globalKey { - fs = append(fs, m.files[rk].File) + for _, file := range m.files { + if file.Global { + fs = append(fs, file.File) + } } m.Unlock() return fs @@ -237,6 +244,14 @@ func (m *Set) update(cid uint, fs []scanner.File) { av |= 1 << cid m.globalAvailability[n] = av case fk.newerThan(gk): + if ok { + f := m.files[gk] + f.Global = false + m.files[gk] = f + } + f := m.files[fk] + f.Global = true + m.files[fk] = f m.globalKey[n] = fk m.globalAvailability[n] = 1 << cid }