metadata_v2: refactor directory_view

This commit is contained in:
Marcus Holland-Moritz 2020-11-28 18:17:34 +01:00
parent 3d833dc9ef
commit 4b4ed714ac
3 changed files with 40 additions and 30 deletions

View File

@ -54,20 +54,26 @@ class entry_view
};
class directory_view
: public ::apache::thrift::frozen::View<thrift::metadata::directory> {
: public ::apache::thrift::frozen::View<thrift::metadata::entry> {
public:
directory_view(
::apache::thrift::frozen::View<thrift::metadata::directory> dv,
::apache::thrift::frozen::View<thrift::metadata::entry> ev,
::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata> const*
meta)
: ::apache::thrift::frozen::View<thrift::metadata::directory>(dv)
: ::apache::thrift::frozen::View<thrift::metadata::entry>(ev)
, meta_(meta) {}
uint32_t parent_inode() const;
uint32_t first_entry() const;
uint32_t entry_count() const;
boost::integer_range<uint32_t> entry_range() const;
uint32_t self_inode();
private:
::apache::thrift::frozen::View<thrift::metadata::directory> getdir() const;
::apache::thrift::frozen::View<thrift::metadata::directory>
getdir(uint32_t ino) const;
::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata> const*
meta_;
};

View File

@ -38,20 +38,28 @@ uint16_t entry_view::getuid() const { return meta_->uids()[owner_index()]; }
uint16_t entry_view::getgid() const { return meta_->gids()[group_index()]; }
boost::integer_range<uint32_t> directory_view::entry_range() const {
auto first = first_entry();
return boost::irange(first, first + entry_count());
::apache::thrift::frozen::View<thrift::metadata::directory>
directory_view::getdir() const {
return getdir(inode());
}
uint32_t directory_view::self_inode() {
auto pos = getPosition().bitOffset;
if (pos > 0) {
// XXX: this is evil trickery...
auto one = meta_->directories()[1].getPosition().bitOffset;
assert(pos % one == 0);
pos /= one;
}
return pos;
::apache::thrift::frozen::View<thrift::metadata::directory>
directory_view::getdir(uint32_t ino) const {
return meta_->directories()[ino];
}
uint32_t directory_view::entry_count() const { return getdir().entry_count(); }
boost::integer_range<uint32_t> directory_view::entry_range() const {
auto d = getdir();
auto first = d.first_entry();
return boost::irange(first, first + d.entry_count());
}
uint32_t directory_view::first_entry() const { return getdir().first_entry(); }
uint32_t directory_view::parent_inode() const {
return getdir().parent_inode();
}
} // namespace dwarfs

View File

@ -146,8 +146,8 @@ class metadata_ : public metadata_v2::impl {
return make_entry_view(meta_.entry_index()[inode]);
}
directory_view make_directory_view(size_t index) const {
return directory_view(meta_.directories()[index], &meta_);
directory_view make_directory_view(entry_view entry) const {
return directory_view(entry, &meta_);
}
void dump(std::ostream& os, const std::string& indent, entry_view entry,
@ -181,10 +181,6 @@ class metadata_ : public metadata_v2::impl {
}
}
directory_view getdir(entry_view entry) const {
return make_directory_view(entry.inode());
}
void
walk(entry_view entry, std::function<void(entry_view)> const& func) const;
@ -230,7 +226,7 @@ void metadata_<LoggerPolicy>::dump(
os << " " << file_size(entry, mode) << "\n";
icb(indent + " ", inode);
} else if (S_ISDIR(mode)) {
dump(os, indent + " ", make_directory_view(inode), std::move(icb));
dump(os, indent + " ", make_directory_view(entry), std::move(icb));
} else if (S_ISLNK(mode)) {
os << " -> " << link_value(entry) << "\n";
} else {
@ -245,7 +241,7 @@ void metadata_<LoggerPolicy>::dump(
auto count = dir.entry_count();
auto first = dir.first_entry();
os << "(" << count << " entries) [" << dir.self_inode() << ", "
os << "(" << count << " entries) [" << dir.inode() << ", "
<< dir.parent_inode() << "]\n";
for (size_t i = 0; i < count; ++i) {
@ -299,7 +295,7 @@ void metadata_<LoggerPolicy>::walk(
entry_view entry, std::function<void(entry_view)> const& func) const {
func(entry);
if (S_ISDIR(entry.mode())) {
auto dir = getdir(entry);
auto dir = make_directory_view(entry);
for (auto cur : dir.entry_range()) {
walk(make_entry_view(cur), func);
}
@ -348,7 +344,7 @@ metadata_<LoggerPolicy>::find(const char* path) const {
const char* next = ::strchr(path, '/');
size_t clen = next ? next - path : ::strlen(path);
entry = find(getdir(*entry), std::string_view(path, clen));
entry = find(make_directory_view(*entry), std::string_view(path, clen));
if (!entry) {
break;
@ -371,7 +367,7 @@ metadata_<LoggerPolicy>::find(int inode, const char* name) const {
auto entry = get_entry(inode);
if (entry) {
entry = find(getdir(*entry), std::string_view(name));
entry = find(make_directory_view(*entry), std::string_view(name));
}
return entry;
@ -404,7 +400,7 @@ metadata_<LoggerPolicy>::opendir(entry_view entry) const {
std::optional<directory_view> rv;
if (S_ISDIR(entry.mode())) {
rv = getdir(entry);
rv = make_directory_view(entry);
}
return rv;
@ -415,7 +411,7 @@ std::optional<std::pair<entry_view, std::string_view>>
metadata_<LoggerPolicy>::readdir(directory_view dir, size_t offset) const {
switch (offset) {
case 0:
return std::pair(make_entry_view_from_inode(dir.self_inode()), ".");
return std::pair(make_entry_view_from_inode(dir.inode()), ".");
case 1:
return std::pair(make_entry_view_from_inode(dir.parent_inode()), "..");