Crush rules. Pool root
parent
7b73a20d34
commit
7e9491ab2d
|
@ -2,14 +2,25 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func get_pool_size(cephconn *Cephconnection, params Params) Poolinfo {
|
func makepreudorandom() {
|
||||||
monjson, err := json.Marshal(map[string]string{"prefix": "osd pool get", "pool": params.pool,
|
a := make([]int, 0, 4096/4)
|
||||||
"format": "json", "var": "size"})
|
for i := 0; i < 4096; i += 4 {
|
||||||
|
a = append(a, i)
|
||||||
|
}
|
||||||
|
rand.Shuffle(len(a), func(i, j int) {
|
||||||
|
a[i], a[j] = a[j], a[i]
|
||||||
|
})
|
||||||
|
fmt.Println(a)
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeMonQuery(cephconn *Cephconnection, query map[string]string) []byte {
|
||||||
|
monjson, err := json.Marshal(query)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Can't marshal json mon query. Error: %v", err)
|
log.Fatalf("Can't marshal json mon query. Error: %v", err)
|
||||||
}
|
}
|
||||||
|
@ -18,7 +29,12 @@ func get_pool_size(cephconn *Cephconnection, params Params) Poolinfo {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Failed exec monCommand. Error: %v", err)
|
log.Fatalf("Failed exec monCommand. Error: %v", err)
|
||||||
}
|
}
|
||||||
|
return monrawanswer
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetPoolSize(cephconn *Cephconnection, params Params) Poolinfo {
|
||||||
|
monrawanswer := MakeMonQuery(cephconn, map[string]string{"prefix": "osd pool get", "pool": params.pool,
|
||||||
|
"format": "json", "var": "size"})
|
||||||
monanswer := Poolinfo{}
|
monanswer := Poolinfo{}
|
||||||
if err := json.Unmarshal([]byte(monrawanswer), &monanswer); err != nil {
|
if err := json.Unmarshal([]byte(monrawanswer), &monanswer); err != nil {
|
||||||
log.Fatalf("Can't parse monitor answer. Error: %v", err)
|
log.Fatalf("Can't parse monitor answer. Error: %v", err)
|
||||||
|
@ -27,16 +43,9 @@ func get_pool_size(cephconn *Cephconnection, params Params) Poolinfo {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func get_pg_by_pool(cephconn *Cephconnection, params Params) []PlacementGroup {
|
func GetPgByPool(cephconn *Cephconnection, params Params) []PlacementGroup {
|
||||||
monjson, err := json.Marshal(map[string]string{"prefix": "pg ls-by-pool", "poolstr": params.pool, "format": "json"})
|
monrawanswer := MakeMonQuery(cephconn, map[string]string{"prefix": "pg ls-by-pool", "poolstr": params.pool,
|
||||||
if err != nil {
|
"format": "json"})
|
||||||
log.Fatalf("Can't marshal json mon query. Error: %v", err)
|
|
||||||
}
|
|
||||||
monrawanswer, _, err := cephconn.conn.MonCommand(monjson)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("Failed exec monCommand. Error: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
monanswer := []PlacementGroup{}
|
monanswer := []PlacementGroup{}
|
||||||
if err := json.Unmarshal([]byte(monrawanswer), &monanswer); err != nil {
|
if err := json.Unmarshal([]byte(monrawanswer), &monanswer); err != nil {
|
||||||
log.Fatalf("Can't parse monitor answer. Error: %v", err)
|
log.Fatalf("Can't parse monitor answer. Error: %v", err)
|
||||||
|
@ -44,13 +53,44 @@ func get_pg_by_pool(cephconn *Cephconnection, params Params) []PlacementGroup {
|
||||||
return monanswer
|
return monanswer
|
||||||
}
|
}
|
||||||
|
|
||||||
//func get_crush_dump(params Params, cephconn *Cephconnection) OsdCrushDump {
|
func GetOsdCrushDump(cephconn *Cephconnection) OsdCrushDump {
|
||||||
//
|
monrawanswer := MakeMonQuery(cephconn, map[string]string{"prefix": "osd crush dump", "format": "json"})
|
||||||
//}
|
monanswer := OsdCrushDump{}
|
||||||
|
if err := json.Unmarshal([]byte(monrawanswer), &monanswer); err != nil {
|
||||||
|
log.Fatalf("Can't parse monitor answer. Error: %v", err)
|
||||||
|
}
|
||||||
|
return monanswer
|
||||||
|
}
|
||||||
|
|
||||||
//func get_acting_osd(params Params, ) map[string]float64 {
|
func GetOsdDump(cephconn *Cephconnection) OsdDump {
|
||||||
//
|
monrawanswer := MakeMonQuery(cephconn, map[string]string{"prefix": "osd dump", "format": "json"})
|
||||||
//}
|
monanswer := OsdDump{}
|
||||||
|
if err := json.Unmarshal([]byte(monrawanswer), &monanswer); err != nil {
|
||||||
|
log.Fatalf("Can't parse monitor answer. Error: %v", err)
|
||||||
|
}
|
||||||
|
return monanswer
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOsdLocations(params Params, osdcrushdump OsdCrushDump, osddump OsdDump, poolinfo Poolinfo) []int {
|
||||||
|
var crushrule int64
|
||||||
|
for _, pool := range osddump.Pools {
|
||||||
|
if pool.Pool == poolinfo.PoolId {
|
||||||
|
crushrule = pool.CrushRule
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var itemid int64
|
||||||
|
for _, rule := range osdcrushdump.Rules {
|
||||||
|
if rule.RuleID == crushrule {
|
||||||
|
for _, step := range rule.Steps {
|
||||||
|
if step.Op == "take" {
|
||||||
|
itemid = step.Item
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.Println(itemid)
|
||||||
|
return []int{}
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
params := Route()
|
params := Route()
|
||||||
|
@ -71,16 +111,20 @@ func main() {
|
||||||
log.Fatalln(err)
|
log.Fatalln(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
poolinfo := get_pool_size(cephconn, params)
|
poolinfo := GetPoolSize(cephconn, params)
|
||||||
if poolinfo.Size != 1 {
|
if poolinfo.Size != 1 {
|
||||||
log.Fatalf("Pool size must be 1. Current size for pool %v is %v. Don't forget that it must be useless pool (not production). Do:\n # ceph osd pool set %v min_size 1\n # ceph osd pool set %v size 1",
|
log.Fatalf("Pool size must be 1. Current size for pool %v is %v. Don't forget that it must be useless pool (not production). Do:\n # ceph osd pool set %v min_size 1\n # ceph osd pool set %v size 1",
|
||||||
poolinfo.Pool, poolinfo.Size, poolinfo.Pool, poolinfo.Pool)
|
poolinfo.Pool, poolinfo.Size, poolinfo.Pool, poolinfo.Pool)
|
||||||
}
|
}
|
||||||
|
|
||||||
placementGroups := get_pg_by_pool(cephconn, params)
|
//placementGroups := GetPgByPool(cephconn, params)
|
||||||
for _, value := range placementGroups {
|
//for _, value := range placementGroups {
|
||||||
log.Printf("%+v\n", value)
|
// log.Printf("%+v\n", value)
|
||||||
}
|
//}
|
||||||
|
crushosddump := GetOsdCrushDump(cephconn)
|
||||||
|
osddump := GetOsdDump(cephconn)
|
||||||
|
GetOsdLocations(params, crushosddump, osddump, poolinfo)
|
||||||
|
log.Println(poolinfo)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue