Browse Source

:bug: 重复执行 `重建索引` 导致内核崩溃 https://github.com/siyuan-note/siyuan/issues/7238

Liang Ding 2 years ago
parent
commit
c7d51d2e6c
1 changed files with 9 additions and 27 deletions
  1. 9 27
      kernel/treenode/blocktree.go

+ 9 - 27
kernel/treenode/blocktree.go

@@ -391,15 +391,11 @@ func SaveBlockTree(force bool) {
 	os.MkdirAll(util.BlockTreePath, 0755)
 	os.MkdirAll(util.BlockTreePath, 0755)
 
 
 	size := uint64(0)
 	size := uint64(0)
-	poolSize := runtime.NumCPU()
-	waitGroup := &sync.WaitGroup{}
-	p, _ := ants.NewPoolWithFunc(poolSize, func(arg interface{}) {
-		defer waitGroup.Done()
-
-		key := arg.(map[string]interface{})["key"].(string)
-		slice := arg.(map[string]interface{})["value"].(*btSlice)
+	var count int
+	blockTrees.Range(func(key, value interface{}) bool {
+		slice := value.(*btSlice)
 		if !force && slice.changed.IsZero() {
 		if !force && slice.changed.IsZero() {
-			return
+			return true
 		}
 		}
 
 
 		slice.m.Lock()
 		slice.m.Lock()
@@ -407,40 +403,26 @@ func SaveBlockTree(force bool) {
 		if nil != err {
 		if nil != err {
 			logging.LogErrorf("marshal block tree failed: %s", err)
 			logging.LogErrorf("marshal block tree failed: %s", err)
 			os.Exit(util.ExitCodeBlockTreeErr)
 			os.Exit(util.ExitCodeBlockTreeErr)
-			return
+			return false
 		}
 		}
 		slice.m.Unlock()
 		slice.m.Unlock()
 
 
-		p := filepath.Join(util.BlockTreePath, key) + ".msgpack"
+		p := filepath.Join(util.BlockTreePath, key.(string)) + ".msgpack"
 		if err = gulu.File.WriteFileSafer(p, data, 0644); nil != err {
 		if err = gulu.File.WriteFileSafer(p, data, 0644); nil != err {
 			logging.LogErrorf("write block tree failed: %s", err)
 			logging.LogErrorf("write block tree failed: %s", err)
 			os.Exit(util.ExitCodeBlockTreeErr)
 			os.Exit(util.ExitCodeBlockTreeErr)
-			return
+			return false
 		}
 		}
+
 		slice.changed = time.Time{}
 		slice.changed = time.Time{}
 		size += uint64(len(data))
 		size += uint64(len(data))
-	})
-
-	var count int
-	blockTrees.Range(func(key, value interface{}) bool {
-		slice := value.(*btSlice)
-		if !force && slice.changed.IsZero() {
-			return true
-		}
-
 		count++
 		count++
-		waitGroup.Add(1)
-		p.Invoke(map[string]interface{}{"key": key, "value": value})
 		return true
 		return true
 	})
 	})
 	if 0 < count {
 	if 0 < count {
-		//logging.LogInfof("wrote block trees [%d]", count)
+		logging.LogInfof("wrote block trees [%d]", count)
 	}
 	}
 
 
-	waitGroup.Wait()
-	p.Release()
-
-	runtime.GC()
 	elapsed := time.Since(start).Seconds()
 	elapsed := time.Since(start).Seconds()
 	if 2 < elapsed {
 	if 2 < elapsed {
 		logging.LogWarnf("save block tree [size=%s] to [%s], elapsed [%.2fs]", humanize.Bytes(size), util.BlockTreePath, elapsed)
 		logging.LogWarnf("save block tree [size=%s] to [%s], elapsed [%.2fs]", humanize.Bytes(size), util.BlockTreePath, elapsed)