Просмотр исходного кода

lib/db: Checkpoint during schema updates (fixes #6422) (#6424)

Simon Frei 5 лет назад
Родитель
Сommit
00b2340f9a
1 измененных файлов с 19 добавлено и 8 удалено
  1. 19 8
      lib/db/schemaupdater.go

+ 19 - 8
lib/db/schemaupdater.go

@@ -201,6 +201,9 @@ func (db *schemaUpdater) updateSchema0to1(_ int) error {
 				ignAdded++
 			}
 		}
+		if err := t.Checkpoint(); err != nil {
+			return err
+		}
 	}
 
 	for folder := range changedFolders {
@@ -339,7 +342,7 @@ func (db *schemaUpdater) updateSchema5to6(_ int) error {
 
 	for _, folderStr := range db.ListFolders() {
 		folder := []byte(folderStr)
-		var putErr error
+		var iterErr error
 		err := t.withHave(folder, protocol.LocalDeviceID[:], nil, false, func(f FileIntf) bool {
 			if !f.IsInvalid() {
 				return true
@@ -350,16 +353,18 @@ func (db *schemaUpdater) updateSchema5to6(_ int) error {
 			fi.LocalFlags = protocol.FlagLocalIgnored
 			bs, _ := fi.Marshal()
 
-			dk, putErr = db.keyer.GenerateDeviceFileKey(dk, folder, protocol.LocalDeviceID[:], []byte(fi.Name))
-			if putErr != nil {
+			dk, iterErr = db.keyer.GenerateDeviceFileKey(dk, folder, protocol.LocalDeviceID[:], []byte(fi.Name))
+			if iterErr != nil {
 				return false
 			}
-			putErr = t.Put(dk, bs)
-
-			return putErr == nil
+			if iterErr = t.Put(dk, bs); iterErr != nil {
+				return false
+			}
+			iterErr = t.Checkpoint()
+			return iterErr == nil
 		})
-		if putErr != nil {
-			return putErr
+		if iterErr != nil {
+			return iterErr
 		}
 		if err != nil {
 			return err
@@ -421,6 +426,9 @@ func (db *schemaUpdater) updateSchema6to7(_ int) error {
 		if err != nil {
 			return err
 		}
+		if err := t.Checkpoint(); err != nil {
+			return err
+		}
 	}
 	return t.Commit()
 }
@@ -460,6 +468,9 @@ func (db *schemaUpdater) updateSchemato9(prev int) error {
 		if err := t.putFile(it.Key(), fi); err != nil {
 			return err
 		}
+		if err := t.Checkpoint(); err != nil {
+			return err
+		}
 	}
 	it.Release()
 	if err := it.Error(); err != nil {