From 6aac44cda9d72d5a97324b3c701044be5f7b9fb3 Mon Sep 17 00:00:00 2001 From: Green Sky Date: Mon, 19 Feb 2024 12:32:09 +0100 Subject: [PATCH] change binary meta format and add zstd to metadata --- src/fragment_store/README.md | 15 +- src/fragment_store/fragment_store.cpp | 203 +++++++++++++----- src/fragment_store/fs_binary_msgpack1.png | Bin 0 -> 37255 bytes src/fragment_store/fs_binary_msgpack2.png | Bin 0 -> 46969 bytes src/fragment_store/message_fragment_store.cpp | 3 +- src/fragment_store/types.hpp | 6 +- 6 files changed, 160 insertions(+), 67 deletions(-) create mode 100644 src/fragment_store/fs_binary_msgpack1.png create mode 100644 src/fragment_store/fs_binary_msgpack2.png diff --git a/src/fragment_store/README.md b/src/fragment_store/README.md index a1d18a82..0eba57b3 100644 --- a/src/fragment_store/README.md +++ b/src/fragment_store/README.md @@ -40,25 +40,26 @@ A Metadata json object can have arbitrary keys, some are predefined: ### Split Metadata -file magic bytes `SOLMET` (6 bytes) +msgpack array: -1 byte encryption type (`0x00` is none) - -1 byte compression type (`0x00` is none) - -...metadata here... +- `[0]`: file magic string `SOLMET` (6 bytes) +- `[1]`: uint8 encryption type (`0x00` is none) +- `[2]`: uint8 compression type (`0x00` is none, `0x01` is zstd) +- `[3]`: binary metadata (optionally compressed and encrypted) note that the encryption and compression are for the metadata only. The metadata itself contains encryption and compression info about the data. ### Split Data -(none) all the data is in the metadata file. +All the metadata is in the metadata file. (like encryption and compression) This is mostly to allow direct storage for files in the Fragment store without excessive duplication. Keep in mind to not use the actual file name as the data/meta file name. ### Single fragment +Note: this format is unused for now + file magic bytes `SOLFIL` (6 bytes) 1 byte encryption type (`0x00` is none) diff --git a/src/fragment_store/fragment_store.cpp b/src/fragment_store/fragment_store.cpp index 6b4b40eb..a32573ac 100644 --- a/src/fragment_store/fragment_store.cpp +++ b/src/fragment_store/fragment_store.cpp @@ -224,15 +224,6 @@ FragmentID FragmentStore::getFragmentCustomMatcher( return entt::null; } -template -static void writeBinaryMetafileHeader(F& file, const Encryption enc, const Compression comp) { - file.write("SOLMET", 6); - file.put(static_cast>(enc)); - - // TODO: is compressiontype encrypted? - file.put(static_cast>(comp)); -} - bool FragmentStore::syncToStorage(FragmentID fid, std::function& data_cb) { if (!_reg.valid(fid)) { return false; @@ -298,13 +289,8 @@ bool FragmentStore::syncToStorage(FragmentID fid, std::functionsecond(storage.value(fid), meta_data[storage.type().hash()]); //} else if (meta_type == MetaFileType::TEXT_JSON) { - s_cb_it->second({_reg, fid}, meta_data[storage.type().name()]); + s_cb_it->second({_reg, fid}, meta_data_j[storage.type().name()]); //} } if (meta_type == MetaFileType::BINARY_MSGPACK) { // binary metadata file - const auto res = nlohmann::json::to_msgpack(meta_data); + const std::vector meta_data = nlohmann::json::to_msgpack(meta_data_j); + std::vector meta_data_compressed; // empty if none + //std::vector meta_data_encrypted; // empty if none - // TODO: refactor - if (meta_comp == Compression::NONE) { - meta_file.write(reinterpret_cast(res.data()), res.size()); - } else if (meta_comp == Compression::ZSTD) { - std::vector compressed_buffer; - compressed_buffer.resize(ZSTD_compressBound(res.size())); + if (meta_comp == Compression::ZSTD) { + meta_data_compressed.resize(ZSTD_compressBound(meta_data.size())); - size_t const cSize = ZSTD_compress(compressed_buffer.data(), compressed_buffer.size(), res.data(), res.size(), 0); // 0 is default is probably 3 + size_t const cSize = ZSTD_compress(meta_data_compressed.data(), meta_data_compressed.size(), meta_data.data(), meta_data.size(), 0); // 0 is default is probably 3 if (ZSTD_isError(cSize)) { std::cerr << "FS error: compressing meta failed\n"; - return false; // HACK + meta_data_compressed.clear(); + meta_comp = Compression::NONE; + } else { + meta_data_compressed.resize(cSize); } - - compressed_buffer.resize(cSize); // maybe skip this resize - - meta_file.write(reinterpret_cast(compressed_buffer.data()), compressed_buffer.size()); + } else if (meta_comp == Compression::NONE) { + // do nothing + } else { + assert(false && "implement me"); } + + // TODO: encryption + + // the meta file is itself msgpack data + nlohmann::json meta_header_j = nlohmann::json::array(); + meta_header_j.emplace_back() = "SOLMET"; + meta_header_j.push_back(meta_enc); + meta_header_j.push_back(meta_comp); + + if (false) { // TODO: encryption + } else if (!meta_data_compressed.empty()) { + meta_header_j.push_back(nlohmann::json::binary(meta_data_compressed)); + } else { + meta_header_j.push_back(nlohmann::json::binary(meta_data)); + } + + const auto meta_header_data = nlohmann::json::to_msgpack(meta_header_j); + meta_file.write(reinterpret_cast(meta_header_data.data()), meta_header_data.size()); } else if (meta_type == MetaFileType::TEXT_JSON) { // cant be compressed or encrypted - meta_file << meta_data.dump(2, ' ', true); + meta_file << meta_data_j.dump(2, ' ', true); } // now data @@ -409,6 +414,8 @@ bool FragmentStore::syncToStorage(FragmentID fid, std::function> j; + // file is a msgpack within a msgpack - if (!j.is_object()) { - std::cerr << "FS error: json in meta is broken " << it.id_str << "\n"; + std::vector full_meta_data; + { // read meta file + // figure out size + file.seekg(0, file.end); + uint64_t file_size = file.tellg(); + file.seekg(0, file.beg); + + full_meta_data.resize(file_size); + + file.read(reinterpret_cast(full_meta_data.data()), full_meta_data.size()); + } + + const auto meta_header_j = nlohmann::json::from_msgpack(full_meta_data); + + if (!meta_header_j.is_array() || meta_header_j.size() < 4) { + std::cerr << "FS error: broken binary meta " << it.frag_path << "\n"; continue; } - // TODO: existing fragment file - //newFragmentFile(); - FragmentHandle fh{_reg, _reg.create()}; - fh.emplace(hex2bin(it.id_str)); - - fh.emplace(it.frag_path.generic_u8string()); - - for (const auto& [k, v] : j.items()) { - // type id from string hash - const auto type_id = entt::hashed_string(k.data(), k.size()); - const auto deserl_fn_it = _sc._deserl_json.find(type_id); - if (deserl_fn_it != _sc._deserl_json.cend()) { - // TODO: check return value - deserl_fn_it->second(fh, v); - } else { - std::cerr << "FS warning: missing deserializer for meta key '" << k << "'\n"; - } + if (meta_header_j.at(0) != "SOLMET") { + std::cerr << "FS error: wrong magic '" << meta_header_j.at(0) << "' in meta " << it.frag_path << "\n"; + continue; } - // throw new frag event here - throwEventConstruct(fh); - count++; + + Encryption meta_enc = meta_header_j.at(1); + if (meta_enc != Encryption::NONE) { + std::cerr << "FS error: unknown encryption " << it.frag_path << "\n"; + continue; + } + + Compression meta_comp = meta_header_j.at(2); + if (meta_comp != Compression::NONE && meta_comp != Compression::ZSTD) { + std::cerr << "FS error: unknown compression " << it.frag_path << "\n"; + continue; + } + + //const auto& meta_data_ref = meta_header_j.at(3).is_binary()?meta_header_j.at(3):meta_header_j.at(3).at("data"); + if (!meta_header_j.at(3).is_binary()) { + std::cerr << "FS error: meta data not binary " << it.frag_path << "\n"; + continue; + } + const nlohmann::json::binary_t& meta_data_ref = meta_header_j.at(3); + + std::vector meta_data_decomp; + if (meta_comp == Compression::NONE) { + // do nothing + } else if (meta_comp == Compression::ZSTD) { + meta_data_decomp.resize(ZSTD_DStreamOutSize()); + ZSTD_DCtx* const dctx = ZSTD_createDCtx(); + + ZSTD_inBuffer input {meta_data_ref.data(), meta_data_ref.size(), 0 }; + ZSTD_outBuffer output = { meta_data_decomp.data(), meta_data_decomp.size(), 0 }; + do { + size_t const ret = ZSTD_decompressStream(dctx, &output , &input); + if (ZSTD_isError(ret)) { + // error <.< + std::cerr << "FS error: decompression error\n"; + meta_data_decomp.clear(); + break; + } + } while (input.pos < input.size); + meta_data_decomp.resize(output.pos); + + ZSTD_freeDCtx(dctx); + } else { + assert(false && "implement me"); + } + + // TODO: enc + + if (!meta_data_decomp.empty()) { + j = nlohmann::json::from_msgpack(meta_data_decomp); + } else { + j = nlohmann::json::from_msgpack(meta_data_ref); + } + } else if (it.meta_ext == ".meta.json") { + std::ifstream file(it.frag_path.generic_u8string() + it.meta_ext, std::ios::in | std::ios::binary); + if (!file.is_open()) { + std::cerr << "FS error: failed opening meta " << it.frag_path << "\n"; + continue; + } + + file >> j; } else { assert(false); } + + if (!j.is_object()) { + std::cerr << "FS error: json in meta is broken " << it.id_str << "\n"; + continue; + } + + // TODO: existing fragment file + //newFragmentFile(); + FragmentHandle fh{_reg, _reg.create()}; + fh.emplace(hex2bin(it.id_str)); + + fh.emplace(it.frag_path.generic_u8string()); + + for (const auto& [k, v] : j.items()) { + // type id from string hash + const auto type_id = entt::hashed_string(k.data(), k.size()); + const auto deserl_fn_it = _sc._deserl_json.find(type_id); + if (deserl_fn_it != _sc._deserl_json.cend()) { + // TODO: check return value + deserl_fn_it->second(fh, v); + } else { + std::cerr << "FS warning: missing deserializer for meta key '" << k << "'\n"; + } + } + // throw new frag event here + throwEventConstruct(fh); + count++; } return count; diff --git a/src/fragment_store/fs_binary_msgpack1.png b/src/fragment_store/fs_binary_msgpack1.png new file mode 100644 index 0000000000000000000000000000000000000000..b536b203ca5e1f586564c93e732fb464f798f3f7 GIT binary patch literal 37255 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 literal 0 HcmV?d00001 diff --git a/src/fragment_store/message_fragment_store.cpp b/src/fragment_store/message_fragment_store.cpp index b0b42130..a39fc7d1 100644 --- a/src/fragment_store/message_fragment_store.cpp +++ b/src/fragment_store/message_fragment_store.cpp @@ -145,7 +145,7 @@ void MessageFragmentStore::handleMessage(const Message3Handle& m) { // if its still not found, we need a new fragment if (fragment_uid.empty()) { - const auto new_fid = _fs.newFragmentFile("test_message_store/", MetaFileType::TEXT_JSON); + const auto new_fid = _fs.newFragmentFile("test_message_store/", MetaFileType::BINARY_MSGPACK); auto fh = _fs.fragmentHandle(new_fid); if (!static_cast(fh)) { std::cout << "MFS error: failed to create new fragment for message\n"; @@ -154,6 +154,7 @@ void MessageFragmentStore::handleMessage(const Message3Handle& m) { fragment_uid = fh.get().v; + fh.emplace_or_replace().comp = Compression::ZSTD; fh.emplace_or_replace().comp = Compression::ZSTD; auto& new_ts_range = fh.emplace(); diff --git a/src/fragment_store/types.hpp b/src/fragment_store/types.hpp index c259bd9b..97cfb144 100644 --- a/src/fragment_store/types.hpp +++ b/src/fragment_store/types.hpp @@ -8,10 +8,12 @@ enum class Encryption : uint8_t { enum class Compression : uint8_t { NONE = 0x00, ZSTD = 0x01, + // TODO: zstd without magic + // TODO: zstd meta dict + // TODO: zstd data(message) dict }; enum class MetaFileType : uint8_t { TEXT_JSON, - //BINARY_ARB, - BINARY_MSGPACK, + BINARY_MSGPACK, // msgpacked msgpack };