Verified Commit 0c940244 authored by Marc Vef's avatar Marc Vef
Browse files

Added Proxy lseek() support for Proxy <-> Daemon

parent a57cdc22
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ struct margo_client_ids {
    hg_id_t rpc_remove_id;
    hg_id_t rpc_decr_size_id;
    hg_id_t rpc_remove_data_id;
    hg_id_t rpc_get_metadentry_size_id;
    hg_id_t rpc_update_metadentry_size_id;
    hg_id_t rpc_write_id;
    hg_id_t rpc_read_id;
+2 −0
Original line number Diff line number Diff line
@@ -253,6 +253,8 @@ register_proxy_server_rpcs(margo_instance_id mid) {
                   rpc_err_out_t, rpc_srv_decr_size);
    MARGO_REGISTER(mid, gkfs::rpc::tag::remove_data, rpc_rm_node_in_t,
                   rpc_err_out_t, rpc_srv_remove_data);
    MARGO_REGISTER(mid, gkfs::rpc::tag::get_metadentry_size, rpc_path_only_in_t,
                   rpc_get_metadentry_size_out_t, rpc_srv_get_metadentry_size);
    MARGO_REGISTER(mid, gkfs::rpc::tag::update_metadentry_size,
                   rpc_update_metadentry_size_in_t,
                   rpc_update_metadentry_size_out_t,
+3 −0
Original line number Diff line number Diff line
@@ -156,6 +156,9 @@ register_client_rpcs(margo_instance_id mid) {
    PROXY_DATA->rpc_client_ids().rpc_remove_data_id =
            MARGO_REGISTER(mid, gkfs::rpc::tag::remove_data, rpc_rm_node_in_t,
                           rpc_err_out_t, NULL);
    PROXY_DATA->rpc_client_ids().rpc_get_metadentry_size_id = MARGO_REGISTER(
            mid, gkfs::rpc::tag::get_metadentry_size, rpc_path_only_in_t,
            rpc_get_metadentry_size_out_t, NULL);
    PROXY_DATA->rpc_client_ids().rpc_update_metadentry_size_id =
            MARGO_REGISTER(mid, gkfs::rpc::tag::update_metadentry_size,
                           rpc_update_metadentry_size_in_t,
+46 −2
Original line number Diff line number Diff line
@@ -294,8 +294,52 @@ forward_decr_size(const std::string& path, size_t length) {

pair<int, off64_t>
forward_get_metadentry_size(const string& path) {
    // return default
    return make_pair(0, 0);
    hg_handle_t rpc_handle = nullptr;
    rpc_path_only_in_t daemon_in{};
    rpc_get_metadentry_size_out_t daemon_out{};
    int err = 0;
    off64_t ret_offset = 0;
    // fill in
    daemon_in.path = path.c_str();
    // Create handle
    PROXY_DATA->log()->debug("{}() Creating Margo handle ...", __func__);
    auto endp = PROXY_DATA->rpc_endpoints().at(
            PROXY_DATA->distributor()->locate_file_metadata(path, 0));
    auto ret = margo_create(
            PROXY_DATA->client_rpc_mid(), endp,
            PROXY_DATA->rpc_client_ids().rpc_get_metadentry_size_id,
            &rpc_handle);
    if(ret != HG_SUCCESS) {
        PROXY_DATA->log()->error("{}() Critical error", __func__);
        return make_pair(EBUSY, 0);
        ;
    }
    ret = margo_forward(rpc_handle, &daemon_in);
    if(ret == HG_SUCCESS) {
        // Get response
        PROXY_DATA->log()->trace("{}() Waiting for response", __func__);
        ret = margo_get_output(rpc_handle, &daemon_out);
        if(ret == HG_SUCCESS) {
            PROXY_DATA->log()->debug(
                    "{}() Got response success err '{}' ret_size '{}'",
                    __func__, daemon_out.err, daemon_out.ret_size);
            err = daemon_out.err;
            ret_offset = daemon_out.ret_size;
            margo_free_output(rpc_handle, &daemon_out);
        } else {
            // something is wrong
            err = EBUSY;
            PROXY_DATA->log()->error("{}() while getting rpc output", __func__);
        }
    } else {
        // something is wrong
        err = EBUSY;
        PROXY_DATA->log()->error("{}() sending rpc failed", __func__);
    }

    /* clean up resources consumed by this rpc */
    margo_destroy(rpc_handle);
    return make_pair(err, ret_offset);
}

pair<int, off64_t>