diff --git a/ceph-gobench.go b/ceph-gobench.go index de59f80..226741c 100644 --- a/ceph-gobench.go +++ b/ceph-gobench.go @@ -2,14 +2,25 @@ package main import ( "encoding/json" + "fmt" "log" "math/rand" "time" ) -func get_pool_size(cephconn *Cephconnection, params Params) Poolinfo { - monjson, err := json.Marshal(map[string]string{"prefix": "osd pool get", "pool": params.pool, - "format": "json", "var": "size"}) +func makepreudorandom() { + a := make([]int, 0, 4096/4) + 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 { 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 { 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{} if err := json.Unmarshal([]byte(monrawanswer), &monanswer); err != nil { 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 { - monjson, err := json.Marshal(map[string]string{"prefix": "pg ls-by-pool", "poolstr": params.pool, "format": "json"}) - if err != nil { - 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) - } - +func GetPgByPool(cephconn *Cephconnection, params Params) []PlacementGroup { + monrawanswer := MakeMonQuery(cephconn, map[string]string{"prefix": "pg ls-by-pool", "poolstr": params.pool, + "format": "json"}) monanswer := []PlacementGroup{} if err := json.Unmarshal([]byte(monrawanswer), &monanswer); err != nil { 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 } -//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() { params := Route() @@ -71,16 +111,20 @@ func main() { log.Fatalln(err) } } - poolinfo := get_pool_size(cephconn, params) + poolinfo := GetPoolSize(cephconn, params) 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", poolinfo.Pool, poolinfo.Size, poolinfo.Pool, poolinfo.Pool) } - placementGroups := get_pg_by_pool(cephconn, params) - for _, value := range placementGroups { - log.Printf("%+v\n", value) - } + //placementGroups := GetPgByPool(cephconn, params) + //for _, value := range placementGroups { + // log.Printf("%+v\n", value) + //} + crushosddump := GetOsdCrushDump(cephconn) + osddump := GetOsdDump(cephconn) + GetOsdLocations(params, crushosddump, osddump, poolinfo) + log.Println(poolinfo) }