seaweedfs/weed/topology/topology_info.go

125 lines
3.3 KiB
Go
Raw Normal View History

2012-11-07 17:51:43 +08:00
package topology
import (
"github.com/seaweedfs/seaweedfs/weed/pb/master_pb"
"golang.org/x/exp/slices"
"strings"
)
type TopologyInfo struct {
Max int64 `json:"Max"`
Free int64 `json:"Free"`
DataCenters []DataCenterInfo `json:"DataCenters"`
Layouts []VolumeLayoutInfo `json:"Layouts"`
}
2018-07-28 16:17:35 +08:00
type VolumeLayoutCollection struct {
Collection string
VolumeLayout *VolumeLayout
}
func (t *Topology) ToInfo() (info TopologyInfo) {
info.Max = t.diskUsages.GetMaxVolumeCount()
info.Free = t.diskUsages.FreeSpace()
var dcs []DataCenterInfo
2012-11-07 17:51:43 +08:00
for _, c := range t.Children() {
dc := c.(*DataCenter)
dcs = append(dcs, dc.ToInfo())
2012-11-07 17:51:43 +08:00
}
slices.SortFunc(dcs, func(a, b DataCenterInfo) int {
return strings.Compare(string(a.Id), string(b.Id))
})
info.DataCenters = dcs
var layouts []VolumeLayoutInfo
2016-05-31 03:30:26 +08:00
for _, col := range t.collectionMap.Items() {
c := col.(*Collection)
2016-05-31 03:30:26 +08:00
for _, layout := range c.storageType2VolumeLayout.Items() {
2013-11-12 18:21:22 +08:00
if layout != nil {
tmp := layout.(*VolumeLayout).ToInfo()
tmp.Collection = c.Name
2013-11-12 18:21:22 +08:00
layouts = append(layouts, tmp)
}
2012-11-07 17:51:43 +08:00
}
}
info.Layouts = layouts
return
2012-11-07 17:51:43 +08:00
}
func (t *Topology) ListVolumeLayoutCollections() (volumeLayouts []*VolumeLayoutCollection) {
for _, col := range t.collectionMap.Items() {
for _, volumeLayout := range col.(*Collection).storageType2VolumeLayout.Items() {
volumeLayouts = append(volumeLayouts,
&VolumeLayoutCollection{col.(*Collection).Name, volumeLayout.(*VolumeLayout)},
)
}
}
return volumeLayouts
}
2012-11-07 17:51:43 +08:00
func (t *Topology) ToVolumeMap() interface{} {
m := make(map[string]interface{})
2021-02-16 18:47:02 +08:00
m["Max"] = t.diskUsages.GetMaxVolumeCount()
m["Free"] = t.diskUsages.FreeSpace()
2012-11-07 17:51:43 +08:00
dcs := make(map[NodeId]interface{})
for _, c := range t.Children() {
dc := c.(*DataCenter)
racks := make(map[NodeId]interface{})
for _, r := range dc.Children() {
rack := r.(*Rack)
dataNodes := make(map[NodeId]interface{})
for _, d := range rack.Children() {
dn := d.(*DataNode)
var volumes []interface{}
2016-05-20 14:32:56 +08:00
for _, v := range dn.GetVolumes() {
2012-11-07 17:51:43 +08:00
volumes = append(volumes, v)
}
dataNodes[d.Id()] = volumes
}
racks[r.Id()] = dataNodes
}
dcs[dc.Id()] = racks
}
m["DataCenters"] = dcs
return m
}
2018-07-28 16:17:35 +08:00
func (t *Topology) ToVolumeLocations() (volumeLocations []*master_pb.VolumeLocation) {
for _, c := range t.Children() {
dc := c.(*DataCenter)
for _, r := range dc.Children() {
rack := r.(*Rack)
for _, d := range rack.Children() {
dn := d.(*DataNode)
volumeLocation := &master_pb.VolumeLocation{
Url: dn.Url(),
PublicUrl: dn.PublicUrl,
DataCenter: dn.GetDataCenterId(),
GrpcPort: uint32(dn.GrpcPort),
2018-07-28 16:17:35 +08:00
}
for _, v := range dn.GetVolumes() {
volumeLocation.NewVids = append(volumeLocation.NewVids, uint32(v.Id))
}
for _, s := range dn.GetEcShards() {
volumeLocation.NewVids = append(volumeLocation.NewVids, uint32(s.VolumeId))
}
2018-07-28 16:17:35 +08:00
volumeLocations = append(volumeLocations, volumeLocation)
}
}
}
return
}
2019-03-18 11:27:08 +08:00
func (t *Topology) ToTopologyInfo() *master_pb.TopologyInfo {
m := &master_pb.TopologyInfo{
Id: string(t.Id()),
DiskInfos: t.diskUsages.ToDiskInfo(),
2019-03-18 11:27:08 +08:00
}
for _, c := range t.Children() {
dc := c.(*DataCenter)
m.DataCenterInfos = append(m.DataCenterInfos, dc.ToDataCenterInfo())
}
return m
}