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 class directory_view
: public ::apache::thrift::frozen::View<thrift::metadata::directory> { : public ::apache::thrift::frozen::View<thrift::metadata::entry> {
public: public:
directory_view( 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* ::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata> const*
meta) meta)
: ::apache::thrift::frozen::View<thrift::metadata::directory>(dv) : ::apache::thrift::frozen::View<thrift::metadata::entry>(ev)
, meta_(meta) {} , 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; boost::integer_range<uint32_t> entry_range() const;
uint32_t self_inode();
private: 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* ::apache::thrift::frozen::MappedFrozen<thrift::metadata::metadata> const*
meta_; 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()]; } uint16_t entry_view::getgid() const { return meta_->gids()[group_index()]; }
boost::integer_range<uint32_t> directory_view::entry_range() const { ::apache::thrift::frozen::View<thrift::metadata::directory>
auto first = first_entry(); directory_view::getdir() const {
return boost::irange(first, first + entry_count()); return getdir(inode());
} }
uint32_t directory_view::self_inode() { ::apache::thrift::frozen::View<thrift::metadata::directory>
auto pos = getPosition().bitOffset; directory_view::getdir(uint32_t ino) const {
if (pos > 0) { return meta_->directories()[ino];
// XXX: this is evil trickery... }
auto one = meta_->directories()[1].getPosition().bitOffset;
assert(pos % one == 0); uint32_t directory_view::entry_count() const { return getdir().entry_count(); }
pos /= one;
} boost::integer_range<uint32_t> directory_view::entry_range() const {
return pos; 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 } // namespace dwarfs

View File

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