diff --git a/internal/files/leveldb.go b/internal/files/leveldb.go index 9e4f308c..1f646f22 100644 --- a/internal/files/leveldb.go +++ b/internal/files/leveldb.go @@ -610,7 +610,7 @@ func ldbGet(db *leveldb.DB, folder, device, file []byte) (protocol.FileInfo, boo return f, true } -func ldbGetGlobal(db *leveldb.DB, folder, file []byte) (protocol.FileInfo, bool) { +func ldbGetGlobal(db *leveldb.DB, folder, file []byte, truncate bool) (FileIntf, bool) { k := globalKey(folder, file) snap, err := db.GetSnapshot() if err != nil { @@ -631,7 +631,7 @@ func ldbGetGlobal(db *leveldb.DB, folder, file []byte) (protocol.FileInfo, bool) } bs, err := snap.Get(k, nil) if err == leveldb.ErrNotFound { - return protocol.FileInfo{}, false + return nil, false } if err != nil { panic(err) @@ -656,12 +656,11 @@ func ldbGetGlobal(db *leveldb.DB, folder, file []byte) (protocol.FileInfo, bool) panic(err) } - var f protocol.FileInfo - err = f.UnmarshalXDR(bs) + fi, err := unmarshalTrunc(bs, truncate) if err != nil { panic(err) } - return f, true + return fi, true } func ldbWithGlobal(db *leveldb.DB, folder []byte, truncate bool, fn Iterator) { diff --git a/internal/files/set.go b/internal/files/set.go index f6ddb41b..4c7fea82 100644 --- a/internal/files/set.go +++ b/internal/files/set.go @@ -189,9 +189,23 @@ func (s *Set) Get(device protocol.DeviceID, file string) (protocol.FileInfo, boo } func (s *Set) GetGlobal(file string) (protocol.FileInfo, bool) { - f, ok := ldbGetGlobal(s.db, []byte(s.folder), []byte(osutil.NormalizedFilename(file))) + fi, ok := ldbGetGlobal(s.db, []byte(s.folder), []byte(osutil.NormalizedFilename(file)), false) + if !ok { + return protocol.FileInfo{}, false + } + f := fi.(protocol.FileInfo) f.Name = osutil.NativeFilename(f.Name) - return f, ok + return f, true +} + +func (s *Set) GetGlobalTruncated(file string) (FileInfoTruncated, bool) { + fi, ok := ldbGetGlobal(s.db, []byte(s.folder), []byte(osutil.NormalizedFilename(file)), true) + if !ok { + return FileInfoTruncated{}, false + } + f := fi.(FileInfoTruncated) + f.Name = osutil.NativeFilename(f.Name) + return f, true } func (s *Set) Availability(file string) []protocol.DeviceID { diff --git a/internal/files/truncated.go b/internal/files/truncated.go index 7f4519d5..6a7a21c7 100644 --- a/internal/files/truncated.go +++ b/internal/files/truncated.go @@ -67,17 +67,6 @@ func (f FileInfoTruncated) HasPermissionBits() bool { return f.Flags&protocol.FlagNoPermBits == 0 } -func Truncate(f protocol.FileInfo) FileInfoTruncated { - return FileInfoTruncated{ - Name: f.Name, - Flags: f.Flags, - Modified: f.Modified, - Version: f.Version, - LocalVersion: f.LocalVersion, - NumBlocks: uint32(len(f.Blocks)), - } -} - func BlocksToSize(num uint32) int64 { if num < 2 { return protocol.BlockSize / 2 diff --git a/internal/model/model.go b/internal/model/model.go index cfdf0a28..df85cab0 100644 --- a/internal/model/model.go +++ b/internal/model/model.go @@ -440,15 +440,15 @@ func (m *Model) NeedFolderFiles(folder string, max int) ([]files.FileInfoTruncat seen = make(map[string]bool, len(progressNames)+len(queuedNames)) for i, name := range progressNames { - if f, ok := rf.GetGlobal(name); ok { - progress[i] = files.Truncate(f) /// XXX: Should implement GetGlobalTruncated directly + if f, ok := rf.GetGlobalTruncated(name); ok { + progress[i] = f seen[name] = true } } for i, name := range queuedNames { - if f, ok := rf.GetGlobal(name); ok { - queued[i] = files.Truncate(f) /// XXX: Should implement GetGlobalTruncated directly + if f, ok := rf.GetGlobalTruncated(name); ok { + queued[i] = f seen[name] = true } }