Skip to content

Commit 2bae1f1

Browse files
committed
feat: add db stat
1 parent 79b7e9b commit 2bae1f1

File tree

1 file changed

+29
-0
lines changed

1 file changed

+29
-0
lines changed

db.go

+29
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ package bitcask
33
import (
44
"bitcask/data"
55
"bitcask/index"
6+
"bitcask/utils"
67
"errors"
8+
"fmt"
79
"io"
810
"os"
911
"path/filepath"
@@ -30,6 +32,14 @@ type DB struct {
3032
isInitiated bool // 是否是第一次初始化数据目录
3133
}
3234

35+
// Stat 存储引擎统计信息
36+
type Stat struct {
37+
KeyNum uint // key 的总数量
38+
DataFileNum uint // 数据文件的数量
39+
ReclaimableSize int64 // 可以进行 merge 回收的数据量,字节为单位
40+
DiskSize int64 // 数据目录所占磁盘空间大小
41+
}
42+
3343
// Open 打开bitcask存储引擎示例
3444
func Open(cfg DBConfig) (*DB, error) {
3545
// 对传入配置进行校验
@@ -552,3 +562,22 @@ func (db *DB) loadSeqNo() error {
552562
db.seqNoFileExist = true
553563
return nil
554564
}
565+
func (db *DB) Stat() *Stat {
566+
db.mu.RLock()
567+
defer db.mu.RUnlock()
568+
569+
var dataFiles = uint(len(db.oldFile))
570+
if db.activeFile != nil {
571+
dataFiles += 1
572+
}
573+
574+
dirSize, err := utils.DirSize(db.cfg.DirPath)
575+
if err != nil {
576+
panic(fmt.Sprintf("failed to get dir size : %v", err))
577+
}
578+
return &Stat{
579+
KeyNum: uint(db.index.Size()),
580+
DataFileNum: dataFiles,
581+
DiskSize: dirSize,
582+
}
583+
}

0 commit comments

Comments
 (0)