From b5494e9af70a504bedd9d9d45af35092d2102260 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 22 Dec 2023 10:00:40 +0800 Subject: [PATCH] :art: Concurrency control when requesting the kernel API https://github.com/siyuan-note/siyuan/issues/9939 --- kernel/model/session.go | 20 ++++++++++++++++++++ kernel/server/serve.go | 1 + 2 files changed, 21 insertions(+) diff --git a/kernel/model/session.go b/kernel/model/session.go index e14a4452a..75ca732d6 100644 --- a/kernel/model/session.go +++ b/kernel/model/session.go @@ -23,6 +23,7 @@ import ( "os" "strconv" "strings" + "sync" "time" "github.com/88250/gulu" @@ -317,3 +318,22 @@ func Recover(c *gin.Context) { c.Next() } + +var ( + requestingLock = sync.Mutex{} + requesting = map[string]*sync.Mutex{} +) + +func ControlConcurrency(c *gin.Context) { + requestingLock.Lock() + mutex := requesting[c.Request.URL.Path] + if nil == mutex { + mutex = &sync.Mutex{} + requesting[c.Request.URL.Path] = mutex + } + requestingLock.Unlock() + + mutex.Lock() + c.Next() + mutex.Unlock() +} diff --git a/kernel/server/serve.go b/kernel/server/serve.go index 41c7ab4fd..3a3698201 100644 --- a/kernel/server/serve.go +++ b/kernel/server/serve.go @@ -52,6 +52,7 @@ func Serve(fastMode bool) { ginServer := gin.New() ginServer.MaxMultipartMemory = 1024 * 1024 * 32 // 插入较大的资源文件时内存占用较大 https://github.com/siyuan-note/siyuan/issues/5023 ginServer.Use( + model.ControlConcurrency, // 请求串行化 Concurrency control when requesting the kernel API https://github.com/siyuan-note/siyuan/issues/9939 model.Timing, model.Recover, corsMiddleware(), // 后端服务支持 CORS 预检请求验证 https://github.com/siyuan-note/siyuan/pull/5593