feat(metadata_v2): use bit-packing for chunk table

This commit is contained in:
Marcus Holland-Moritz 2024-08-23 13:23:21 +02:00
parent ed0f64917a
commit 65f5c99592

View File

@ -817,19 +817,19 @@ class metadata_ final : public metadata_v2::impl {
return 0; return 0;
} }
std::vector<uint32_t> unpack_chunk_table() const { packed_int_vector<uint32_t> unpack_chunk_table() const {
std::vector<uint32_t> chunk_table; packed_int_vector<uint32_t> chunk_table;
if (auto opts = meta_.options(); opts and opts->packed_chunk_table()) { if (auto opts = meta_.options(); opts and opts->packed_chunk_table()) {
auto ti = LOG_TIMED_DEBUG; auto ti = LOG_TIMED_DEBUG;
chunk_table.resize(meta_.chunk_table().size()); chunk_table.reset(std::bit_width(meta_.chunks().size()));
chunk_table.reserve(meta_.chunk_table().size());
std::partial_sum(meta_.chunk_table().begin(), meta_.chunk_table().end(), std::partial_sum(meta_.chunk_table().begin(), meta_.chunk_table().end(),
chunk_table.begin()); std::back_inserter(chunk_table));
ti << "unpacked chunk table (" ti << "unpacked chunk table with " << chunk_table.size() << " entries ("
<< size_with_unit(sizeof(chunk_table.front()) * chunk_table.capacity()) << size_with_unit(chunk_table.size_in_bytes()) << ")";
<< ")";
} }
return chunk_table; return chunk_table;
@ -933,7 +933,7 @@ class metadata_ final : public metadata_v2::impl {
const int dev_inode_offset_; const int dev_inode_offset_;
const int inode_count_; const int inode_count_;
const packed_int_vector<uint32_t> nlinks_; const packed_int_vector<uint32_t> nlinks_;
const std::vector<uint32_t> chunk_table_; const packed_int_vector<uint32_t> chunk_table_;
const packed_int_vector<uint32_t> shared_files_; const packed_int_vector<uint32_t> shared_files_;
const int unique_files_; const int unique_files_;
const metadata_options options_; const metadata_options options_;
@ -1455,7 +1455,7 @@ thrift::metadata::metadata metadata_<LoggerPolicy>::unpack_metadata() const {
if (auto opts = meta.options()) { if (auto opts = meta.options()) {
if (opts->packed_chunk_table().value()) { if (opts->packed_chunk_table().value()) {
meta.chunk_table() = chunk_table_; meta.chunk_table() = chunk_table_.unpack();
} }
if (auto const& dirs = global_.bundled_directories()) { if (auto const& dirs = global_.bundled_directories()) {
meta.directories() = dirs->thaw(); meta.directories() = dirs->thaw();