seaweedfs/weed/topology/rack.go

92 lines
2 KiB
Go
Raw Normal View History

2012-08-24 03:56:09 +00: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"
"strings"
"time"
)
2012-08-24 03:56:09 +00:00
type Rack struct {
NodeImpl
2012-08-24 03:56:09 +00:00
}
2012-08-31 08:35:11 +00:00
func NewRack(id string) *Rack {
2012-08-31 08:35:11 +00:00
r := &Rack{}
r.id = NodeId(id)
r.nodeType = "Rack"
2021-02-16 10:47:02 +00:00
r.diskUsages = newDiskUsages()
r.children = make(map[NodeId]Node)
r.NodeImpl.value = r
2012-08-31 08:35:11 +00:00
return r
}
2012-09-14 08:17:13 +00:00
func (r *Rack) FindDataNode(ip string, port int) *DataNode {
2013-01-17 08:56:56 +00: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-08 02:29:42 +00: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 18:26:19 +00:00
r.doLinkChildNode(dn)
2021-02-16 10:47:02 +00:00
for diskType, maxVolumeCount := range maxVolumeCounts {
disk := NewDisk(diskType)
2021-02-16 11:03:00 +00:00
disk.diskUsages.getOrCreateDisk(types.ToDiskType(diskType)).maxVolumeCount = int64(maxVolumeCount)
2021-02-16 10:47:02 +00:00
dn.LinkChildNode(disk)
}
return dn
2012-09-14 08:17:13 +00: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 07:20:31 +00:00
for _, c := range r.Children() {
dn := c.(*DataNode)
dns = append(dns, dn.ToInfo())
}
slices.SortFunc(dns, func(a, b DataNodeInfo) int {
return strings.Compare(a.Url, b.Url)
})
info.DataNodes = dns
return
}
2019-03-18 03:27:08 +00:00
func (r *Rack) ToRackInfo() *master_pb.RackInfo {
m := &master_pb.RackInfo{
Id: string(r.Id()),
DiskInfos: r.diskUsages.ToDiskInfo(),
2019-03-18 03:27:08 +00:00
}
for _, c := range r.Children() {
dn := c.(*DataNode)
m.DataNodeInfos = append(m.DataNodeInfos, dn.ToDataNodeInfo())
}
return m
}