OsdMetadata

master
Alexey Kostin 2019-02-20 16:54:39 +03:00
parent 662dc9da5b
commit f83e76ad4a
2 changed files with 51 additions and 14 deletions

View File

@ -31,14 +31,12 @@ func main() {
for i := 0; i < 2*params.threadsCount; i++ { for i := 0; i < 2*params.threadsCount; i++ {
buffs = append(buffs, make([]byte, params.blocksize)) buffs = append(buffs, make([]byte, params.blocksize))
} }
for num := range buffs { for num := range buffs {
_, err := rand.Read(buffs[num]) _, err := rand.Read(buffs[num])
if err != nil { if err != nil {
log.Fatalln(err) log.Fatalln(err)
} }
} }
osds := GetOsds(cephconn, params)
log.Println(osds)
GetOsds(cephconn, params)
} }

View File

@ -58,6 +58,15 @@ func GetOsdDump(cephconn *Cephconnection) OsdDump {
return monanswer 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 { func GetCrushHostBuckets(buckets []Bucket, itemid int64) []Bucket {
var rootbuckets []Bucket var rootbuckets []Bucket
for _, bucket := range buckets { for _, bucket := range buckets {
@ -83,7 +92,7 @@ func GetCrushHostBuckets(buckets []Bucket, itemid int64) []Bucket {
return rootbuckets 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 crushrule int64
var crushrulename string var crushrulename string
for _, pool := range osddump.Pools { 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) bucketitems := GetCrushHostBuckets(osdcrushdump.Buckets, rootid)
if params.define != "" { if params.define != "" {
if strings.HasPrefix(params.define, "osd.") { if strings.HasPrefix(params.define, "osd.") {
@ -111,10 +121,20 @@ func GetOsdForLocations(params Params, osdcrushdump OsdCrushDump, osddump OsdDum
for _, item := range hostbucket.Items { for _, item := range hostbucket.Items {
for _, device := range osdcrushdump.Devices { for _, device := range osdcrushdump.Devices {
if device.ID == item.ID && params.define == device.Name { 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 { if len(osdhosts) == 0 {
log.Fatalf("Defined osd not exist in root for rule: %v pool: %v.\nYou should define osd like osd.X", 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 _, item := range hostbucket.Items {
for _, device := range osdcrushdump.Devices { for _, device := range osdcrushdump.Devices {
if device.ID == item.ID { 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 { if len(osdhosts) == 0 {
log.Fatalf("Defined host not exist in root for rule: %v pool: %v", crushrulename, poolinfo.Pool) 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 _, item := range hostbucket.Items {
for _, device := range osdcrushdump.Devices { for _, device := range osdcrushdump.Devices {
if device.ID == item.ID { 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 { if len(osdhosts) == 0 {
log.Fatalf("Osd not exist in root for rule: %v pool: %v", crushrulename, poolinfo.Pool) 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 return false
} }
func GetOsds(cephconn *Cephconnection, params Params) map[string][]Device { func GetOsds(cephconn *Cephconnection, params Params) map[string]BenchOsd {
poolinfo := GetPoolSize(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",
@ -171,15 +211,14 @@ func GetOsds(cephconn *Cephconnection, params Params) map[string][]Device {
placementGroups := GetPgByPool(cephconn, params) placementGroups := GetPgByPool(cephconn, params)
crushosddump := GetOsdCrushDump(cephconn) crushosddump := GetOsdCrushDump(cephconn)
osddump := GetOsdDump(cephconn) osddump := GetOsdDump(cephconn)
osddevices := GetOsdForLocations(params, crushosddump, osddump, poolinfo) osdsmetadata := GetOsdMetadata(cephconn)
for _, items := range osddevices { osddevices := GetOsdForLocations(params, crushosddump, osddump, poolinfo, osdsmetadata)
for _, item := range items { for _, values := range osddevices {
for _, item := range values.Osds {
if exist := ContainsPg(placementGroups, item.ID); exist == false { 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") log.Fatalln("Not enough pg for test. Some osd haven't placement group at all. Increase pg_num and pgp_num")
} }
} }
} }
return osddevices return osddevices
} }