private void removeDataNode(DFSNode dataNode){
        /////
        System.out.println("dataNode is " + dataNode.getIp() + ":" + dataNode.getPort());
        /////
        for(DFSBlkDataNode dbdn : this.dataNodes){
            if(dbdn.getIp().equals(dataNode.getIp()) && dbdn.getPort() == dataNode.getPort()){
                this.dataNodes.remove(dbdn);
                break;
            }
        }
        for(String s : this.blkName2dataNodesMap.keySet()){
            List<DFSNode> blkDataNodes = this.blkName2dataNodesMap.get(s);
            for(DFSNode dn : blkDataNodes){
                if(dn.getIp().equals(dataNode.getIp()) && dn.getPort() == dataNode.getPort()){
                    blkDataNodes.remove(dn);
                    /* Copy the block originally on dataNode to other DataNode */
                    DFSNode newDataNode = this.assignLocation(s);
                    DFSNode srcDataNode = this.assignSource(s);
                    List<DFSNode> destAndSrc = new ArrayList<DFSNode>(2);
                    destAndSrc.add(newDataNode);
                    destAndSrc.add(srcDataNode);
                    DFSMessage copyBlkNameNodeReq = new DFSMessage(DFSMessageType.CopyBlkNameNodeReqMsg, s, destAndSrc);
                    DFSMessage copyBlkDataNodeResp = DFSMessageSender.sendMessage(copyBlkNameNodeReq, newDataNode);
                    if(copyBlkDataNodeResp == null || copyBlkDataNodeResp.getType() != DFSMessageType.CopyBlkDataNodeRespMsg){
                        System.out.println("Failed to send Copy-Block-Request (Block: " + s + ") to DataNode (" + newDataNode.getIp() + ":" + newDataNode.getPort() + ")");
                    }else{
                        System.out.println("Sent Copy-Block-Request (Block: " + s + ") to DataNode (" + newDataNode.getIp() + ":" + newDataNode.getPort() + ")");
                    }
                    break;
                }
            }
        }
        return;
    }