def forward_response_data(file_bytes, request_id, node_ip, status, path):
    curr_path = eval(path)
    curr_coordinates = curr_path.pop()

    #check if data reached the initial invoking node
    if curr_path.empty():
        return file_bytes

    #get the channel through which the data will be propogated
    for item in globals.node_connections.connection_dict.items():
        if item[1].node_coordinates == curr_coordinates:
            channel = item[1].channel
            break

    #check if channel is alive. if not, update the 2D matrix and calculate a new shortest path
    if not channel.isAlive():
        mesh = create_logical_mesh()
        mesh[curr_coordinates[0]][curr_coordinates[1]] = 0
        curr_path = find_shortest_path(mesh)
        forward_response_data(file_bytes, request_id, node_ip, status,
                              curr_path)

    #forward the request
    traversal_stub = traversal_pb2_grpc.TraversalStub(channel)
    response = traversal_stub.RespondData(
        traversal_pb2.RespondDataRequest(file_bytes=file_bytes,
                                         request_id=request_id,
                                         node_ip=node_ip,
                                         status=status,
                                         path=curr_path))
    return response
Exemplo n.º 2
0
def send_request():
    time.sleep(10)
    server_node_ip = "10.0.0.3"
    logger.info("Connecting to {} at port {}...".format(server_node_ip, globals.port))
    traversal_stub = traversal_pb2_grpc.TraversalStub(globals.node_connections.connection_dict[NodePosition.RIGHT].channel)
    logger.debug(traversal_stub)
    response = traversal_stub.ReceiveData(
        traversal_pb2.ReceiveDataRequest(
                                        hash_id="hashid",
                                        request_id="1",
                                        stack=str([]),
                                        visited=str([])))
    logger.info("forward_receive_data_request: response: {}".format(response))
Exemplo n.º 3
0
def send_request():
    #    time.sleep(60)
    server_node_ip = "10.0.0.1"
    logger.info("Connecting to {} at port {}...".format(
        server_node_ip, globals.port))
    channel = grpc.insecure_channel(server_node_ip + ":" + str(globals.port))
    traversal_stub = traversal_pb2_grpc.TraversalStub(channel)
    logger.debug(traversal_stub)
    response = traversal_stub.ReceiveData(
        traversal_pb2.ReceiveDataRequest(hash_id="hashid",
                                         request_id="1",
                                         stack=str([]),
                                         visited=str([])))
    logger.info("forward_receive_data_request: response: {}".format(response))
def forward_receive_data_request(node_ip, request):
    logger.info("forward_receive_data_request: node_ip: {}".format(node_ip))
    channel = None
    for item in globals.node_connections.connection_dict.items():
        if item[1].node_ip == node_ip:
            channel = item[1].channel
            break

    traversal_stub = traversal_pb2_grpc.TraversalStub(channel)
    response = traversal_stub.ReceiveData(hash_id=request.hash_id,
                                          request_id=request.request_id,
                                          stack=request.stack,
                                          visited=request.visited)
    logger.info("forward_receive_data_request: response: {}".format(response))
    return response
    def forward_receive_data_request(self, node_ip, channel, request,
                                     visited_ip, requesting_node_ip):
        logger.info(
            "forward_receive_data_request: node_ip: {}".format(node_ip))

        traversal_stub = traversal_pb2_grpc.TraversalStub(channel)
        response = traversal_stub.ReceiveData(
            traversal_pb2.ReceiveDataRequest(
                hash_id=str(request.hash_id),
                request_id=str(request.request_id),
                stack="",
                visited=str(visited_ip),
                requesting_node_ip=requesting_node_ip))
        logger.info(
            "forward_receive_data_request: response: {}".format(response))
        return response
    def ReceiveData(self, request, context):
        logger.info(
            "Traversal.ReceiveData hash_id:{} request_id:{} visited:{}".format(
                request.hash_id, request.request_id, request.visited))
        # print("Traversal.ReceiveData hash_id:{} request_id:{} visited:{}"
        #             .format(request.hash_id, request.request_id, request.visited))
        print("came hereeeeeee")
        data_found = globals.storage_object.is_hash_id_in_memory_non_rpc(
            request.hash_id)
        # Check if the file exits on current node
        if data_found:
            channel = grpc.insecure_channel(request.requesting_node_ip + ":" +
                                            str(globals.port))
            traversal_stub = traversal_pb2_grpc.TraversalStub(channel)
            chunks_list = globals.storage_object.download_list_of_data_chunks_non_rpc(
                request.hash_id)
            logger.debug("SendData: chunk: {}".format(chunks_list))

            for c in chunks_list:
                yield traversal_stub.SendData(
                    traversal_pb2.SendDataRequest(
                        file_bytes=c,
                        request_id=request.request_id,
                        client_node_ip=globals.my_ip))

            #    curr_data = fetch_data(request.hash_id)
            #    curr_mesh = self.create_logical_mesh()
            #    curr_path = self.find_shortest_path(curr_mesh)
            #    self.forward_response_data(curr_data, request.request_id, "", traversal_pb2.ReceiveDataResponse.TraversalResponseStatus.FOUND,
            #                               curr_path)
            # #    RespondData(file_bytes=curr_data, request_id=request.request_id, node_ip = request.node_ip, status = traversal_response_status.FOUND, path = curr_path)
            #    return traversal_pb2.ReceiveDataResponse(status=traversal_pb2.ReceiveDataResponse.TraversalResponseStatus.FOUND)

        # If file not found in node
        visited_ip = eval(request.visited)

        globals.data_received_event.clear()

        if globals.my_ip not in visited_ip:
            visited_ip.append(globals.my_ip)

        logger.info("Traversal.ReceiveData: visited: {}".format(visited_ip))
        neighbor_conn_list = []

        for item in globals.node_connections.connection_dict.items():
            neighbor_conn_list.append(item[1])

        forward_conn_list = []

        for neighbor_conn in neighbor_conn_list:
            logger.debug("visited_ip: {}".format(visited_ip))
            if neighbor_conn.node_ip not in visited_ip:
                logger.debug(
                    "Adding {} in visited_ip and forward_conn_list".format(
                        neighbor_conn.node_ip))
                visited_ip.append(neighbor_conn.node_ip)
                forward_conn_list.append(neighbor_conn)

        print("Forwarded List: {}".format(
            [conn.node_ip for conn in forward_conn_list]))
        print("Neighbor List: {}".format(
            [conn.node_ip for conn in neighbor_conn_list]))
        print("Visited List: {}".format(visited_ip))

        logger.info("Forwarded List: {}".format(
            [conn.node_ip for conn in forward_conn_list]))
        logger.info("Neighbor List: {}".format(
            [conn.node_ip for conn in neighbor_conn_list]))
        logger.info("Visited List: {}".format(visited_ip))

        threading_list = []
        for forward_conn in forward_conn_list:
            forward_node_ip = forward_conn.node_ip  #confirm
            channel = forward_conn.channel  #confirm
            logger.debug("Forwarded Node IP: {}".format(forward_node_ip))
            #    print("Channel: {}".format(channel))
            forward_request_thread = threading.Thread(
                target=self.forward_receive_data_request,
                args=(forward_node_ip, channel, request, visited_ip,
                      request.requesting_node_ip))
            threading_list.append(forward_request_thread)

        for thread in threading_list:
            thread.start()
            #thread.join()

        while not globals.data_received_event.is_set():
            # wait for data
            time.sleep(0.1)

    # return traversal_pb2.ReceiveDataResponse(
    #     status=traversal_pb2.ReceiveDataResponse.TraversalResponseStatus.FORWARDED) # confirm indentation

        logger.debug("Response: {}".format(globals.data_received))
        logger.debug("Return")
        #for chunk in globals.data_received:
        logger.debug("ReceiveDataRespnse: chunk: {}".format(
            globals.data_received))
        for c in globals.data_received:
            yield traversal_pb2.ReceiveDataResponse(
                status=traversal_pb2.ReceiveDataResponse.
                TraversalResponseStatus.FOUND,
                file_bytes=c)