From 22242d51be49f2621442d337dacf9611e7f00ef6 Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Fri, 1 May 2020 09:30:20 +0200 Subject: [PATCH] lib/db: Refactor getting global lists (#6529) * lib/db: Refactor getting global lists * VL -> Versions * keyBuf * don't touch db migration --- lib/db/transactions.go | 51 ++++++++++++++++++------------------------ 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/lib/db/transactions.go b/lib/db/transactions.go index e006e89c0..1571a1dc1 100644 --- a/lib/db/transactions.go +++ b/lib/db/transactions.go @@ -112,23 +112,34 @@ func (t readOnlyTransaction) fillFileInfo(fi *protocol.FileInfo) error { return nil } -func (t readOnlyTransaction) getGlobal(keyBuf, folder, file []byte, truncate bool) ([]byte, FileIntf, bool, error) { +func (t readOnlyTransaction) getGlobalVersions(keyBuf, folder, file []byte) (VersionList, error) { var err error keyBuf, err = t.keyer.GenerateGlobalVersionKey(keyBuf, folder, file) if err != nil { - return nil, nil, false, err + return VersionList{}, err } + return t.getGlobalVersionsByKey(keyBuf) +} - bs, err := t.Get(keyBuf) - if backend.IsNotFound(err) { - return keyBuf, nil, false, nil - } +func (t readOnlyTransaction) getGlobalVersionsByKey(key []byte) (VersionList, error) { + bs, err := t.Get(key) if err != nil { - return nil, nil, false, err + return VersionList{}, err } var vl VersionList if err := vl.Unmarshal(bs); err != nil { + return VersionList{}, err + } + + return vl, nil +} + +func (t readOnlyTransaction) getGlobal(keyBuf, folder, file []byte, truncate bool) ([]byte, FileIntf, bool, error) { + vl, err := t.getGlobalVersions(keyBuf, folder, file) + if backend.IsNotFound(err) { + return keyBuf, nil, false, nil + } else if err != nil { return nil, nil, false, err } @@ -291,11 +302,7 @@ func (t *readOnlyTransaction) withGlobal(folder, prefix []byte, truncate bool, f } func (t *readOnlyTransaction) availability(folder, file []byte) ([]protocol.DeviceID, error) { - k, err := t.keyer.GenerateGlobalVersionKey(nil, folder, file) - if err != nil { - return nil, err - } - bs, err := t.Get(k) + vl, err := t.getGlobalVersions(nil, folder, file) if backend.IsNotFound(err) { return nil, nil } @@ -303,11 +310,6 @@ func (t *readOnlyTransaction) availability(folder, file []byte) ([]protocol.Devi return nil, err } - var vl VersionList - if err := vl.Unmarshal(bs); err != nil { - return nil, err - } - var devices []protocol.DeviceID for _, v := range vl.Versions { if !v.Version.Equal(vl.Versions[0].Version) { @@ -473,11 +475,8 @@ func (t readWriteTransaction) putFile(fkey []byte, fi protocol.FileInfo, truncat func (t readWriteTransaction) updateGlobal(gk, keyBuf, folder, device []byte, file protocol.FileInfo, meta *metadataTracker) ([]byte, bool, error) { l.Debugf("update global; folder=%q device=%v file=%q version=%v invalid=%v", folder, protocol.DeviceIDFromBytes(device), file.Name, file.Version, file.IsInvalid()) - var fl VersionList - svl, err := t.Get(gk) - if err == nil { - _ = fl.Unmarshal(svl) // Ignore error, continue with empty fl - } else if !backend.IsNotFound(err) { + fl, err := t.getGlobalVersionsByKey(gk) + if err != nil && !backend.IsNotFound(err) { return nil, false, err } @@ -603,7 +602,7 @@ func need(global FileIntf, haveLocal bool, localVersion protocol.Vector) bool { func (t readWriteTransaction) removeFromGlobal(gk, keyBuf, folder, device []byte, file []byte, meta *metadataTracker) ([]byte, error) { l.Debugf("remove from global; folder=%q device=%v file=%q", folder, protocol.DeviceIDFromBytes(device), file) - svl, err := t.Get(gk) + fl, err := t.getGlobalVersionsByKey(gk) if backend.IsNotFound(err) { // We might be called to "remove" a global version that doesn't exist // if the first update for the file is already marked invalid. @@ -612,12 +611,6 @@ func (t readWriteTransaction) removeFromGlobal(gk, keyBuf, folder, device []byte return nil, err } - var fl VersionList - err = fl.Unmarshal(svl) - if err != nil { - return nil, err - } - fl, _, removedAt := fl.pop(device) if removedAt == -1 { // There is no version for the given device