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 }