From c631b64d00337fee2fede2ae559c4dc6c1a61440 Mon Sep 17 00:00:00 2001 From: Liang Ding Date: Mon, 9 Jan 2023 10:25:50 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20=E8=87=AA=E5=8A=A8=E6=A0=A1=E9=AA=8C?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E7=B4=A2=E5=BC=95=20https://github.?= =?UTF-8?q?com/siyuan-note/siyuan/issues/7016?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/transaction.go | 29 ++++++++++++++++++----------- kernel/sql/block_query.go | 23 ++++++++++++++++++----- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 92c01616c..6e5e64278 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -1237,18 +1237,21 @@ func autoFixIndex() { autoFixLock.Lock() defer autoFixLock.Unlock() - rootUpdated := treenode.GetRootUpdated() + rootUpdatedMap := treenode.GetRootUpdated() i := -1 - size := len(rootUpdated) - for rootID, updated := range rootUpdated { + size := len(rootUpdatedMap) + for rootID, updated := range rootUpdatedMap { if isFullReindexing { break } i++ - root := sql.GetBlock(rootID) - if nil == root { + rootUpdated, err := sql.GetRootUpdated(rootID) + if nil != err { + continue + } + if "" == rootUpdated { logging.LogWarnf("not found tree [%s] in database, reindex it", rootID) reindexTree(rootID, i, size) continue @@ -1261,20 +1264,24 @@ func autoFixIndex() { } btUpdated, _ := time.Parse("20060102150405", updated) - dbUpdated, _ := time.Parse("20060102150405", root.Updated) + dbUpdated, _ := time.Parse("20060102150405", rootUpdated) if dbUpdated.Before(btUpdated.Add(-1 * time.Minute)) { logging.LogWarnf("tree [%s] is not up to date, reindex it", rootID) reindexTree(rootID, i, size) continue } + } - roots := sql.GetBlockRedundant(rootID) - if 1 < len(roots) { - logging.LogWarnf("exist more than one tree [%s], reindex it", rootID) - sql.RemoveTreeQueue(root.Box, rootID) - reindexTree(rootID, i, size) + duplicatedRootIDs := sql.GetDuplicatedRootIDs() + for _, rootID := range duplicatedRootIDs { + root := sql.GetBlock(rootID) + if nil == root { continue } + + logging.LogWarnf("exist more than one tree [%s], reindex it", rootID) + sql.RemoveTreeQueue(root.Box, rootID) + reindexTree(rootID, i, size) } } diff --git a/kernel/sql/block_query.go b/kernel/sql/block_query.go index 50c811e5f..693bdd8c1 100644 --- a/kernel/sql/block_query.go +++ b/kernel/sql/block_query.go @@ -581,17 +581,30 @@ func GetBlock(id string) (ret *Block) { return } -func GetBlockRedundant(id string) (ret []*Block) { - rows, err := query("SELECT * FROM blocks WHERE id = ?", id) +func GetRootUpdated(rootID string) (ret string, err error) { + rows, err := query("SELECT updated FROM blocks WHERE root_id = ? AND type = 'd'", rootID) if nil != err { logging.LogErrorf("sql query failed: %s", err) return } defer rows.Close() for rows.Next() { - if block := scanBlockRows(rows); nil != block { - ret = append(ret, block) - } + rows.Scan(&ret) + } + return +} + +func GetDuplicatedRootIDs() (ret []string) { + rows, err := query("SELECT DISTINCT root_id FROM blocks GROUP BY id HAVING COUNT(*) > 1") + if nil != err { + logging.LogErrorf("sql query failed: %s", err) + return + } + defer rows.Close() + for rows.Next() { + var id string + rows.Scan(&id) + ret = append(ret, id) } return }