Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Why is the value not transferred?

First time using GRPC. I am calling my Stat function, which should return info on a File I am interested in. When I call the Stat function from within the parent Fetch function, I get a response value of 0. Here is what my code looks like:

StatusCode DFSClientNodeP1::Stat(const std::string &filename, void *file_status)
{
    StatusCode return_status;

    grpc::ClientContext context;
    dfs_service::File request;
    dfs_service::File_Metadata response;

    request.set_filename(this->WrapPath(filename));
    this->service_stub->get_status(&context, request, &response);

    std::cout << "SHOULD BE " << response.filesize() << std::endl;

    file_status = &response;

    return return_status;
}


StatusCode DFSClientNodeP1::Fetch(const std::string &filename)
{
    StatusCode return_status;
    dfs_service::File_Metadata response;

    return_status = Stat(filename, &response);

    std::cout << "WHAT IT IS " << response.filesize() << std::endl;

    return StatusCode::OK;
}

Here is the output:

SHOULD BE 232762 
WHAT IT IS 0

I am just curious where I am going wrong here. I tried to be very particular and static_cast the void* handling, but when I did that I got very large numbers, so it seemed the memory did not exist. For that reason I believe it is a memory persistence issue. I also read GRPC documentation, seems that Messages do not persist when the message transfer completes. Is that what is happening here? Should I try to malloc the Message type, seems not right to me.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

file_status = &response; will result in the outer response to be a dangling pointer when called in Fetch since you are taking the address of a function-local variable that does no exist outside the scope of the Stat function

Instead you should modify the pointer that was passed into Stat

StatusCode DFSClientNodeP1::Stat(const std::string &filename, void *file_status)
{
    StatusCode return_status;

    grpc::ClientContext context;
    dfs_service::File request;
    auto response = static_cast<dfs_service::File_Metadata*>(file_status);

    request.set_filename(this->WrapPath(filename));
    this->service_stub->get_status(&context, request, response);

    std::cout << "SHOULD BE " << response->filesize() << std::endl;

    return return_status;
}
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading