1 Star 0 Fork 0

liucxer / ceph-tools

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
exec_config.go 4.35 KB
一键复制 编辑 原始数据 按行查看 历史
刘昌喜 提交于 2023-03-02 19:48 . 增加rados统计功能
package rados_object_stats
import (
"encoding/json"
"fmt"
cmd "gitee.com/liucxer/ceph-tools/pkg/cmd_mgr"
"github.com/sirupsen/logrus"
"io/ioutil"
"strconv"
)
type ExecConfig struct {
FilePath string `json:"filePath"`
PoolName string `json:"poolName"`
}
func NewExecConfig(configPath string) (*ExecConfig, error) {
execConfig := ExecConfig{}
err := execConfig.ReadConfig(configPath)
if err != nil {
return &execConfig, nil
}
logrus.Debugf("NewExecConfig. execConfig:%+v", execConfig)
return &execConfig, nil
}
func (execConfig *ExecConfig) ReadConfig(configFilePath string) error {
bts, err := ioutil.ReadFile(configFilePath)
if err != nil {
logrus.Errorf("ioutil.ReadFile err:%v", err)
return err
}
err = json.Unmarshal(bts, execConfig)
if err != nil {
logrus.Errorf("json.Unmarshal err:%v", err)
return err
}
return err
}
type ExecConfigResult struct {
OsdID int64 `json:"osdID"`
SliceNum int64 `json:"sliceNum"`
}
type RadosObject struct {
ObjectID string
OsdIDs []int64
}
func (execConfig *ExecConfig) Run() (*[]ExecConfigResult, error) {
var (
res []ExecConfigResult
err error
)
// 获取文件inode号(16进制的)
inodeNo, err := execConfig.GetInode()
if err != nil {
return nil, err
}
// 获取这个文件有多少分片
sliceNum, err := execConfig.GetFileSliceNum()
if err != nil {
return nil, err
}
var radosObjects []RadosObject
for i := int64(0); i < sliceNum; i++ {
data := fmt.Sprintf("%x", i)
oid := inodeNo + "."
if len(data) == 1 {
oid = oid + "0000000" + data
}
if len(data) == 2 {
oid = oid + "000000" + data
}
if len(data) == 3 {
oid = oid + "00000" + data
}
if len(data) == 4 {
oid = oid + "0000" + data
}
if len(data) == 5 {
oid = oid + "000" + data
}
if len(data) == 6 {
oid = oid + "00" + data
}
if len(data) == 7 {
oid = oid + "0" + data
}
if len(data) == 8 {
oid = oid + data
}
radosObject, err := execConfig.GetRadosObject(oid)
if err != nil {
return nil, err
}
radosObjects = append(radosObjects, radosObject)
//res = append(res, item)
}
radosMap := map[int64]int64{}
for _, radosObject := range radosObjects {
for _, osdID := range radosObject.OsdIDs {
radosMap[osdID]++
}
}
for key, value := range radosMap {
res = append(res, ExecConfigResult{
OsdID: key,
SliceNum: value,
})
}
// 每个导出每个分片
return &res, err
}
// GetInode 获取文件inode号(16进制的)
func (execConfig *ExecConfig) GetInode() (string, error) {
var (
inodeNo string
err error
)
cmdMgr := cmd.NewCmdMgr()
status, err := cmdMgr.SyncExecute("ls -i " + execConfig.FilePath + " |awk -F' ' '{print $1}'")
if err != nil {
return inodeNo, err
}
inodeNoInt, err := strconv.Atoi(status.Stdout)
if err != nil {
logrus.Errorf("strconv.Atoi err:%v args:%s", err, status.Stdout)
return inodeNo, err
}
inodeNo = fmt.Sprintf("%x", inodeNoInt)
return inodeNo, err
}
func (execConfig *ExecConfig) GetFileSliceNum() (int64, error) {
var (
sliceNum int64
err error
)
cmdMgr := cmd.NewCmdMgr()
status, err := cmdMgr.SyncExecute("ls -l " + execConfig.FilePath + " |awk -F' ' '{print $5}'")
if err != nil {
return sliceNum, err
}
sizeInt, err := strconv.Atoi(status.Stdout)
if err != nil {
logrus.Errorf("strconv.Atoi err:%v args:%s", err, status.Stdout)
return sliceNum, err
}
tmpNum := int64(sizeInt) % (4 * 1024 * 1024)
sliceNum = int64(sizeInt) / (4 * 1024 * 1024)
if tmpNum != 0 {
sliceNum++
}
return sliceNum, nil
}
/*
[root@node27 liucxer]# ceph osd map data_pool 10005902501.0000002c --format=json
{"epoch":5591,"pool":"data_pool","pool_id":2,"objname":"10005902501.0000002c","raw_pgid":"2.b945b66e","pgid":"2.6e","up":[2,7,10],"up_primary":2,"acting":[2,7,10],"acting_primary":2}
*/
func (execConfig *ExecConfig) GetRadosObject(objectID string) (RadosObject, error) {
var (
radosObject RadosObject
)
type OsdMap struct {
ObjName string `json:"objname"`
Acting []int64 `json:"acting"`
}
var osdMap OsdMap
cmdMgr := cmd.NewCmdMgr()
status, err := cmdMgr.SyncExecute("ceph osd map " + execConfig.PoolName + " " + objectID + " --format=json")
if err != nil {
return radosObject, err
}
err = json.Unmarshal([]byte(status.Stdout), &osdMap)
if err != nil {
return radosObject, err
}
radosObject.ObjectID = objectID
radosObject.OsdIDs = osdMap.Acting
return radosObject, nil
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/liucxer/ceph-tools.git
git@gitee.com:liucxer/ceph-tools.git
liucxer
ceph-tools
ceph-tools
ecdc69b73bfe

搜索帮助

344bd9b3 5694891 D2dac590 5694891