فهرست منبع

:art: Improve workspace startup stability https://github.com/siyuan-note/siyuan/issues/11483

Daniel 1 سال پیش
والد
کامیت
dfc8d39a68
1فایلهای تغییر یافته به همراه16 افزوده شده و 12 حذف شده
  1. 16 12
      kernel/treenode/blocktree.go

+ 16 - 12
kernel/treenode/blocktree.go

@@ -451,6 +451,7 @@ func InitBlockTree(force bool) {
 		return
 	}
 
+	loadErr := atomic.Bool{}
 	size := atomic.Int64{}
 	waitGroup := &sync.WaitGroup{}
 	p, _ := ants.NewPoolWithFunc(4, func(arg interface{}) {
@@ -462,14 +463,15 @@ func InitBlockTree(force bool) {
 		f, err := os.OpenFile(p, os.O_RDONLY, 0644)
 		if nil != err {
 			logging.LogErrorf("open block tree failed: %s", err)
-			os.Exit(logging.ExitCodeFileSysErr)
+			loadErr.Store(true)
 			return
 		}
+		defer f.Close()
 
 		info, err := f.Stat()
 		if nil != err {
 			logging.LogErrorf("stat block tree failed: %s", err)
-			os.Exit(logging.ExitCodeFileSysErr)
+			loadErr.Store(true)
 			return
 		}
 		size.Add(info.Size())
@@ -477,16 +479,7 @@ func InitBlockTree(force bool) {
 		sliceData := map[string]*BlockTree{}
 		if err = msgpack.NewDecoder(f).Decode(&sliceData); nil != err {
 			logging.LogErrorf("unmarshal block tree failed: %s", err)
-			if err = os.RemoveAll(util.BlockTreePath); nil != err {
-				logging.LogErrorf("removed corrupted block tree failed: %s", err)
-			}
-			os.Exit(logging.ExitCodeFileSysErr)
-			return
-		}
-
-		if err = f.Close(); nil != err {
-			logging.LogErrorf("close block tree failed: %s", err)
-			os.Exit(logging.ExitCodeFileSysErr)
+			loadErr.Store(true)
 			return
 		}
 
@@ -505,6 +498,17 @@ func InitBlockTree(force bool) {
 	waitGroup.Wait()
 	p.Release()
 
+	if loadErr.Load() {
+		logging.LogInfof("cause block tree load error, remove block tree file")
+		if removeErr := os.RemoveAll(util.BlockTreePath); nil != removeErr {
+			logging.LogErrorf("remove block tree file failed: %s", removeErr)
+			os.Exit(logging.ExitCodeFileSysErr)
+			return
+		}
+		blockTrees = &sync.Map{}
+		return
+	}
+
 	elapsed := time.Since(start).Seconds()
 	logging.LogInfof("read block tree [%s] to [%s], elapsed [%.2fs]", humanize.BytesCustomCeil(uint64(size.Load()), 2), util.BlockTreePath, elapsed)
 	return