|
@@ -391,15 +391,11 @@ func SaveBlockTree(force bool) {
|
|
|
os.MkdirAll(util.BlockTreePath, 0755)
|
|
|
|
|
|
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() {
|
|
|
- return
|
|
|
+ return true
|
|
|
}
|
|
|
|
|
|
slice.m.Lock()
|
|
@@ -407,40 +403,26 @@ func SaveBlockTree(force bool) {
|
|
|
if nil != err {
|
|
|
logging.LogErrorf("marshal block tree failed: %s", err)
|
|
|
os.Exit(util.ExitCodeBlockTreeErr)
|
|
|
- return
|
|
|
+ return false
|
|
|
}
|
|
|
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 {
|
|
|
logging.LogErrorf("write block tree failed: %s", err)
|
|
|
os.Exit(util.ExitCodeBlockTreeErr)
|
|
|
- return
|
|
|
+ return false
|
|
|
}
|
|
|
+
|
|
|
slice.changed = time.Time{}
|
|
|
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++
|
|
|
- waitGroup.Add(1)
|
|
|
- p.Invoke(map[string]interface{}{"key": key, "value": value})
|
|
|
return true
|
|
|
})
|
|
|
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()
|
|
|
if 2 < elapsed {
|
|
|
logging.LogWarnf("save block tree [size=%s] to [%s], elapsed [%.2fs]", humanize.Bytes(size), util.BlockTreePath, elapsed)
|