diff --git a/kernel/model/history.go b/kernel/model/history.go index 074843121..8182aa88d 100644 --- a/kernel/model/history.go +++ b/kernel/model/history.go @@ -582,8 +582,9 @@ func ReindexHistory() (err error) { name := historyDir.Name() indexHistoryDir(name, lutEngine) - util.PushEndlessProgress(fmt.Sprintf(Conf.Language(40), name)) } + + sql.WaitForWritingHistoryDatabase() return } diff --git a/kernel/sql/queue_history.go b/kernel/sql/queue_history.go index 35666f313..998933387 100644 --- a/kernel/sql/queue_history.go +++ b/kernel/sql/queue_history.go @@ -59,7 +59,7 @@ func FlushHistoryQueue() { defer txLock.Unlock() start := time.Now() - context := map[string]interface{}{eventbus.CtxPushMsg: eventbus.CtxPushMsgToStatusBar} + context := map[string]interface{}{eventbus.CtxPushMsg: eventbus.CtxPushMsgToStatusBarAndProgress} total := len(ops) for i, op := range ops { if util.IsExiting { @@ -137,3 +137,27 @@ func getHistoryOperations() (ops []*historyDBQueueOperation) { historyOperationQueue = nil return } + +func WaitForWritingHistoryDatabase() { + var printLog bool + var lastPrintLog bool + for i := 0; isWritingHistoryDatabase(); i++ { + time.Sleep(50 * time.Millisecond) + if 200 < i && !printLog { // 10s 后打日志 + logging.LogWarnf("history database is writing: \n%s", logging.ShortStack()) + printLog = true + } + if 1200 < i && !lastPrintLog { // 60s 后打日志 + logging.LogWarnf("history database is still writing") + lastPrintLog = true + } + } +} + +func isWritingHistoryDatabase() bool { + time.Sleep(util.SQLFlushInterval + 50*time.Millisecond) + if 0 < len(historyOperationQueue) || util.IsMutexLocked(&historyTxLock) { + return true + } + return false +}