diff --git a/kernel/model/file.go b/kernel/model/file.go index f409586ad..354bf5219 100644 --- a/kernel/model/file.go +++ b/kernel/model/file.go @@ -918,9 +918,12 @@ func loadNodesByMode(node *ast.Node, inputIndex, mode, size int, isDoc, isHeadin } func writeJSONQueue(tree *parse.Tree) (err error) { + writingDataLock.Lock() if err = filesys.WriteTree(tree); nil != err { + writingDataLock.Unlock() return } + writingDataLock.Unlock() sql.UpsertTreeQueue(tree) return } @@ -931,9 +934,12 @@ func indexWriteJSONQueue(tree *parse.Tree) (err error) { } func renameWriteJSONQueue(tree *parse.Tree, oldHPath string) (err error) { + writingDataLock.Unlock() if err = filesys.WriteTree(tree); nil != err { + writingDataLock.Unlock() return } + writingDataLock.Unlock() sql.RenameTreeQueue(tree, oldHPath) treenode.ReindexBlockTree(tree) return diff --git a/kernel/model/sync.go b/kernel/model/sync.go index 0133d5f64..bb6abf522 100644 --- a/kernel/model/sync.go +++ b/kernel/model/sync.go @@ -63,6 +63,9 @@ func SyncData(boot, exit, byHand bool) { return } + writingDataLock.Lock() + defer writingDataLock.Unlock() + if util.IsMutexLocked(&syncLock) { logging.LogWarnf("sync is in progress") planSyncAfter(30 * time.Second) diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index b98d322b4..44c81c175 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -110,9 +110,12 @@ func AutoFlushTx() { } } +var txLock = sync.Mutex{} + func flushTx() { - writingDataLock.Lock() - defer writingDataLock.Unlock() + txLock.Lock() + defer txLock.Unlock() + defer logging.Recover() currentTx = mergeTx() diff --git a/kernel/model/upload.go b/kernel/model/upload.go index a327cbc67..75f0dcdaa 100644 --- a/kernel/model/upload.go +++ b/kernel/model/upload.go @@ -34,6 +34,9 @@ import ( ) func InsertLocalAssets(id string, assetPaths []string) (succMap map[string]interface{}, err error) { + writingDataLock.Lock() + defer writingDataLock.Unlock() + succMap = map[string]interface{}{} bt := treenode.GetBlockTree(id) @@ -101,6 +104,9 @@ func Upload(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(200, ret) + writingDataLock.Lock() + defer writingDataLock.Unlock() + form, err := c.MultipartForm() if nil != err { logging.LogErrorf("insert asset failed: %s", err)