You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
package topology
import ( "github.com/chrislusf/seaweedfs/weed/pb/master_pb" "github.com/chrislusf/seaweedfs/weed/storage/types" "github.com/chrislusf/seaweedfs/weed/util" "golang.org/x/exp/slices" "time" )
type Rack struct { NodeImpl }
func NewRack(id string) *Rack { r := &Rack{} r.id = NodeId(id) r.nodeType = "Rack" r.diskUsages = newDiskUsages() r.children = make(map[NodeId]Node) r.NodeImpl.value = r return r }
func (r *Rack) FindDataNode(ip string, port int) *DataNode { for _, c := range r.Children() { dn := c.(*DataNode) if dn.MatchLocation(ip, port) { return dn } } return nil } func (r *Rack) GetOrCreateDataNode(ip string, port int, grpcPort int, publicUrl string, maxVolumeCounts map[string]uint32) *DataNode { for _, c := range r.Children() { dn := c.(*DataNode) if dn.MatchLocation(ip, port) { dn.LastSeen = time.Now().Unix() return dn } } dn := NewDataNode(util.JoinHostPort(ip, port)) dn.Ip = ip dn.Port = port dn.GrpcPort = grpcPort dn.PublicUrl = publicUrl dn.LastSeen = time.Now().Unix() r.LinkChildNode(dn) for diskType, maxVolumeCount := range maxVolumeCounts { disk := NewDisk(diskType) disk.diskUsages.getOrCreateDisk(types.ToDiskType(diskType)).maxVolumeCount = int64(maxVolumeCount) dn.LinkChildNode(disk) } return dn }
type RackMap struct { Id NodeId `json:"Id"` DataNodes []DataNodeMap `json:"DataNodes"` }
func (r *Rack) ToMap() RackMap { m := RackMap{} m.Id = r.Id() var dns []DataNodeMap for _, c := range r.Children() { dn := c.(*DataNode) dns = append(dns, dn.ToMap()) }
slices.SortFunc(dns, func(a, b DataNodeMap) bool { return a.Url < b.Url })
m.DataNodes = dns return m }
func (r *Rack) ToRackInfo() *master_pb.RackInfo { m := &master_pb.RackInfo{ Id: string(r.Id()), DiskInfos: r.diskUsages.ToDiskInfo(), } for _, c := range r.Children() { dn := c.(*DataNode) m.DataNodeInfos = append(m.DataNodeInfos, dn.ToDataNodeInfo()) } return m }
|