Files
seaweedfs/weed/topology/rack.go

91 lines
2.0 KiB
Go
Raw Normal View History

2012-08-23 20:56:09 -07:00
package topology
import (
"github.com/seaweedfs/seaweedfs/weed/pb/master_pb"
"github.com/seaweedfs/seaweedfs/weed/storage/types"
"github.com/seaweedfs/seaweedfs/weed/util"
"golang.org/x/exp/slices"
"time"
)
2012-08-23 20:56:09 -07:00
type Rack struct {
NodeImpl
2012-08-23 20:56:09 -07:00
}
2012-08-31 01:35:11 -07:00
func NewRack(id string) *Rack {
2012-08-31 01:35:11 -07:00
r := &Rack{}
r.id = NodeId(id)
r.nodeType = "Rack"
2021-02-16 02:47:02 -08:00
r.diskUsages = newDiskUsages()
r.children = make(map[NodeId]Node)
r.NodeImpl.value = r
2012-08-31 01:35:11 -07:00
return r
}
2012-09-14 01:17:13 -07:00
func (r *Rack) FindDataNode(ip string, port int) *DataNode {
2013-01-17 00:56:56 -08:00
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 {
r.Lock()
defer r.Unlock()
for _, c := range r.children {
dn := c.(*DataNode)
if dn.MatchLocation(ip, port) {
dn.LastSeen = time.Now().Unix()
return dn
}
}
2021-09-07 19:29:42 -07:00
dn := NewDataNode(util.JoinHostPort(ip, port))
dn.Ip = ip
dn.Port = port
dn.GrpcPort = grpcPort
dn.PublicUrl = publicUrl
dn.LastSeen = time.Now().Unix()
2022-09-10 11:26:19 -07:00
r.doLinkChildNode(dn)
2021-02-16 02:47:02 -08:00
for diskType, maxVolumeCount := range maxVolumeCounts {
disk := NewDisk(diskType)
2021-02-16 03:03:00 -08:00
disk.diskUsages.getOrCreateDisk(types.ToDiskType(diskType)).maxVolumeCount = int64(maxVolumeCount)
2021-02-16 02:47:02 -08:00
dn.LinkChildNode(disk)
}
return dn
2012-09-14 01:17:13 -07:00
}
type RackInfo struct {
Id NodeId `json:"Id"`
DataNodes []DataNodeInfo `json:"DataNodes"`
}
func (r *Rack) ToInfo() (info RackInfo) {
info.Id = r.Id()
var dns []DataNodeInfo
2015-03-10 00:20:31 -07:00
for _, c := range r.Children() {
dn := c.(*DataNode)
dns = append(dns, dn.ToInfo())
}
slices.SortFunc(dns, func(a, b DataNodeInfo) bool {
return a.Url < b.Url
})
info.DataNodes = dns
return
}
2019-03-17 20:27:08 -07:00
func (r *Rack) ToRackInfo() *master_pb.RackInfo {
m := &master_pb.RackInfo{
Id: string(r.Id()),
DiskInfos: r.diskUsages.ToDiskInfo(),
2019-03-17 20:27:08 -07:00
}
for _, c := range r.Children() {
dn := c.(*DataNode)
m.DataNodeInfos = append(m.DataNodeInfos, dn.ToDataNodeInfo())
}
return m
}