seaweedfs/weed/server/master_grpc_server.go

82 lines
2.2 KiB
Go
Raw Normal View History

2017-01-10 17:01:12 +08:00
package weed_server
import (
2017-01-13 05:42:53 +08:00
"net"
"strings"
2017-01-10 17:01:12 +08:00
"github.com/chrislusf/seaweedfs/weed/glog"
2018-05-10 14:11:54 +08:00
"github.com/chrislusf/seaweedfs/weed/pb/master_pb"
2017-01-10 17:01:12 +08:00
"github.com/chrislusf/seaweedfs/weed/topology"
2017-01-13 05:42:53 +08:00
"google.golang.org/grpc/peer"
2017-01-10 17:01:12 +08:00
)
func (ms *MasterServer) SendHeartbeat(stream master_pb.Seaweed_SendHeartbeatServer) error {
2017-01-10 17:01:12 +08:00
var dn *topology.DataNode
t := ms.Topo
defer func() {
if dn != nil {
glog.V(0).Infof("unregister disconnected volume server %s:%d", dn.Ip, dn.Port)
t.UnRegisterDataNode(dn)
}
}()
2017-01-10 17:01:12 +08:00
for {
heartbeat, err := stream.Recv()
if err == nil {
if dn == nil {
t.Sequence.SetMax(heartbeat.MaxFileKey)
2017-01-13 05:42:53 +08:00
if heartbeat.Ip == "" {
if pr, ok := peer.FromContext(stream.Context()); ok {
if pr.Addr != net.Addr(nil) {
heartbeat.Ip = pr.Addr.String()[0:strings.LastIndex(pr.Addr.String(), ":")]
glog.V(0).Infof("remote IP address is detected as %v", heartbeat.Ip)
}
}
}
2017-01-10 17:01:12 +08:00
dcName, rackName := t.Configuration.Locate(heartbeat.Ip, heartbeat.DataCenter, heartbeat.Rack)
dc := t.GetOrCreateDataCenter(dcName)
rack := dc.GetOrCreateRack(rackName)
dn = rack.GetOrCreateDataNode(heartbeat.Ip,
int(heartbeat.Port), heartbeat.PublicUrl,
int(heartbeat.MaxVolumeCount))
glog.V(0).Infof("added volume server %v:%d", heartbeat.GetIp(), heartbeat.GetPort())
2018-05-10 14:11:54 +08:00
if err := stream.Send(&master_pb.HeartbeatResponse{
2017-01-10 17:01:12 +08:00
VolumeSizeLimit: uint64(ms.volumeSizeLimitMB) * 1024 * 1024,
SecretKey: string(ms.guard.SecretKey),
}); err != nil {
return err
}
}
2018-06-25 15:01:53 +08:00
t.SyncDataNodeRegistration(heartbeat.Volumes, dn)
2017-01-10 17:01:12 +08:00
} else {
return err
}
// tell the volume servers about the leader
newLeader, err := t.Leader()
if err == nil {
2018-05-10 14:11:54 +08:00
if err := stream.Send(&master_pb.HeartbeatResponse{
Leader: newLeader,
}); err != nil {
return err
}
}
2017-01-10 17:01:12 +08:00
}
}
// KeepConnected keep a stream gRPC call to the master. Used by filer to know the master is up.
func (ms *MasterServer) KeepConnected(stream master_pb.Seaweed_KeepConnectedServer) error {
for {
_, err := stream.Recv()
if err != nil {
return err
}
if err := stream.Send(&master_pb.Empty{}); err != nil {
return err
}
}
}