Przeglądaj źródła

:art: Index fixing should not be performed before data synchronization https://github.com/siyuan-note/siyuan/issues/10761

Daniel 1 rok temu
rodzic
commit
1bc32c584b
1 zmienionych plików z 17 dodań i 22 usunięć
  1. 17 22
      kernel/model/index_fix.go

+ 17 - 22
kernel/model/index_fix.go

@@ -24,7 +24,6 @@ import (
 	"runtime/debug"
 	"strings"
 	"sync"
-	"sync/atomic"
 	"time"
 
 	"github.com/88250/gulu"
@@ -42,39 +41,35 @@ import (
 )
 
 var (
-	checkIndexPerformed = atomic.Bool{}
+	checkIndexOnce = sync.Once{}
 )
 
 // checkIndex 自动校验数据库索引,仅在数据同步执行完成后执行一次。
 func checkIndex() {
-	if checkIndexPerformed.Load() {
-		return
-	}
-
-	logging.LogInfof("start checking index...")
+	checkIndexOnce.Do(func() {
+		logging.LogInfof("start checking index...")
 
-	task.AppendTask(task.DatabaseIndexFix, removeDuplicateDatabaseIndex)
-	sql.WaitForWritingDatabase()
+		task.AppendTask(task.DatabaseIndexFix, removeDuplicateDatabaseIndex)
+		sql.WaitForWritingDatabase()
 
-	task.AppendTask(task.DatabaseIndexFix, resetDuplicateBlocksOnFileSys)
+		task.AppendTask(task.DatabaseIndexFix, resetDuplicateBlocksOnFileSys)
 
-	task.AppendTask(task.DatabaseIndexFix, fixBlockTreeByFileSys)
-	sql.WaitForWritingDatabase()
+		task.AppendTask(task.DatabaseIndexFix, fixBlockTreeByFileSys)
+		sql.WaitForWritingDatabase()
 
-	task.AppendTask(task.DatabaseIndexFix, fixDatabaseIndexByBlockTree)
-	sql.WaitForWritingDatabase()
+		task.AppendTask(task.DatabaseIndexFix, fixDatabaseIndexByBlockTree)
+		sql.WaitForWritingDatabase()
 
-	task.AppendTask(task.DatabaseIndexFix, removeDuplicateDatabaseRefs)
+		task.AppendTask(task.DatabaseIndexFix, removeDuplicateDatabaseRefs)
 
-	// 后面要加任务的话记得修改推送任务栏的进度 util.PushStatusBar(fmt.Sprintf(Conf.Language(58), 1, 5))
+		// 后面要加任务的话记得修改推送任务栏的进度 util.PushStatusBar(fmt.Sprintf(Conf.Language(58), 1, 5))
 
-	task.AppendTask(task.DatabaseIndexFix, func() {
-		util.PushStatusBar(Conf.Language(185))
+		task.AppendTask(task.DatabaseIndexFix, func() {
+			util.PushStatusBar(Conf.Language(185))
+		})
+		debug.FreeOSMemory()
+		logging.LogInfof("finish checking index")
 	})
-	debug.FreeOSMemory()
-	logging.LogInfof("finish checking index")
-
-	checkIndexPerformed.Store(true)
 }
 
 var autoFixLock = sync.Mutex{}