From 9b28cdfdf1ad3da4371bbc5e82b111b8dfb50f3f Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Wed, 25 Jan 2023 20:04:05 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E6=94=B9=E8=BF=9B=E5=86=85=E6=A0=B8?= =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E8=B0=83=E5=BA=A6=E6=9C=BA=E5=88=B6=E6=8F=90?= =?UTF-8?q?=E5=8D=87=E7=A8=B3=E5=AE=9A=E6=80=A7=20https://github.com/siyua?= =?UTF-8?q?n-note/siyuan/issues/7113?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/sql/queue.go | 2 +- kernel/task/queue.go | 23 +++++++++++++++-------- kernel/treenode/blocktree.go | 23 +++++++++++++---------- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/kernel/sql/queue.go b/kernel/sql/queue.go index e1f613eb3..038907aa4 100644 --- a/kernel/sql/queue.go +++ b/kernel/sql/queue.go @@ -54,7 +54,7 @@ type dbQueueOperation struct { func AutoFlushTx() { for { time.Sleep(util.SQLFlushInterval) - task.PrependTask(task.DatabaseIndexCommit, FlushQueue) + task.AppendTask(task.DatabaseIndexCommit, FlushQueue) } } diff --git a/kernel/task/queue.go b/kernel/task/queue.go index 0a96bcb55..1a5be5788 100644 --- a/kernel/task/queue.go +++ b/kernel/task/queue.go @@ -52,6 +52,7 @@ func PrependTask(action string, handler interface{}, args ...interface{}) { return } + cancelTask(action, args...) taskQueue = append([]*Task{newTask(action, handler, args...)}, taskQueue...) } @@ -64,20 +65,26 @@ func AppendTask(action string, handler interface{}, args ...interface{}) { return } + cancelTask(action, args...) taskQueue = append(taskQueue, newTask(action, handler, args...)) } -func CancelTask(actions ...string) { - queueLock.Lock() - defer queueLock.Unlock() - +func cancelTask(action string, args ...interface{}) { for i := len(taskQueue) - 1; i >= 0; i-- { task := taskQueue[i] - for _, action := range actions { - if action == task.Action { - taskQueue = append(taskQueue[:i], taskQueue[i+1:]...) - break + if action == task.Action { + if len(task.Args) != len(args) { + continue } + + for j, arg := range args { + if arg != task.Args[j] { + continue + } + } + + taskQueue = append(taskQueue[:i], taskQueue[i+1:]...) + break } } } diff --git a/kernel/treenode/blocktree.go b/kernel/treenode/blocktree.go index 55f1eac0f..968987040 100644 --- a/kernel/treenode/blocktree.go +++ b/kernel/treenode/blocktree.go @@ -35,7 +35,7 @@ import ( var blockTrees = map[string]*BlockTree{} var blockTreesLock = sync.Mutex{} -var blockTreesChanged = false +var blockTreesChanged = time.Time{} type BlockTree struct { ID string // 块 ID @@ -209,7 +209,7 @@ func SetBlockTreePath(tree *parse.Tree) { b.BoxID, b.Path, b.HPath, b.Updated = tree.Box, tree.Path, tree.HPath, tree.Root.IALAttr("updated") } } - blockTreesChanged = true + blockTreesChanged = time.Now() } func RemoveBlockTreesByRootID(rootID string) { @@ -226,7 +226,7 @@ func RemoveBlockTreesByRootID(rootID string) { for _, id := range ids { delete(blockTrees, id) } - blockTreesChanged = true + blockTreesChanged = time.Now() } func RemoveBlockTreesByPath(path string) { @@ -243,7 +243,7 @@ func RemoveBlockTreesByPath(path string) { for _, id := range ids { delete(blockTrees, id) } - blockTreesChanged = true + blockTreesChanged = time.Now() } func RemoveBlockTreesByPathPrefix(pathPrefix string) { @@ -260,7 +260,7 @@ func RemoveBlockTreesByPathPrefix(pathPrefix string) { for _, id := range ids { delete(blockTrees, id) } - blockTreesChanged = true + blockTreesChanged = time.Now() } func RemoveBlockTreesByBoxID(boxID string) (ids []string) { @@ -276,7 +276,7 @@ func RemoveBlockTreesByBoxID(boxID string) (ids []string) { for _, id := range ids { delete(blockTrees, id) } - blockTreesChanged = true + blockTreesChanged = time.Now() return } @@ -285,7 +285,7 @@ func RemoveBlockTree(id string) { defer blockTreesLock.Unlock() delete(blockTrees, id) - blockTreesChanged = true + blockTreesChanged = time.Now() } func ReindexBlockTree(tree *parse.Tree) { @@ -306,7 +306,7 @@ func ReindexBlockTree(tree *parse.Tree) { blockTrees[n.ID] = &BlockTree{ID: n.ID, ParentID: parentID, RootID: tree.ID, BoxID: tree.Box, Path: tree.Path, HPath: tree.HPath, Updated: tree.Root.IALAttr("updated")} return ast.WalkContinue }) - blockTreesChanged = true + blockTreesChanged = time.Now() } func AutoFlushBlockTree() { @@ -361,11 +361,14 @@ func InitBlockTree(force bool) { } func SaveBlockTree(force bool) { - if !force && !blockTreesChanged { + if !force && blockTreesChanged.IsZero() { return } start := time.Now() + if blockTreesChanged.Before(start.Add(7 * time.Second)) { + return + } blockTreesLock.Lock() data, err := msgpack.Marshal(blockTrees) @@ -387,5 +390,5 @@ func SaveBlockTree(force bool) { logging.LogWarnf("save block tree [size=%s] to [%s], elapsed [%.2fs]", humanize.Bytes(uint64(len(data))), util.BlockTreePath, elapsed) } - blockTreesChanged = false + blockTreesChanged = time.Time{} }