// Server side handler of the SendHeartBeat RPC public override Task <DataNodeProto.HeartBeatResponse> SendHeartBeat(DataNodeProto.HeartBeatRequest request, ServerCallContext context) { DataNodeProto.BlockCommand blockCommands = DataNodeManager.Instance.UpdateDataNodes(request.NodeInfo); DataNodeProto.HeartBeatResponse response = new DataNodeProto.HeartBeatResponse { Commands = blockCommands }; return(Task.FromResult(response)); }
/// <summary> /// Send blockreport /// </summary> /// <param name="client">Datanode grpc client</param> public static async Task SendHeartBeat(DataNodeProto.DataNodeProto.DataNodeProtoClient client) { while (true) { DataNodeProto.HeartBeatRequest heartBeatRequest = CreateHeartBeatRequest(); try { DataNodeProto.HeartBeatResponse response = client.SendHeartBeat(heartBeatRequest); DataNodeProto.BlockCommand nameNodeCommands = response.Commands; switch (nameNodeCommands.Action) { case DataNodeProto.BlockCommand.Types.Action.Transfer: foreach (var block in nameNodeCommands.DataBlock.ToList()) { // Get block data byte[] blockData = BlockStorage.Instance.ReadBlock(Guid.Parse(block.BlockId.Value)); if (blockData != null) { Metadata metaData = new Metadata { new Metadata.Entry("blockid", block.BlockId.Value), new Metadata.Entry("blocksize", blockData.Length.ToString()) }; // Send data to each block foreach (var dataNode in block.DataNodes) { Task task = ForwardBlock(dataNode, blockData, metaData); } } } break; case DataNodeProto.BlockCommand.Types.Action.Delete: InvalidateBlocks(nameNodeCommands.BlockList); break; } } catch (RpcException e) { Console.WriteLine("HeartBeat failed: " + e.Message); } await Task.Delay(Constants.HeartBeatInterval); // This is an HDFS default } }