From dfc8d39a68c84892d234d9dc3a1b963db390633c Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Mon, 20 May 2024 23:40:15 +0800 Subject: [PATCH] :art: Improve workspace startup stability https://github.com/siyuan-note/siyuan/issues/11483 --- kernel/treenode/blocktree.go | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/kernel/treenode/blocktree.go b/kernel/treenode/blocktree.go index dc89ea428..8910cd1fc 100644 --- a/kernel/treenode/blocktree.go +++ b/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