Beispiel #1
0
        // 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));
        }
Beispiel #2
0
        /// <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
            }
        }