lib/db: Remove index ids when dropping folder (#7200)
This commit is contained in:
@@ -102,6 +102,7 @@ type keyer interface {
|
|||||||
|
|
||||||
// index IDs
|
// index IDs
|
||||||
GenerateIndexIDKey(key, device, folder []byte) (indexIDKey, error)
|
GenerateIndexIDKey(key, device, folder []byte) (indexIDKey, error)
|
||||||
|
FolderFromIndexIDKey(key []byte) ([]byte, bool)
|
||||||
|
|
||||||
// Mtimes
|
// Mtimes
|
||||||
GenerateMtimesKey(key, folder []byte) (mtimesKey, error)
|
GenerateMtimesKey(key, folder []byte) (mtimesKey, error)
|
||||||
@@ -303,6 +304,10 @@ func (k defaultKeyer) GenerateIndexIDKey(key, device, folder []byte) (indexIDKey
|
|||||||
return key, nil
|
return key, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (k defaultKeyer) FolderFromIndexIDKey(key []byte) ([]byte, bool) {
|
||||||
|
return k.folderIdx.Val(binary.BigEndian.Uint32(key[keyPrefixLen+keyDeviceLen:]))
|
||||||
|
}
|
||||||
|
|
||||||
type mtimesKey []byte
|
type mtimesKey []byte
|
||||||
|
|
||||||
func (k defaultKeyer) GenerateMtimesKey(key, folder []byte) (mtimesKey, error) {
|
func (k defaultKeyer) GenerateMtimesKey(key, folder []byte) (mtimesKey, error) {
|
||||||
|
|||||||
@@ -553,6 +553,26 @@ func (db *Lowlevel) setIndexID(device, folder []byte, id protocol.IndexID) error
|
|||||||
return db.Put(key, bs)
|
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 {
|
func (db *Lowlevel) dropMtimes(folder []byte) error {
|
||||||
key, err := db.keyer.GenerateMtimesKey(nil, folder)
|
key, err := db.keyer.GenerateMtimesKey(nil, folder)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -419,6 +419,7 @@ func DropFolder(db *Lowlevel, folder string) {
|
|||||||
db.dropFolder,
|
db.dropFolder,
|
||||||
db.dropMtimes,
|
db.dropMtimes,
|
||||||
db.dropFolderMeta,
|
db.dropFolderMeta,
|
||||||
|
db.dropFolderIndexIDs,
|
||||||
db.folderIdx.Delete,
|
db.folderIdx.Delete,
|
||||||
}
|
}
|
||||||
for _, drop := range droppers {
|
for _, drop := range droppers {
|
||||||
|
|||||||
@@ -889,12 +889,19 @@ func (t readWriteTransaction) removeFromGlobal(gk, keyBuf, folder, device, file
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (t readWriteTransaction) deleteKeyPrefix(prefix []byte) error {
|
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)
|
dbi, err := t.NewPrefixIterator(prefix)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
defer dbi.Release()
|
defer dbi.Release()
|
||||||
for dbi.Next() {
|
for dbi.Next() {
|
||||||
|
if !match(dbi.Key()) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if err := t.Delete(dbi.Key()); err != nil {
|
if err := t.Delete(dbi.Key()); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user