2019-02-14 15:01:33 +03:00
package main
import (
2019-02-14 19:18:43 +03:00
"encoding/json"
2019-02-14 15:01:33 +03:00
"log"
2019-02-14 17:35:18 +03:00
"math/rand"
2019-02-14 19:18:43 +03:00
"time"
2019-02-14 15:01:33 +03:00
)
2019-02-19 10:16:11 +03:00
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" } )
2019-02-15 20:04:32 +03:00
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 )
}
2019-02-19 10:16:11 +03:00
monanswer := Poolinfo { }
2019-02-15 20:04:32 +03:00
if err := json . Unmarshal ( [ ] byte ( monrawanswer ) , & monanswer ) ; err != nil {
log . Fatalf ( "Can't parse monitor answer. Error: %v" , err )
}
2019-02-19 10:16:11 +03:00
return monanswer
2019-02-15 20:04:32 +03:00
2019-02-14 19:18:43 +03:00
}
2019-02-15 20:04:32 +03:00
2019-02-19 10:16:11 +03:00
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" } )
2019-02-15 20:04:32 +03:00
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 )
}
2019-02-15 20:08:00 +03:00
monanswer := [ ] PlacementGroup { }
2019-02-15 20:04:32 +03:00
if err := json . Unmarshal ( [ ] byte ( monrawanswer ) , & monanswer ) ; err != nil {
log . Fatalf ( "Can't parse monitor answer. Error: %v" , err )
}
2019-02-19 10:16:11 +03:00
return monanswer
2019-02-14 19:18:43 +03:00
}
2019-02-19 10:16:11 +03:00
//func get_crush_dump(params Params, cephconn *Cephconnection) OsdCrushDump {
//
//}
//func get_acting_osd(params Params, ) map[string]float64 {
//
//}
2019-02-14 15:01:33 +03:00
func main ( ) {
2019-02-14 17:35:18 +03:00
params := Route ( )
2019-02-15 20:04:32 +03:00
cephconn := connectioninit ( params )
2019-02-14 17:35:18 +03:00
defer cephconn . conn . Shutdown ( )
2019-02-14 17:59:40 +03:00
2019-02-14 19:18:43 +03:00
// https://tracker.ceph.com/issues/24114
time . Sleep ( time . Millisecond * 100 )
2019-02-14 17:35:18 +03:00
var buffs [ ] [ ] byte
2019-02-14 17:59:40 +03:00
for i := 0 ; i < 2 * params . threadsCount ; i ++ {
buffs = append ( buffs , make ( [ ] byte , params . blocksize ) )
2019-02-14 17:35:18 +03:00
}
2019-02-14 19:18:43 +03:00
2019-02-14 17:35:18 +03:00
for num := range buffs {
_ , err := rand . Read ( buffs [ num ] )
if err != nil {
log . Fatalln ( err )
}
}
2019-02-19 10:16:11 +03:00
poolinfo := get_pool_size ( cephconn , params )
if poolinfo . Size != 1 {
2019-02-14 19:18:43 +03:00
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" ,
2019-02-19 10:16:11 +03:00
poolinfo . Pool , poolinfo . Size , poolinfo . Pool , poolinfo . Pool )
2019-02-14 19:18:43 +03:00
}
2019-02-14 17:35:18 +03:00
2019-02-15 20:08:00 +03:00
placementGroups := get_pg_by_pool ( cephconn , params )
2019-02-19 10:16:11 +03:00
for _ , value := range placementGroups {
log . Printf ( "%+v\n" , value )
}
2019-02-15 20:04:32 +03:00
2019-02-14 15:01:33 +03:00
}
2019-02-19 10:16:11 +03:00
//TODO Получить структуру пула (osd dump), рул. Получить все рулы (osd crush dump). Разобрать краш карту, получить список осд.
//TODO получить список PG, если не все находятся на нужных OSD выкинуть эксепшн.