From 26d9377697cb99e15fa10af7e9f0ccca611f4388 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Fri, 27 Nov 2020 00:28:16 +0100 Subject: [PATCH] metadata_v2: cleanups --- src/dwarfs/metadata_v2.cpp | 135 +++++++------------------------------ 1 file changed, 23 insertions(+), 112 deletions(-) diff --git a/src/dwarfs/metadata_v2.cpp b/src/dwarfs/metadata_v2.cpp index 60d2fc38..a992a4f0 100644 --- a/src/dwarfs/metadata_v2.cpp +++ b/src/dwarfs/metadata_v2.cpp @@ -110,8 +110,8 @@ class metadata_v2_ : public metadata_v2::impl { std::string modestring(uint16_t mode) const; - size_t reg_filesize(uint32_t inode) const { - inode -= chunk_index_offset_; + size_t reg_file_size(entry_view entry) const { + auto inode = entry.inode() - chunk_index_offset_; uint32_t cur = meta_.chunk_index()[inode]; uint32_t end = meta_.chunk_index()[inode + 1]; size_t size = 0; @@ -121,14 +121,13 @@ class metadata_v2_ : public metadata_v2::impl { return size; } - size_t filesize(entry_view entry, uint16_t mode) const { + size_t link_size(entry_view entry) const { return link_name(entry).size(); } + + size_t file_size(entry_view entry, uint16_t mode) const { if (S_ISREG(mode)) { - return reg_filesize(entry.inode()); + return reg_file_size(entry); } else if (S_ISLNK(mode)) { - return meta_ - .links()[meta_ - .link_index()[entry.inode() - meta_.link_index_offset()]] - .size(); + return link_size(entry); } else { return 0; } @@ -150,38 +149,21 @@ class metadata_v2_ : public metadata_v2::impl { return rv; } + std::string_view entry_name(entry_view entry) const { + return meta_.names()[entry.name_index()]; + } + + std::string_view link_name(entry_view entry) const { + return meta_ + .links()[meta_.link_index()[entry.inode()] - meta_.link_index_offset()]; + } + #if 0 - std::string name(entry_view entry) const { - return std::string(as(entry->name_offset), entry->name_size); - } - - size_t linksize(entry_view entry) const { - return *as(entry->u.offset); - } - - std::string linkname(entry_view entry) const { - size_t offs = entry->u.offset; - return std::string(as(offs + sizeof(uint16_t)), *as(offs)); - } - const char* linkptr(entry_view entry) const { return as(entry->u.offset + sizeof(uint16_t)); } - - template - const T* as(size_t offset = 0) const { - return reinterpret_cast( - reinterpret_cast(data_.data()) + offset); - } - - void parse(const struct ::stat* defaults); - - const uint32_t* chunk_index_ = nullptr; - const uint32_t* inode_index_ = nullptr; - entry_view root_ = nullptr; - const meta_config* cfg_ = nullptr; - std::shared_ptr dir_reader_; #endif + std::vector data_; ::apache::thrift::frozen::MappedFrozen meta_; entry_view root_; @@ -200,21 +182,19 @@ void metadata_v2_::dump( os << indent << " " << modestring(mode); if (inode > 0) { - os << " " << meta_.names()[entry.name_index()]; + os << " " << entry_name(entry); } if (S_ISREG(mode)) { uint32_t beg = meta_.chunk_index()[inode - chunk_index_offset_]; uint32_t end = meta_.chunk_index()[inode - chunk_index_offset_ + 1]; os << " [" << beg << ", " << end << "]"; - os << " " << filesize(entry, mode) << "\n"; + os << " " << file_size(entry, mode) << "\n"; icb(indent + " ", inode); } else if (S_ISDIR(mode)) { dump(os, indent + " ", meta_.directories()[inode], std::move(icb)); } else if (S_ISLNK(mode)) { - os << " -> " - << meta_.links()[meta_.link_index()[inode] - meta_.link_index_offset()] - << "\n"; + os << " -> " << link_name(entry) << "\n"; } else { os << " (unknown type)\n"; } @@ -290,7 +270,7 @@ metadata_v2_::find(directory_view dir, auto it = std::lower_bound( range.begin(), range.end(), name, [&](auto it, std::string_view name) { - return meta_.names()[meta_.entries()[it].name_index()].compare(name); + return entry_name(meta_.entries()[it]).compare(name); }); std::optional rv; @@ -298,7 +278,7 @@ metadata_v2_::find(directory_view dir, if (it != range.end()) { auto cand = meta_.entries()[*it]; - if (meta_.names()[cand.name_index()] == name) { + if (entry_name(cand) == name) { rv = cand; } } @@ -350,80 +330,11 @@ metadata_v2_::find(int inode, } #if 0 -template -void metadata_v2_::parse(const struct ::stat* defaults) { - size_t offset = 0; - - while (offset + sizeof(section_header) <= size()) { - const section_header* sh = as(offset); - - log_.debug() << "section_header@" << offset << " (" << sh->to_string() - << ")"; - - offset += sizeof(section_header); - - if (offset + sh->length > size()) { - throw std::runtime_error("truncated metadata"); - } - - if (sh->compression != compression_type::NONE) { - throw std::runtime_error("unsupported metadata compression type"); - } - - switch (sh->type) { - case section_type::META_TABLEDATA: - case section_type::META_DIRECTORIES: - // ok, ignore - break; - - case section_type::META_CHUNK_INDEX: - chunk_index_ = as(offset); - break; - - case section_type::META_INODE_INDEX: - inode_index_ = as(offset); - break; - - case section_type::META_CONFIG: - cfg_ = as(offset); - break; - - default: - throw std::runtime_error("unknown metadata section"); - } - - offset += sh->length; - } - - // TODO: moar checkz - - if (!cfg_) { - throw std::runtime_error("no metadata configuration found"); - } - - struct ::stat stat_defaults; - - if (defaults) { - stat_defaults = *defaults; - } else { - metadata::get_stat_defaults(&stat_defaults); - } - - chunk_index_ -= cfg_->chunk_index_offset; - inode_index_ -= cfg_->inode_index_offset; - - root_ = as(inode_index_[0]); - - dir_reader_ = dir_reader::create(cfg_->de_type, stat_defaults, - reinterpret_cast(data_.data()), - inode_offset_); -} - template int metadata_v2_::getattr(entry_view entry, struct ::stat* stbuf) const { ::memset(stbuf, 0, sizeof(*stbuf)); - dir_reader_->getattr(entry, stbuf, filesize(entry)); + dir_reader_->getattr(entry, stbuf, file_size(entry)); return 0; }