Sfoglia il codice sorgente

lib/db: Store versions for last successful db migration (#7140)

Simon Frei 5 anni fa
parent
commit
8ebd893349
1 ha cambiato i file con 40 aggiunte e 36 eliminazioni
  1. 40 36
      lib/db/schemaupdater.go

+ 40 - 36
lib/db/schemaupdater.go

@@ -17,18 +17,6 @@ import (
 	"github.com/syncthing/syncthing/lib/protocol"
 )
 
-// List of all dbVersion to dbMinSyncthingVersion pairs for convenience
-//   0: v0.14.0
-//   1: v0.14.46
-//   2: v0.14.48
-//   3-5: v0.14.49
-//   6: v0.14.50
-//   7: v0.14.53
-//   8-9: v1.4.0
-//   10-11: v1.6.0
-//   12-13: v1.7.0
-//   14: v1.9.0
-//
 // dbMigrationVersion is for migrations that do not change the schema and thus
 // do not put restrictions on downgrades (e.g. for repairs after a bugfix).
 const (
@@ -37,6 +25,13 @@ const (
 	dbMinSyncthingVersion = "v1.9.0"
 )
 
+type migration struct {
+	schemaVersion       int64
+	migrationVersion    int64
+	minSyncthingVersion string
+	migration           func(prevSchema int) error
+}
+
 var errFolderMissing = errors.New("folder present in global list but missing in keyer index")
 
 type databaseDowngradeError struct {
@@ -96,24 +91,19 @@ func (db *schemaUpdater) updateSchema() error {
 		return nil
 	}
 
-	type migration struct {
-		schemaVersion    int64
-		migrationVersion int64
-		migration        func(prevSchema int) error
-	}
-	var migrations = []migration{
-		{1, 1, db.updateSchema0to1},
-		{2, 2, db.updateSchema1to2},
-		{3, 3, db.updateSchema2to3},
-		{5, 5, db.updateSchemaTo5},
-		{6, 6, db.updateSchema5to6},
-		{7, 7, db.updateSchema6to7},
-		{9, 9, db.updateSchemaTo9},
-		{10, 10, db.updateSchemaTo10},
-		{11, 11, db.updateSchemaTo11},
-		{13, 13, db.updateSchemaTo13},
-		{14, 14, db.updateSchemaTo14},
-		{14, 15, db.migration15},
+	migrations := []migration{
+		{1, 1, "v0.14.0", db.updateSchema0to1},
+		{2, 2, "v0.14.46", db.updateSchema1to2},
+		{3, 3, "v0.14.48", db.updateSchema2to3},
+		{5, 5, "v0.14.49", db.updateSchemaTo5},
+		{6, 6, "v0.14.50", db.updateSchema5to6},
+		{7, 7, "v0.14.53", db.updateSchema6to7},
+		{9, 9, "v1.4.0", db.updateSchemaTo9},
+		{10, 10, "v1.6.0", db.updateSchemaTo10},
+		{11, 11, "v1.6.0", db.updateSchemaTo11},
+		{13, 13, "v1.7.0", db.updateSchemaTo13},
+		{14, 14, "v1.9.0", db.updateSchemaTo14},
+		{14, 15, "v1.9.0", db.migration15},
 	}
 
 	for _, m := range migrations {
@@ -122,21 +112,35 @@ func (db *schemaUpdater) updateSchema() error {
 			if err := m.migration(int(prevVersion)); err != nil {
 				return fmt.Errorf("failed to do migration %v: %w", m.migrationVersion, err)
 			}
+			if err := db.writeVersions(m, miscDB); err != nil {
+				return fmt.Errorf("failed to write versions after migration %v: %w", m.migrationVersion, err)
+			}
 		}
 	}
 
-	if err := miscDB.PutInt64("dbVersion", dbVersion); err != nil {
+	if err := db.writeVersions(migration{
+		schemaVersion:       dbVersion,
+		migrationVersion:    dbMigrationVersion,
+		minSyncthingVersion: dbMinSyncthingVersion,
+	}, miscDB); err != nil {
+		return fmt.Errorf("failed to write versions after migrations: %w", err)
+	}
+
+	l.Infoln("Compacting database after migration...")
+	return db.Compact()
+}
+
+func (*schemaUpdater) writeVersions(m migration, miscDB *NamespacedKV) error {
+	if err := miscDB.PutInt64("dbVersion", m.schemaVersion); err != nil && err == nil {
 		return err
 	}
-	if err := miscDB.PutString("dbMinSyncthingVersion", dbMinSyncthingVersion); err != nil {
+	if err := miscDB.PutString("dbMinSyncthingVersion", m.minSyncthingVersion); err != nil && err == nil {
 		return err
 	}
-	if err := miscDB.PutInt64("dbMigrationVersion", dbMigrationVersion); err != nil {
+	if err := miscDB.PutInt64("dbMigrationVersion", m.migrationVersion); err != nil && err == nil {
 		return err
 	}
-
-	l.Infoln("Compacting database after migration...")
-	return db.Compact()
+	return nil
 }
 
 func (db *schemaUpdater) updateSchema0to1(_ int) error {