🎨 尝试定位 未找到 ID 为 xxx 的内容块 https://github.com/siyuan-note/siyuan/issues/7215

This commit is contained in:
Liang Ding 2023-01-31 22:20:33 +08:00
parent bb24468f9b
commit 7aea03db69
No known key found for this signature in database
GPG key ID: 136F30F901A2231D
3 changed files with 23 additions and 9 deletions

View file

@ -30,7 +30,7 @@ import (
func StartCron() {
go every(100*time.Millisecond, task.ExecTaskJob)
go every(5*time.Second, task.StatusJob)
go every(3*time.Second, treenode.SaveBlockTreeJob)
go every(5*time.Second, treenode.SaveBlockTreeJob)
go every(5*time.Second, model.SyncDataJob)
go every(2*time.Hour, model.StatJob)
go every(2*time.Hour, model.RefreshCheckJob)

View file

@ -108,7 +108,7 @@ func autoFixIndex() {
redundantPaths := treenode.GetRedundantPaths(box.ID, paths)
for _, p := range redundantPaths {
treenode.RemoveBlockTreesByPath(p)
treenode.RemoveBlockTreesByPath(box.ID, p)
}
missingPaths := treenode.GetNotExistPaths(box.ID, paths)

View file

@ -36,7 +36,7 @@ import (
"github.com/vmihailenco/msgpack/v5"
)
var blockTrees = sync.Map{}
var blockTrees = &sync.Map{}
type btSlice struct {
data map[string]*BlockTree
@ -269,13 +269,13 @@ func RemoveBlockTreesByRootID(rootID string) {
}
}
func RemoveBlockTreesByPath(path string) {
func RemoveBlockTreesByPath(boxID, path string) {
var ids []string
blockTrees.Range(func(key, value interface{}) bool {
slice := value.(*btSlice)
slice.m.Lock()
for _, b := range slice.data {
if b.Path == path {
if b.Path == path && b.BoxID == boxID {
ids = append(ids, b.RootID)
}
}
@ -386,8 +386,15 @@ func IndexBlockTree(tree *parse.Tree) {
}
slice := val.(*btSlice)
slice.m.Lock()
slice.data[n.ID] = &BlockTree{ID: n.ID, ParentID: parentID, RootID: tree.ID, BoxID: tree.Box, Path: tree.Path, HPath: tree.HPath, Updated: n.IALAttr("updated"), Type: TypeAbbr(n.Type.String())}
slice.changed = time.Now()
if bt := slice.data[n.ID]; nil != bt {
if bt.Updated != n.IALAttr("updated") {
slice.data[n.ID] = &BlockTree{ID: n.ID, ParentID: parentID, RootID: tree.ID, BoxID: tree.Box, Path: tree.Path, HPath: tree.HPath, Updated: n.IALAttr("updated"), Type: TypeAbbr(n.Type.String())}
slice.changed = time.Now()
}
} else {
slice.data[n.ID] = &BlockTree{ID: n.ID, ParentID: parentID, RootID: tree.ID, BoxID: tree.Box, Path: tree.Path, HPath: tree.HPath, Updated: n.IALAttr("updated"), Type: TypeAbbr(n.Type.String())}
slice.changed = time.Now()
}
slice.m.Unlock()
return ast.WalkContinue
})
@ -401,6 +408,7 @@ func InitBlockTree(force bool) {
if nil != err {
logging.LogErrorf("remove blocktree file failed: %s", err)
}
blockTrees = &sync.Map{}
return
}
@ -485,7 +493,7 @@ func SaveBlockTree(force bool) {
key := arg.(map[string]interface{})["key"].(string)
slice := arg.(map[string]interface{})["value"].(*btSlice)
if !force && (slice.changed.IsZero() || slice.changed.After(start.Add(-7*time.Second))) {
if !force && slice.changed.IsZero() {
return
}
@ -508,16 +516,22 @@ func SaveBlockTree(force bool) {
size += uint64(len(data))
})
var count int
blockTrees.Range(func(key, value interface{}) bool {
slice := value.(*btSlice)
if !force && (slice.changed.IsZero() || slice.changed.After(start.Add(-7*time.Second))) {
if !force && slice.changed.IsZero() {
return true
}
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)
}
waitGroup.Wait()
p.Release()