diff --git a/ceph-gobench.go b/ceph-gobench.go index 733f8f8..28c0a6c 100644 --- a/ceph-gobench.go +++ b/ceph-gobench.go @@ -31,14 +31,12 @@ func main() { for i := 0; i < 2*params.threadsCount; i++ { buffs = append(buffs, make([]byte, params.blocksize)) } - for num := range buffs { _, err := rand.Read(buffs[num]) if err != nil { log.Fatalln(err) } } - osds := GetOsds(cephconn, params) - log.Println(osds) + GetOsds(cephconn, params) } diff --git a/getosd.go b/getosd.go index faa3df3..6d6734c 100644 --- a/getosd.go +++ b/getosd.go @@ -58,6 +58,15 @@ func GetOsdDump(cephconn *Cephconnection) OsdDump { return monanswer } +func GetOsdMetadata(cephconn *Cephconnection) []OsdMetadata { + monrawanswer := MakeMonQuery(cephconn, map[string]string{"prefix": "osd metadata", "format": "json"}) + var monanswer []OsdMetadata + if err := json.Unmarshal([]byte(monrawanswer), &monanswer); err != nil { + log.Fatalf("Can't parse monitor answer. Error: %v", err) + } + return monanswer +} + func GetCrushHostBuckets(buckets []Bucket, itemid int64) []Bucket { var rootbuckets []Bucket for _, bucket := range buckets { @@ -83,7 +92,7 @@ func GetCrushHostBuckets(buckets []Bucket, itemid int64) []Bucket { return rootbuckets } -func GetOsdForLocations(params Params, osdcrushdump OsdCrushDump, osddump OsdDump, poolinfo Poolinfo) map[string][]Device { +func GetOsdForLocations(params Params, osdcrushdump OsdCrushDump, osddump OsdDump, poolinfo Poolinfo, osdsmetadata []OsdMetadata) map[string]BenchOsd { var crushrule int64 var crushrulename string for _, pool := range osddump.Pools { @@ -103,7 +112,8 @@ func GetOsdForLocations(params Params, osdcrushdump OsdCrushDump, osddump OsdDum } } - osdhosts := make(map[string][]Device) + osdhosts := make(map[string]BenchOsd) + var devices []Device bucketitems := GetCrushHostBuckets(osdcrushdump.Buckets, rootid) if params.define != "" { if strings.HasPrefix(params.define, "osd.") { @@ -111,10 +121,20 @@ func GetOsdForLocations(params Params, osdcrushdump OsdCrushDump, osddump OsdDum for _, item := range hostbucket.Items { for _, device := range osdcrushdump.Devices { if device.ID == item.ID && params.define == device.Name { - osdhosts[hostbucket.Name] = append(osdhosts[hostbucket.Name], device) + for _, osdmetadata := range osdsmetadata { + if osdmetadata.ID == device.ID { + device.Info = osdmetadata + } + + } + devices = append(devices, device) } } } + if len(devices) != 0 { + osdhosts[hostbucket.Name] = BenchOsd{Osds: devices} + devices = []Device{} + } } if len(osdhosts) == 0 { log.Fatalf("Defined osd not exist in root for rule: %v pool: %v.\nYou should define osd like osd.X", @@ -126,11 +146,21 @@ func GetOsdForLocations(params Params, osdcrushdump OsdCrushDump, osddump OsdDum for _, item := range hostbucket.Items { for _, device := range osdcrushdump.Devices { if device.ID == item.ID { - osdhosts[hostbucket.Name] = append(osdhosts[hostbucket.Name], device) + for _, osdmetadata := range osdsmetadata { + if osdmetadata.ID == device.ID { + device.Info = osdmetadata + } + + } + devices = append(devices, device) } } } } + if len(devices) != 0 { + osdhosts[hostbucket.Name] = BenchOsd{Osds: devices} + devices = []Device{} + } } if len(osdhosts) == 0 { log.Fatalf("Defined host not exist in root for rule: %v pool: %v", crushrulename, poolinfo.Pool) @@ -141,10 +171,20 @@ func GetOsdForLocations(params Params, osdcrushdump OsdCrushDump, osddump OsdDum for _, item := range hostbucket.Items { for _, device := range osdcrushdump.Devices { if device.ID == item.ID { - osdhosts[hostbucket.Name] = append(osdhosts[hostbucket.Name], device) + for _, osdmetadata := range osdsmetadata { + if osdmetadata.ID == device.ID { + device.Info = osdmetadata + } + + } + devices = append(devices, device) } } } + if len(devices) != 0 { + osdhosts[hostbucket.Name] = BenchOsd{Osds: devices} + devices = []Device{} + } } if len(osdhosts) == 0 { log.Fatalf("Osd not exist in root for rule: %v pool: %v", crushrulename, poolinfo.Pool) @@ -162,7 +202,7 @@ func ContainsPg(pgs []PlacementGroup, i int64) bool { return false } -func GetOsds(cephconn *Cephconnection, params Params) map[string][]Device { +func GetOsds(cephconn *Cephconnection, params Params) map[string]BenchOsd { 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", @@ -171,15 +211,14 @@ func GetOsds(cephconn *Cephconnection, params Params) map[string][]Device { placementGroups := GetPgByPool(cephconn, params) crushosddump := GetOsdCrushDump(cephconn) osddump := GetOsdDump(cephconn) - osddevices := GetOsdForLocations(params, crushosddump, osddump, poolinfo) - for _, items := range osddevices { - for _, item := range items { + osdsmetadata := GetOsdMetadata(cephconn) + osddevices := GetOsdForLocations(params, crushosddump, osddump, poolinfo, osdsmetadata) + for _, values := range osddevices { + for _, item := range values.Osds { if exist := ContainsPg(placementGroups, item.ID); exist == false { log.Fatalln("Not enough pg for test. Some osd haven't placement group at all. Increase pg_num and pgp_num") } - } - } return osddevices }