Commit e376a6b3 authored by Ramon Nou's avatar Ramon Nou
Browse files

base64 in inline

parent 4bf56e36
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -74,6 +74,12 @@ compress_bitset(const std::vector<uint8_t>& bytes);
std::vector<uint8_t>
decompress_bitset(const std::string& compressedString);

std::string
base64_encode(const std::string& data);

std::string
base64_decode_to_string(const std::string& encoded);

} // namespace gkfs::rpc

#endif // GEKKOFS_COMMON_RPC_UTILS_HPP
+1 −0
Original line number Diff line number Diff line
@@ -1100,6 +1100,7 @@ gkfs_do_write(gkfs::filemap::OpenFile& file, const char* buf, size_t count,
           md->size() <= gkfs::config::metadata::inline_data_size) {
            LOG(DEBUG, "{}() Migrating inline data to chunks. Size: {}",
                __func__, md->size());

            // Write inline data to chunks
            auto err_migration = gkfs::rpc::forward_write(
                    *path, md->inline_data().c_str(), 0, md->size(), 0);
+11 −3
Original line number Diff line number Diff line
@@ -1169,10 +1169,14 @@ forward_write_inline(const std::string& path, const void* buf, off64_t offset,
        // Construct std::string from buffer for serialization
        // Note: This copies data, which is acceptable for small inline writes
        std::string data(static_cast<const char*>(buf), write_size);
        // Base64 encode the data to ensure it is safe for RPC transmission (no
        // null bytes)
        std::string encoded_data = gkfs::rpc::base64_encode(data);

        auto out = ld_network_service
                           ->post<gkfs::rpc::write_data_inline>(
                                   endp, path, offset, data, write_size,
                                   endp, path, offset, encoded_data,
                                   encoded_data.size(),
                                   bool_to_merc_bool(append_flag))
                           .get()
                           .at(0);
@@ -1214,10 +1218,14 @@ forward_read_inline(const std::string& path, void* buf, off64_t offset,

        // Copy data from string response to user buffer
        if(out.count() > 0 && !out.data().empty()) {
            std::memcpy(buf, out.data().c_str(), out.count());
            // Decode Base64 string back to binary
            std::string decoded_data =
                    gkfs::rpc::base64_decode_to_string(out.data());
            std::memcpy(buf, decoded_data.c_str(), decoded_data.size());
            return {0, decoded_data.size()};
        }

        return {0, out.count()};
        return {0, 0};

    } catch(const std::exception& ex) {
        LOG(ERROR, "{}() Exception: '{}'", __func__, ex.what());
+1 −0
Original line number Diff line number Diff line
@@ -102,6 +102,7 @@ target_sources(metadata
target_link_libraries(metadata
    PRIVATE
    fmt::fmt
    rpc_utils
)

add_library(path_util STATIC)
+4 −2
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@
*/

#include <common/metadata.hpp>
#include <common/rpc/rpc_util.hpp>
#include <config.hpp>

#include <fmt/format.h>
@@ -205,7 +206,8 @@ Metadata::Metadata(const std::string& binary_str) {
    if(gkfs::config::metadata::use_inline_data && ptr < end) {
        if(*ptr == MSP)
            ++ptr; // optional separator before payload
        inline_data_ = std::string(ptr, end - ptr);
        inline_data_ =
                gkfs::rpc::base64_decode_to_string(std::string(ptr, end - ptr));
    }
}

@@ -248,7 +250,7 @@ Metadata::serialize() const {

    if(gkfs::config::metadata::use_inline_data && !inline_data_.empty()) {
        s += MSP; // Separator
        s += inline_data_;
        s += gkfs::rpc::base64_encode(inline_data_);
    }
    return s;
}
Loading