diff --git a/kernel/model/file.go b/kernel/model/file.go index eb87493a5..7e007a689 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -1199,6 +1199,7 @@ func GetFullHPathByID(id string) (hPath string, err error) { } func GetIDsByHPath(hpath, boxID string) (ret []string, err error) { + ret = []string{} roots := treenode.GetBlockTreeRootsByHPath(boxID, hpath) if 1 > len(roots) { return @@ -1208,6 +1209,9 @@ func GetIDsByHPath(hpath, boxID string) (ret []string, err error) { ret = append(ret, root.ID) } ret = gulu.Str.RemoveDuplicatedElem(ret) + if 1 > len(ret) { + ret = []string{} + } return } diff --git a/kernel/model/session.go b/kernel/model/session.go index 3c74a4ac5..1a0f9fbc1 100644 --- a/kernel/model/session.go +++ b/kernel/model/session.go @@ -331,11 +331,31 @@ func ControlConcurrency(c *gin.Context) { return } + reqPath := c.Request.URL.Path + + // Improve the concurrency of the kernel data reading interfaces https://github.com/siyuan-note/siyuan/issues/10149 + if strings.HasPrefix(reqPath, "/stage/") || strings.HasPrefix(reqPath, "/assets/") || strings.HasPrefix(reqPath, "/appearance/") { + c.Next() + return + } + + parts := strings.Split(reqPath, "/") + function := parts[len(parts)-1] + if strings.HasPrefix(function, "get") || strings.HasPrefix(function, "list") || + strings.HasPrefix(function, "search") || strings.HasPrefix(function, "render") || strings.HasPrefix(function, "ls") { + c.Next() + return + } + if strings.HasPrefix(function, "/api/query/") || strings.HasPrefix(function, "/api/search/") { + c.Next() + return + } + requestingLock.Lock() - mutex := requesting[c.Request.URL.Path] + mutex := requesting[reqPath] if nil == mutex { mutex = &sync.Mutex{} - requesting[c.Request.URL.Path] = mutex + requesting[reqPath] = mutex } requestingLock.Unlock()