Skip to content

Commit

Permalink
refactor: factor out find_inode_rank_offset
Browse files Browse the repository at this point in the history
  • Loading branch information
mhx committed Nov 25, 2024
1 parent f1ad67d commit 9b6fc81
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 21 deletions.
12 changes: 12 additions & 0 deletions include/dwarfs/internal/metadata_utils.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@

#include <cstdint>

#include <thrift/lib/cpp2/frozen/FrozenUtil.h>

#include <dwarfs/gen-cpp2/metadata_layouts.h>
#include <dwarfs/gen-cpp2/metadata_types.h>

namespace dwarfs::internal {

// This represents the order in which inodes are stored in inodes
Expand All @@ -37,4 +42,11 @@ enum class inode_rank {

inode_rank get_inode_rank(uint32_t mode);

size_t find_inode_rank_offset(
::apache::thrift::frozen::Layout<thrift::metadata::metadata>::View meta,
inode_rank rank);

size_t
find_inode_rank_offset(thrift::metadata::metadata const& meta, inode_rank rank);

} // namespace dwarfs::internal
59 changes: 59 additions & 0 deletions src/internal/metadata_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,37 @@
* along with dwarfs. If not, see <https://www.gnu.org/licenses/>.
*/

#include <algorithm>

#include <boost/range/irange.hpp>

#include <fmt/format.h>

#include <dwarfs/error.h>
#include <dwarfs/file_type.h>

#include <dwarfs/internal/metadata_utils.h>

#include <dwarfs/gen-cpp2/metadata_types.h>

namespace dwarfs::internal {

namespace {

size_t find_inode_rank_offset_impl(inode_rank rank, size_t size,
auto&& get_inode_mode) {
auto range = boost::irange<size_t>(0, size);

auto it = std::lower_bound(range.begin(), range.end(), rank,
[&](auto inode, inode_rank r) {
return get_inode_rank(get_inode_mode(inode)) < r;
});

return *it;
}

} // namespace

inode_rank get_inode_rank(uint32_t mode) {
switch (posix_file_type::from_mode(mode)) {
case posix_file_type::directory:
Expand All @@ -48,4 +70,41 @@ inode_rank get_inode_rank(uint32_t mode) {
}
}

size_t find_inode_rank_offset(
::apache::thrift::frozen::Layout<thrift::metadata::metadata>::View meta,
inode_rank rank) {
auto get_mode = [&](auto index) {
return meta.modes()[meta.inodes()[index].mode_index()];
};

if (meta.dir_entries()) {
return find_inode_rank_offset_impl(
rank, meta.inodes().size(),
[&](auto inode) { return get_mode(inode); });
}

return find_inode_rank_offset_impl(
rank, meta.entry_table_v2_2().size(),
[&](auto inode) { return get_mode(meta.entry_table_v2_2()[inode]); });
}

size_t find_inode_rank_offset(thrift::metadata::metadata const& meta,
inode_rank rank) {
auto get_mode = [&](auto index) {
return meta.modes().value().at(
meta.inodes().value().at(index).mode_index().value());
};

if (meta.dir_entries().has_value()) {
return find_inode_rank_offset_impl(
rank, meta.inodes()->size(),
[&](auto inode) { return get_mode(inode); });
}

return find_inode_rank_offset_impl(
rank, meta.entry_table_v2_2()->size(), [&](auto inode) {
return get_mode(meta.entry_table_v2_2().value().at(inode));
});
}

} // namespace dwarfs::internal
22 changes: 1 addition & 21 deletions src/reader/internal/metadata_v2.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -602,27 +602,7 @@ class metadata_ final : public metadata_v2::impl {
}

size_t find_inode_offset(inode_rank rank) const {
if (meta_.dir_entries()) {
auto range = boost::irange(size_t(0), meta_.inodes().size());

auto it = std::lower_bound(
range.begin(), range.end(), rank, [&](auto inode, inode_rank r) {
auto mode = meta_.modes()[meta_.inodes()[inode].mode_index()];
return get_inode_rank(mode) < r;
});

return *it;
} else {
auto range = boost::irange(size_t(0), meta_.entry_table_v2_2().size());

auto it = std::lower_bound(range.begin(), range.end(), rank,
[&](auto inode, inode_rank r) {
auto iv = make_inode_view_impl(inode);
return get_inode_rank(iv.mode()) < r;
});

return *it;
}
return find_inode_rank_offset(meta_, rank);
}

directory_view make_directory_view(inode_view_impl const& iv) const {
Expand Down

0 comments on commit 9b6fc81

Please sign in to comment.