From bd0c9913cfef43c6f210268804e31b57de7c0399 Mon Sep 17 00:00:00 2001 From: Simon Frei Date: Mon, 21 Dec 2020 11:10:59 +0100 Subject: [PATCH] lib/db: Remove index ids when dropping folder (#7200) --- lib/db/keyer.go | 5 +++++ lib/db/lowlevel.go | 20 ++++++++++++++++++++ lib/db/set.go | 1 + lib/db/transactions.go | 7 +++++++ 4 files changed, 33 insertions(+) diff --git a/lib/db/keyer.go b/lib/db/keyer.go index 8f4709c95..2c88cf9cb 100644 --- a/lib/db/keyer.go +++ b/lib/db/keyer.go @@ -102,6 +102,7 @@ type keyer interface { // index IDs GenerateIndexIDKey(key, device, folder []byte) (indexIDKey, error) + FolderFromIndexIDKey(key []byte) ([]byte, bool) // Mtimes GenerateMtimesKey(key, folder []byte) (mtimesKey, error) @@ -303,6 +304,10 @@ func (k defaultKeyer) GenerateIndexIDKey(key, device, folder []byte) (indexIDKey return key, nil } +func (k defaultKeyer) FolderFromIndexIDKey(key []byte) ([]byte, bool) { + return k.folderIdx.Val(binary.BigEndian.Uint32(key[keyPrefixLen+keyDeviceLen:])) +} + type mtimesKey []byte func (k defaultKeyer) GenerateMtimesKey(key, folder []byte) (mtimesKey, error) { diff --git a/lib/db/lowlevel.go b/lib/db/lowlevel.go index 7d8eb2217..6f398d8b5 100644 --- a/lib/db/lowlevel.go +++ b/lib/db/lowlevel.go @@ -553,6 +553,26 @@ func (db *Lowlevel) setIndexID(device, folder []byte, id protocol.IndexID) error return db.Put(key, bs) } +func (db *Lowlevel) dropFolderIndexIDs(folder []byte) error { + t, err := db.newReadWriteTransaction() + if err != nil { + return err + } + defer t.close() + + if err := t.deleteKeyPrefixMatching([]byte{KeyTypeIndexID}, func(key []byte) bool { + keyFolder, ok := t.keyer.FolderFromIndexIDKey(key) + if !ok { + l.Debugf("Deleting IndexID with missing FolderIdx: %v", key) + return true + } + return bytes.Equal(keyFolder, folder) + }); err != nil { + return err + } + return t.Commit() +} + func (db *Lowlevel) dropMtimes(folder []byte) error { key, err := db.keyer.GenerateMtimesKey(nil, folder) if err != nil { diff --git a/lib/db/set.go b/lib/db/set.go index 41e1c7ecd..ae7a16474 100644 --- a/lib/db/set.go +++ b/lib/db/set.go @@ -419,6 +419,7 @@ func DropFolder(db *Lowlevel, folder string) { db.dropFolder, db.dropMtimes, db.dropFolderMeta, + db.dropFolderIndexIDs, db.folderIdx.Delete, } for _, drop := range droppers { diff --git a/lib/db/transactions.go b/lib/db/transactions.go index 02c9a8e05..df70eb840 100644 --- a/lib/db/transactions.go +++ b/lib/db/transactions.go @@ -889,12 +889,19 @@ func (t readWriteTransaction) removeFromGlobal(gk, keyBuf, folder, device, file } func (t readWriteTransaction) deleteKeyPrefix(prefix []byte) error { + return t.deleteKeyPrefixMatching(prefix, func([]byte) bool { return true }) +} + +func (t readWriteTransaction) deleteKeyPrefixMatching(prefix []byte, match func(key []byte) bool) error { dbi, err := t.NewPrefixIterator(prefix) if err != nil { return err } defer dbi.Release() for dbi.Next() { + if !match(dbi.Key()) { + continue + } if err := t.Delete(dbi.Key()); err != nil { return err }