From 1f87b874af019ddae3ffcdc6e0ef6d00776fa43e Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Fri, 18 Jan 2019 13:01:39 +0100 Subject: [PATCH] lib/db: Add "dirty" function terminology to getGlobal (ref #5462) (#5463) --- lib/db/instance.go | 29 ++++------------------------- lib/db/set.go | 4 ++-- lib/db/transactions.go | 21 +++++++++++++++++++++ 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/lib/db/instance.go b/lib/db/instance.go index 899416bc..34b31e45 100644 --- a/lib/db/instance.go +++ b/lib/db/instance.go @@ -224,35 +224,14 @@ func (db *instance) getFileDirty(folder, device, file []byte) (protocol.FileInfo return f, true } -func (db *instance) getGlobal(folder, file []byte, truncate bool) (FileIntf, bool) { +func (db *instance) getGlobalDirty(folder, file []byte, truncate bool) (FileIntf, bool) { t := db.newReadOnlyTransaction() defer t.close() - _, _, f, ok := db.getGlobalInto(t, nil, nil, folder, file, truncate) + _, _, f, ok := t.getGlobalInto(nil, nil, folder, file, truncate) return f, ok } -func (db *instance) getGlobalInto(t readOnlyTransaction, gk, dk, folder, file []byte, truncate bool) ([]byte, []byte, FileIntf, bool) { - gk = db.keyer.GenerateGlobalVersionKey(gk, folder, file) - - bs, err := t.Get(gk, nil) - if err != nil { - return gk, dk, nil, false - } - - vl, ok := unmarshalVersionList(bs) - if !ok { - return gk, dk, nil, false - } - - dk = db.keyer.GenerateDeviceFileKey(dk, folder, vl.Versions[0].Device, file) - if fi, ok := t.getFileTrunc(dk, truncate); ok { - return gk, dk, fi, true - } - - return gk, dk, nil, false -} - func (db *instance) withGlobal(folder, prefix []byte, truncate bool, fn Iterator) { t := db.newReadOnlyTransaction() defer t.close() @@ -265,7 +244,7 @@ func (db *instance) withGlobal(folder, prefix []byte, truncate bool, fn Iterator prefix = append(prefix, '/') } - if _, _, f, ok := db.getGlobalInto(t, nil, nil, folder, unslashedPrefix, truncate); ok && !fn(f) { + if _, _, f, ok := t.getGlobalInto(nil, nil, folder, unslashedPrefix, truncate); ok && !fn(f) { return } } @@ -413,7 +392,7 @@ func (db *instance) withNeedLocal(folder []byte, truncate bool, fn Iterator) { var f FileIntf var ok bool for dbi.Next() { - gk, dk, f, ok = db.getGlobalInto(t, gk, dk, folder, db.keyer.NameFromGlobalVersionKey(dbi.Key()), truncate) + gk, dk, f, ok = t.getGlobalInto(gk, dk, folder, db.keyer.NameFromGlobalVersionKey(dbi.Key()), truncate) if !ok { continue } diff --git a/lib/db/set.go b/lib/db/set.go index 40b52383..2bb476c3 100644 --- a/lib/db/set.go +++ b/lib/db/set.go @@ -250,7 +250,7 @@ func (s *FileSet) Get(device protocol.DeviceID, file string) (protocol.FileInfo, } func (s *FileSet) GetGlobal(file string) (protocol.FileInfo, bool) { - fi, ok := s.db.getGlobal([]byte(s.folder), []byte(osutil.NormalizedFilename(file)), false) + fi, ok := s.db.getGlobalDirty([]byte(s.folder), []byte(osutil.NormalizedFilename(file)), false) if !ok { return protocol.FileInfo{}, false } @@ -260,7 +260,7 @@ func (s *FileSet) GetGlobal(file string) (protocol.FileInfo, bool) { } func (s *FileSet) GetGlobalTruncated(file string) (FileInfoTruncated, bool) { - fi, ok := s.db.getGlobal([]byte(s.folder), []byte(osutil.NormalizedFilename(file)), true) + fi, ok := s.db.getGlobalDirty([]byte(s.folder), []byte(osutil.NormalizedFilename(file)), true) if !ok { return FileInfoTruncated{}, false } diff --git a/lib/db/transactions.go b/lib/db/transactions.go index cc4eaec7..a7775431 100644 --- a/lib/db/transactions.go +++ b/lib/db/transactions.go @@ -65,6 +65,27 @@ func (t readOnlyTransaction) getFileTrunc(key []byte, trunc bool) (FileIntf, boo return f, true } +func (t readOnlyTransaction) getGlobalInto(gk, dk, folder, file []byte, truncate bool) ([]byte, []byte, FileIntf, bool) { + gk = t.db.keyer.GenerateGlobalVersionKey(gk, folder, file) + + bs, err := t.Get(gk, nil) + if err != nil { + return gk, dk, nil, false + } + + vl, ok := unmarshalVersionList(bs) + if !ok { + return gk, dk, nil, false + } + + dk = t.db.keyer.GenerateDeviceFileKey(dk, folder, vl.Versions[0].Device, file) + if fi, ok := t.getFileTrunc(dk, truncate); ok { + return gk, dk, fi, true + } + + return gk, dk, nil, false +} + // A readWriteTransaction is a readOnlyTransaction plus a batch for writes. // The batch will be committed on close() or by checkFlush() if it exceeds the // batch size.