mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-11-24 16:53:14 +08:00
allocate brokers to serve segments
This commit is contained in:
@@ -11,17 +11,28 @@ import (
|
||||
func (ms *MasterServer) ListClusterNodes(ctx context.Context, req *master_pb.ListClusterNodesRequest) (*master_pb.ListClusterNodesResponse, error) {
|
||||
resp := &master_pb.ListClusterNodesResponse{}
|
||||
filerGroup := cluster.FilerGroupName(req.FilerGroup)
|
||||
clusterNodes := ms.Cluster.ListClusterNode(filerGroup, req.ClientType)
|
||||
|
||||
for _, node := range clusterNodes {
|
||||
resp.ClusterNodes = append(resp.ClusterNodes, &master_pb.ListClusterNodesResponse_ClusterNode{
|
||||
Address: string(node.Address),
|
||||
Version: node.Version,
|
||||
IsLeader: ms.Cluster.IsOneLeader(filerGroup, req.ClientType, node.Address),
|
||||
CreatedAtNs: node.CreatedTs.UnixNano(),
|
||||
DataCenter: string(node.DataCenter),
|
||||
Rack: string(node.Rack),
|
||||
})
|
||||
if req.IsLeaderOnly {
|
||||
leaders := ms.Cluster.ListClusterNodeLeaders(filerGroup, req.ClientType)
|
||||
for _, node := range leaders {
|
||||
resp.ClusterNodes = append(resp.ClusterNodes, &master_pb.ListClusterNodesResponse_ClusterNode{
|
||||
Address: string(node),
|
||||
IsLeader: true,
|
||||
})
|
||||
}
|
||||
} else {
|
||||
clusterNodes := ms.Cluster.ListClusterNode(filerGroup, req.ClientType)
|
||||
clusterNodes = limitTo(clusterNodes, req.Limit)
|
||||
for _, node := range clusterNodes {
|
||||
resp.ClusterNodes = append(resp.ClusterNodes, &master_pb.ListClusterNodesResponse_ClusterNode{
|
||||
Address: string(node.Address),
|
||||
Version: node.Version,
|
||||
IsLeader: ms.Cluster.IsOneLeader(filerGroup, req.ClientType, node.Address),
|
||||
CreatedAtNs: node.CreatedTs.UnixNano(),
|
||||
DataCenter: string(node.DataCenter),
|
||||
Rack: string(node.Rack),
|
||||
})
|
||||
}
|
||||
}
|
||||
return resp, nil
|
||||
}
|
||||
@@ -41,3 +52,21 @@ func (ms *MasterServer) GetOneFiler(filerGroup cluster.FilerGroupName) pb.Server
|
||||
}
|
||||
return "localhost:8888"
|
||||
}
|
||||
|
||||
func limitTo(nodes []*cluster.ClusterNode, limit int32) (selected []*cluster.ClusterNode) {
|
||||
if limit <= 0 || len(nodes) < int(limit) {
|
||||
return nodes
|
||||
}
|
||||
seletedSet := make(map[pb.ServerAddress]*cluster.ClusterNode)
|
||||
for i := 0; i < int(limit)*3; i++ {
|
||||
x := rand.Intn(len(nodes))
|
||||
if _, found := seletedSet[nodes[x].Address]; found {
|
||||
continue
|
||||
}
|
||||
seletedSet[nodes[x].Address] = nodes[x]
|
||||
}
|
||||
for _, node := range seletedSet {
|
||||
selected = append(selected, node)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user