Skip to content

Commit e15742d

Browse files
committed
🎨 Skip persisting referencing docs when block ref anchor text is unchanged #18058
1 parent 63ba3f5 commit e15742d

4 files changed

Lines changed: 41 additions & 20 deletions

File tree

kernel/av/av.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -651,14 +651,19 @@ func SaveAttributeView(av *AttributeView) (err error) {
651651
return
652652
}
653653

654-
// 缓存命中且字节相等时跳过落盘,避免无变更的重复写入
654+
// 缓存与待写入数据一致时跳过落盘;缓存未命中时再读盘比对,避免无变更的重复写入
655+
avJSONPath := GetAttributeViewDataPath(av.ID)
655656
if cachedData, ok := cache.GetAVData(av.ID); ok {
656657
if len(cachedData) == len(data) && bytes.Equal(cachedData, data) {
657658
return
658659
}
660+
} else {
661+
if diskData, readErr := filelock.ReadFile(avJSONPath); nil == readErr && len(diskData) == len(data) && bytes.Equal(diskData, data) {
662+
cache.SetAVData(av.ID, data)
663+
return
664+
}
659665
}
660666

661-
avJSONPath := GetAttributeViewDataPath(av.ID)
662667
if err = util.WriteFileByMmap(avJSONPath, data); nil != err {
663668
if err = filelock.WriteFile(avJSONPath, data); nil != err {
664669
logging.LogErrorf("save attribute view [%s] failed: %s", av.ID, err)

kernel/filesys/tree.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,11 +246,16 @@ func WriteTree(tree *parse.Tree) (size uint64, err error) {
246246
return
247247
}
248248

249-
cachedData, ok := cache.GetTreeData(tree.ID)
250-
if ok {
249+
// 缓存与待写入数据一致时跳过落盘;缓存未命中时再读盘比对,避免无变更的重复写入
250+
if cachedData, ok := cache.GetTreeData(tree.ID); ok {
251251
if len(cachedData) == len(data) && bytes.Equal(cachedData, data) {
252252
return
253253
}
254+
} else {
255+
if diskData, readErr := filelock.ReadFile(filePath); nil == readErr && len(diskData) == len(data) && bytes.Equal(diskData, data) {
256+
cache.SetTreeData(tree.ID, data)
257+
return
258+
}
254259
}
255260

256261
if err = util.WriteFileByMmap(filePath, data); nil != err {

kernel/model/blockial.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -221,13 +221,26 @@ func setNodeAttrs(node *ast.Node, tree *parse.Tree, nameValues map[string]string
221221
ReloadFiletree()
222222
}
223223

224-
go func() {
225-
sql.FlushQueue()
226-
refreshDynamicRefText(node, tree)
227-
}()
224+
if attrsAffectRefText(nameValues) {
225+
go func() {
226+
sql.FlushQueue()
227+
refreshDynamicRefText(node, tree)
228+
}()
229+
}
228230
return
229231
}
230232

233+
// attrsAffectRefText 判断本次属性变更是否可能影响引用处的动态锚文本。
234+
func attrsAffectRefText(nameValues map[string]string) bool {
235+
for name := range nameValues {
236+
switch strings.ToLower(name) {
237+
case "name", "title":
238+
return true
239+
}
240+
}
241+
return false
242+
}
243+
231244
func setNodeAttrsWithTx(tx *Transaction, node *ast.Node, tree *parse.Tree, nameValues map[string]string) (err error) {
232245
oldAttrs, err := setNodeAttrs0(node, nameValues)
233246
if err != nil {

kernel/model/transaction.go

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2119,21 +2119,19 @@ func updateRefText(refNode *ast.Node, changedDefNodes map[string]*ast.Node) (cha
21192119
return ast.WalkSkipChildren
21202120
}
21212121

2122-
changed = true
21232122
if "d" == subtype {
2124-
refText = strings.TrimSpace(getNodeRefText(defNode))
2125-
if "" == refText {
2126-
refText = n.TextMarkBlockRefID
2123+
newRefText := strings.TrimSpace(getNodeRefText(defNode))
2124+
if "" == newRefText {
2125+
newRefText = n.TextMarkBlockRefID
21272126
}
2128-
treenode.SetDynamicBlockRefText(n, refText)
2127+
if strings.TrimSpace(refText) == newRefText {
2128+
return ast.WalkContinue
2129+
}
2130+
treenode.SetDynamicBlockRefText(n, newRefText)
2131+
changed = true
2132+
refText = newRefText
2133+
defNodes = append(defNodes, &changedDefNode{id: defID, refText: refText, refType: "ref-" + subtype})
21292134
}
2130-
defNodes = append(defNodes, &changedDefNode{id: defID, refText: refText, refType: "ref-" + subtype})
2131-
return ast.WalkContinue
2132-
} else if treenode.IsEmbedBlockRef(n) {
2133-
defID := treenode.GetEmbedBlockRef(n)
2134-
changed = true
2135-
defNodes = append(defNodes, &changedDefNode{id: defID, refType: "embed"})
2136-
return ast.WalkContinue
21372135
}
21382136
return ast.WalkContinue
21392137
})

0 commit comments

Comments
 (0)