lib: Repair sequence inconsistencies (#6367)

This commit is contained in:
Simon Frei
2020-03-18 17:34:46 +01:00
committed by GitHub
parent 80107d5f5e
commit cc2a55892f
6 changed files with 321 additions and 65 deletions
+2 -62
View File
@@ -7,8 +7,6 @@
package db
import (
"bytes"
"errors"
"fmt"
"strings"
@@ -20,23 +18,15 @@ import (
// 0: v0.14.0
// 1: v0.14.46
// 2: v0.14.48
// 3: v0.14.49
// 4: v0.14.49
// 5: v0.14.49
// 3-5: v0.14.49
// 6: v0.14.50
// 7: v0.14.53
// 8: v1.4.0
// 9: v1.4.0
// 8-9: v1.4.0
const (
dbVersion = 9
dbMinSyncthingVersion = "v1.4.0"
)
var (
errFolderIdxMissing = errors.New("folder db index missing")
errDeviceIdxMissing = errors.New("device db index missing")
)
type databaseDowngradeError struct {
minSyncthingVersion string
}
@@ -445,12 +435,10 @@ func (db *schemaUpdater) updateSchemato9(prev int) error {
}
defer t.close()
var sk []byte
it, err := t.NewPrefixIterator([]byte{KeyTypeDevice})
if err != nil {
return err
}
metas := make(map[string]*metadataTracker)
for it.Next() {
intf, err := t.unmarshalTrunc(it.Value(), false)
if backend.IsNotFound(err) {
@@ -466,48 +454,6 @@ func (db *schemaUpdater) updateSchemato9(prev int) error {
return err
}
fi := intf.(protocol.FileInfo)
device, ok := t.keyer.DeviceFromDeviceFileKey(it.Key())
if !ok {
return errDeviceIdxMissing
}
if bytes.Equal(device, protocol.LocalDeviceID[:]) {
folder, ok := t.keyer.FolderFromDeviceFileKey(it.Key())
if !ok {
return errFolderIdxMissing
}
if sk, err = t.keyer.GenerateSequenceKey(sk, folder, fi.Sequence); err != nil {
return err
}
switch dk, err := t.Get(sk); {
case err != nil:
if !backend.IsNotFound(err) {
return err
}
fallthrough
case !bytes.Equal(it.Key(), dk):
folderStr := string(folder)
meta, ok := metas[folderStr]
if !ok {
meta = loadMetadataTracker(db.Lowlevel, folderStr)
metas[folderStr] = meta
}
fi.Sequence = meta.nextLocalSeq()
if sk, err = t.keyer.GenerateSequenceKey(sk, folder, fi.Sequence); err != nil {
return err
}
if err := t.Put(sk, it.Key()); err != nil {
return err
}
if err := t.putFile(it.Key(), fi); err != nil {
return err
}
continue
}
}
if prev == 8 {
// The transition to 8 already did the changes below.
continue
}
if fi.Blocks == nil {
continue
}
@@ -520,12 +466,6 @@ func (db *schemaUpdater) updateSchemato9(prev int) error {
return err
}
for folder, meta := range metas {
if err := meta.toDB(t, []byte(folder)); err != nil {
return err
}
}
db.recordTime(indirectGCTimeKey)
return t.Commit()