From c7d51d2e6cd4ba5e0d862bc96d4f72535dd7525b Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Fri, 3 Feb 2023 22:42:02 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E9=87=8D=E5=A4=8D=E6=89=A7=E8=A1=8C=20?= =?UTF-8?q?`=E9=87=8D=E5=BB=BA=E7=B4=A2=E5=BC=95`=20=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E5=86=85=E6=A0=B8=E5=B4=A9=E6=BA=83=20https://github.com/siyua?= =?UTF-8?q?n-note/siyuan/issues/7238?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/treenode/blocktree.go | 56 ++++++++++++------------------------ 1 file changed, 19 insertions(+), 37 deletions(-) diff --git a/kernel/treenode/blocktree.go b/kernel/treenode/blocktree.go index 43da32297..a4a6b5950 100644 --- a/kernel/treenode/blocktree.go +++ b/kernel/treenode/blocktree.go @@ -391,36 +391,6 @@ func SaveBlockTree(force bool) { os.MkdirAll(util.BlockTreePath, 0755) size := uint64(0) - poolSize := runtime.NumCPU() - waitGroup := &sync.WaitGroup{} - p, _ := ants.NewPoolWithFunc(poolSize, func(arg interface{}) { - defer waitGroup.Done() - - key := arg.(map[string]interface{})["key"].(string) - slice := arg.(map[string]interface{})["value"].(*btSlice) - if !force && slice.changed.IsZero() { - return - } - - slice.m.Lock() - data, err := msgpack.Marshal(slice.data) - if nil != err { - logging.LogErrorf("marshal block tree failed: %s", err) - os.Exit(util.ExitCodeBlockTreeErr) - return - } - slice.m.Unlock() - - p := filepath.Join(util.BlockTreePath, key) + ".msgpack" - if err = gulu.File.WriteFileSafer(p, data, 0644); nil != err { - logging.LogErrorf("write block tree failed: %s", err) - os.Exit(util.ExitCodeBlockTreeErr) - return - } - slice.changed = time.Time{} - size += uint64(len(data)) - }) - var count int blockTrees.Range(func(key, value interface{}) bool { slice := value.(*btSlice) @@ -428,19 +398,31 @@ func SaveBlockTree(force bool) { return true } + slice.m.Lock() + data, err := msgpack.Marshal(slice.data) + if nil != err { + logging.LogErrorf("marshal block tree failed: %s", err) + os.Exit(util.ExitCodeBlockTreeErr) + return false + } + slice.m.Unlock() + + p := filepath.Join(util.BlockTreePath, key.(string)) + ".msgpack" + if err = gulu.File.WriteFileSafer(p, data, 0644); nil != err { + logging.LogErrorf("write block tree failed: %s", err) + os.Exit(util.ExitCodeBlockTreeErr) + return false + } + + slice.changed = time.Time{} + size += uint64(len(data)) count++ - waitGroup.Add(1) - p.Invoke(map[string]interface{}{"key": key, "value": value}) return true }) if 0 < count { - //logging.LogInfof("wrote block trees [%d]", count) + logging.LogInfof("wrote block trees [%d]", count) } - waitGroup.Wait() - p.Release() - - runtime.GC() elapsed := time.Since(start).Seconds() if 2 < elapsed { logging.LogWarnf("save block tree [size=%s] to [%s], elapsed [%.2fs]", humanize.Bytes(size), util.BlockTreePath, elapsed)