lib/db: Update local need on device removal (fixes #5294) (#5295)

This commit is contained in:
Simon Frei
2018-10-30 05:40:51 +01:00
committed by Jakob Borg
parent 64a591610b
commit b1acc37c16
4 changed files with 126 additions and 50 deletions

View File

@@ -22,9 +22,10 @@ import (
// 4: v0.14.49
// 5: v0.14.49
// 6: v0.14.50
// 7: v0.14.53
const (
dbVersion = 6
dbMinSyncthingVersion = "v0.14.50"
dbVersion = 7
dbMinSyncthingVersion = "v0.14.53"
)
type databaseDowngradeError struct {
@@ -79,6 +80,9 @@ func (db *schemaUpdater) updateSchema() error {
if prevVersion < 6 {
db.updateSchema5to6()
}
if prevVersion < 7 {
db.updateSchema6to7()
}
miscDB.PutInt64("dbVersion", dbVersion)
miscDB.PutString("dbMinSyncthingVersion", dbMinSyncthingVersion)
@@ -259,3 +263,39 @@ func (db *schemaUpdater) updateSchema5to6() {
})
}
}
// updateSchema6to7 checks whether all currently locally needed files are really
// needed and removes them if not.
func (db *schemaUpdater) updateSchema6to7() {
t := db.newReadWriteTransaction()
defer t.close()
var gk []byte
var nk []byte
for _, folderStr := range db.ListFolders() {
folder := []byte(folderStr)
db.withNeedLocal(folder, false, func(f FileIntf) bool {
name := []byte(f.FileName())
global := f.(protocol.FileInfo)
gk = db.keyer.GenerateGlobalVersionKey(gk, folder, name)
svl, err := t.Get(gk, nil)
if err != nil {
// If there is no global list, we hardly need it.
t.Delete(t.db.keyer.GenerateNeedFileKey(nk, folder, name))
return true
}
var fl VersionList
err = fl.Unmarshal(svl)
if err != nil {
// This can't happen, but it's ignored everywhere else too,
// so lets not act on it.
return true
}
if localFV, haveLocalFV := fl.Get(protocol.LocalDeviceID[:]); !need(global, haveLocalFV, localFV.Version) {
t.Delete(t.db.keyer.GenerateNeedFileKey(nk, folder, name))
}
return true
})
}
}