diff --git a/kernel/treenode/blocktree.go b/kernel/treenode/blocktree.go index ec43c5b83..a3b8a8f49 100644 --- a/kernel/treenode/blocktree.go +++ b/kernel/treenode/blocktree.go @@ -389,23 +389,31 @@ func InitBlockTree(force bool) { return } - size := uint64(0) - + size := int64(0) waitGroup := &sync.WaitGroup{} p, _ := ants.NewPoolWithFunc(4, func(arg interface{}) { defer waitGroup.Done() entry := arg.(os.DirEntry) p := filepath.Join(util.BlockTreePath, entry.Name()) - data, err := os.ReadFile(p) + + f, err := os.OpenFile(p, os.O_RDONLY, 0644) if nil != err { - logging.LogErrorf("read block tree failed: %s", err) + logging.LogErrorf("open block tree failed: %s", err) os.Exit(logging.ExitCodeFileSysErr) return } + info, err := f.Stat() + if nil != err { + logging.LogErrorf("stat block tree failed: %s", err) + os.Exit(logging.ExitCodeFileSysErr) + return + } + size += info.Size() + sliceData := map[string]*BlockTree{} - if err = msgpack.Unmarshal(data, &sliceData); nil != err { + if err = msgpack.NewDecoder(f).Decode(&sliceData); nil != err { logging.LogErrorf("unmarshal block tree failed: %s", err) if err = os.RemoveAll(util.BlockTreePath); nil != err { logging.LogErrorf("removed corrupted block tree failed: %s", err) @@ -414,9 +422,14 @@ func InitBlockTree(force bool) { return } + if err = f.Close(); nil != err { + logging.LogErrorf("close block tree failed: %s", err) + os.Exit(logging.ExitCodeFileSysErr) + return + } + name := entry.Name()[0:strings.Index(entry.Name(), ".")] blockTrees.Store(name, &btSlice{data: sliceData, changed: time.Time{}, m: &sync.Mutex{}}) - size += uint64(len(data)) }) for _, entry := range entries { if !strings.HasSuffix(entry.Name(), ".msgpack") { @@ -432,7 +445,7 @@ func InitBlockTree(force bool) { debug.FreeOSMemory() elapsed := time.Since(start).Seconds() - logging.LogInfof("read block tree [%s] to [%s], elapsed [%.2fs]", humanize.Bytes((size)), util.BlockTreePath, elapsed) + logging.LogInfof("read block tree [%s] to [%s], elapsed [%.2fs]", humanize.Bytes(uint64(size)), util.BlockTreePath, elapsed) return }