Commit 07905459 authored by Alberto Miranda's avatar Alberto Miranda ♨️
Browse files

Improve error reporting for remote tasks

parent b65139d7
Loading
Loading
Loading
Loading
Loading
Compare 160eafc2 to e49040c5
Original line number Diff line number Diff line
Subproject commit 160eafc2de0b6744f723a0f9332eefb070fddbbc
Subproject commit e49040c5cc2df53c4a89349bb3bf5ce59bcf0231
+17 −9
Original line number Diff line number Diff line
@@ -45,8 +45,8 @@ namespace norns {
namespace io {

local_path_to_remote_resource_transferor::local_path_to_remote_resource_transferor(
        std::shared_ptr<hermes::async_engine> remote_endpoint) :
    m_remote_endpoint(remote_endpoint) { }
        std::shared_ptr<hermes::async_engine> network_endpoint) :
    m_network_endpoint(network_endpoint) { }

bool 
local_path_to_remote_resource_transferor::validate(
@@ -78,20 +78,28 @@ local_path_to_remote_resource_transferor::transfer(
    LOGGER_DEBUG("[{}] start_transfer: {} -> {}", 
                 task_info->id(), d_src.canonical_path(), d_dst.to_string());

    hermes::endpoint endp = m_remote_endpoint->lookup(d_dst.address());
    hermes::endpoint endp = m_network_endpoint->lookup(d_dst.address());

    try {
        hermes::mapped_buffer input_data(d_src.canonical_path().string());
        std::error_code ec;
        hermes::mapped_buffer input_data(d_src.canonical_path().string(),
                                         hermes::access_mode::read_only,
                                         &ec);

        if(ec) {
            LOGGER_ERROR("Failed mapping input data: {}", ec.value());
            return ec;
        }

        std::vector<hermes::mutable_buffer> bufvec{
            hermes::mutable_buffer{(void*) input_data.data(), input_data.size()}
            hermes::mutable_buffer{input_data.data(), input_data.size()}
        };

        auto buffers = 
            m_remote_endpoint->expose(bufvec, hermes::access_mode::read_only);
            m_network_endpoint->expose(bufvec, hermes::access_mode::read_only);

        norns::rpc::remote_transfer::input args(
                m_remote_endpoint->self_address(),
                m_network_endpoint->self_address(),
                d_src.parent()->nsid(),
                d_dst.parent()->nsid(), 
                static_cast<uint32_t>(backend_type::posix_filesystem),
@@ -100,7 +108,7 @@ local_path_to_remote_resource_transferor::transfer(
                buffers);

        LOGGER_DEBUG("rpc::in::args{{");
        LOGGER_DEBUG("  address: \"{}\",", m_remote_endpoint->self_address()); 
        LOGGER_DEBUG("  address: \"{}\",", m_network_endpoint->self_address()); 
        LOGGER_DEBUG("  in_nsid: \"{}\",", d_src.parent()->nsid());
        LOGGER_DEBUG("  out_nsid: \"{}\",", d_dst.parent()->nsid());
        LOGGER_DEBUG("  btype: {} ({}),",
@@ -117,7 +125,7 @@ local_path_to_remote_resource_transferor::transfer(
        auto start = std::chrono::steady_clock::now();

        auto rpc = 
            m_remote_endpoint->post<norns::rpc::remote_transfer>(endp, args);
            m_network_endpoint->post<norns::rpc::remote_transfer>(endp, args);

        auto resp = rpc.get();

+2 −2
Original line number Diff line number Diff line
@@ -60,7 +60,7 @@ namespace io {
struct local_path_to_remote_resource_transferor : public transferor {

    local_path_to_remote_resource_transferor(
            std::shared_ptr<hermes::async_engine> remote_endpoint);
            std::shared_ptr<hermes::async_engine> network_endpoint);

    bool 
    validate(const std::shared_ptr<data::resource_info>& src_info,
@@ -88,7 +88,7 @@ private:
    void
    do_accept(hermes::request<norns::rpc::remote_transfer>&& req);

    std::shared_ptr<hermes::async_engine> m_remote_endpoint;
    std::shared_ptr<hermes::async_engine> m_network_endpoint;

};

+13 −15
Original line number Diff line number Diff line
@@ -41,11 +41,13 @@ std::tuple<std::error_code, std::shared_ptr<hermes::mapped_buffer>>
create_file(const bfs::path& filename,
            std::size_t size) {

    std::error_code ec;

    int out_fd = 
        ::open(filename.c_str(), O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);

    if(out_fd == -1) {
        auto ec = std::make_error_code(static_cast<std::errc>(errno));
        ec = std::make_error_code(static_cast<std::errc>(errno));
        return std::make_tuple(ec, nullptr);
    }

@@ -54,11 +56,11 @@ create_file(const bfs::path& filename,
        // filesystem doesn't support fallocate(), fallback to truncate()
        if(errno == EOPNOTSUPP) {
            if(::ftruncate(out_fd, size) != 0) {
                auto ec = std::make_error_code(static_cast<std::errc>(errno));
                ec = std::make_error_code(static_cast<std::errc>(errno));
                return std::make_tuple(ec, nullptr);
            }
        }
        auto ec = std::make_error_code(static_cast<std::errc>(errno));
        ec = std::make_error_code(static_cast<std::errc>(errno));
        return std::make_tuple(ec, nullptr);
    }

@@ -68,25 +70,21 @@ retry_close:
            goto retry_close;
        }

        auto ec = std::make_error_code(static_cast<std::errc>(errno));
        ec = std::make_error_code(static_cast<std::errc>(errno));
        return std::make_tuple(ec, nullptr);
    }

    std::shared_ptr<hermes::mapped_buffer> output_data;

    try {
        output_data = 
    auto output_data = 
        std::make_shared<hermes::mapped_buffer>(
                filename.string(), hermes::access_mode::write_only);
    }
    catch(const std::exception& ex) {
        LOGGER_ERROR(ex.what());
            filename.string(), 
            hermes::access_mode::write_only,
            &ec);

        auto ec = std::make_error_code(static_cast<std::errc>(-1));
    if(ec) {
        LOGGER_ERROR("Failed mapping output data: {}", ec.value());
        return std::make_tuple(ec, output_data);
    }

    auto ec = std::make_error_code(static_cast<std::errc>(0));
    return std::make_tuple(ec, output_data);
}