metadata_v2: implement more filesystem functions

This commit is contained in:
Marcus Holland-Moritz 2020-11-27 17:59:35 +01:00
parent 1af13f4e62
commit 890d816f25
4 changed files with 80 additions and 73 deletions

View File

@ -62,46 +62,48 @@ class filesystem_v2 {
impl_->walk(func); impl_->walk(func);
} }
#if 0 std::optional<entry_view> find(const char* path) const {
const dir_entry* find(const char* path) const { return impl_->find(path); } return impl_->find(path);
}
const dir_entry* find(int inode) const { return impl_->find(inode); } std::optional<entry_view> find(int inode) const { return impl_->find(inode); }
const dir_entry* find(int inode, const char* name) const { std::optional<entry_view> find(int inode, const char* name) const {
return impl_->find(inode, name); return impl_->find(inode, name);
} }
int getattr(const dir_entry* de, struct ::stat* stbuf) const { int getattr(entry_view entry, struct ::stat* stbuf) const {
return impl_->getattr(de, stbuf); return impl_->getattr(entry, stbuf);
} }
int access(const dir_entry* de, int mode, uid_t uid, gid_t gid) const { int access(entry_view entry, int mode, uid_t uid, gid_t gid) const {
return impl_->access(de, mode, uid, gid); return impl_->access(entry, mode, uid, gid);
} }
const directory* opendir(const dir_entry* de) const { std::optional<directory_view> opendir(entry_view entry) const {
return impl_->opendir(de); return impl_->opendir(entry);
} }
const dir_entry* std::optional<std::pair<entry_view, std::string_view>>
readdir(const directory* d, size_t offset, std::string* name) const { readdir(directory_view dir, size_t offset) const {
return impl_->readdir(d, offset, name); return impl_->readdir(dir, offset);
} }
size_t dirsize(const directory* d) const { return impl_->dirsize(d); } size_t dirsize(directory_view dir) const { return impl_->dirsize(dir); }
int readlink(const dir_entry* de, char* buf, size_t size) const { int readlink(entry_view entry, std::string* buf) const {
return impl_->readlink(de, buf, size); return impl_->readlink(entry, buf);
} }
int readlink(const dir_entry* de, std::string* buf) const { folly::Expected<std::string_view, int> readlink(entry_view entry) const {
return impl_->readlink(de, buf); return impl_->readlink(entry);
} }
int statvfs(struct ::statvfs* stbuf) const { return impl_->statvfs(stbuf); } int statvfs(struct ::statvfs* stbuf) const { return impl_->statvfs(stbuf); }
int open(const dir_entry* de) const { return impl_->open(de); } int open(entry_view entry) const { return impl_->open(entry); }
#if 0
ssize_t read(uint32_t inode, char* buf, size_t size, off_t offset) const { ssize_t read(uint32_t inode, char* buf, size_t size, off_t offset) const {
return impl_->read(inode, buf, size, offset); return impl_->read(inode, buf, size, offset);
} }
@ -118,21 +120,23 @@ class filesystem_v2 {
virtual void dump(std::ostream& os) const = 0; virtual void dump(std::ostream& os) const = 0;
virtual void walk(std::function<void(entry_view)> const& func) const = 0; virtual void walk(std::function<void(entry_view)> const& func) const = 0;
#if 0 virtual std::optional<entry_view> find(const char* path) const = 0;
virtual const dir_entry* find(const char* path) const = 0; virtual std::optional<entry_view> find(int inode) const = 0;
virtual const dir_entry* find(int inode) const = 0; virtual std::optional<entry_view>
virtual const dir_entry* find(int inode, const char* name) const = 0; find(int inode, const char* name) const = 0;
virtual int getattr(const dir_entry* de, struct ::stat* stbuf) const = 0; virtual int getattr(entry_view entry, struct ::stat* stbuf) const = 0;
virtual int virtual int
access(const dir_entry* de, int mode, uid_t uid, gid_t gid) const = 0; access(entry_view entry, int mode, uid_t uid, gid_t gid) const = 0;
virtual const directory* opendir(const dir_entry* de) const = 0; virtual std::optional<directory_view> opendir(entry_view entry) const = 0;
virtual const dir_entry* virtual std::optional<std::pair<entry_view, std::string_view>>
readdir(const directory* d, size_t offset, std::string* name) const = 0; readdir(directory_view dir, size_t offset) const = 0;
virtual size_t dirsize(const directory* d) const = 0; virtual size_t dirsize(directory_view dir) const = 0;
virtual int readlink(const dir_entry* de, char* buf, size_t size) const = 0; virtual int readlink(entry_view entry, std::string* buf) const = 0;
virtual int readlink(const dir_entry* de, std::string* buf) const = 0; virtual folly::Expected<std::string_view, int>
readlink(entry_view entry) const = 0;
virtual int statvfs(struct ::statvfs* stbuf) const = 0; virtual int statvfs(struct ::statvfs* stbuf) const = 0;
virtual int open(const dir_entry* de) const = 0; virtual int open(entry_view entry) const = 0;
#if 0
virtual ssize_t virtual ssize_t
read(uint32_t inode, char* buf, size_t size, off_t offset) const = 0; read(uint32_t inode, char* buf, size_t size, off_t offset) const = 0;
virtual ssize_t readv(uint32_t inode, iovec_read_buf& buf, size_t size, virtual ssize_t readv(uint32_t inode, iovec_read_buf& buf, size_t size,

View File

@ -174,8 +174,10 @@ class metadata_v2 {
static void get_stat_defaults(struct ::stat* defaults); static void get_stat_defaults(struct ::stat* defaults);
// TODO: check if this is needed
size_t size() const { return impl_->size(); } size_t size() const { return impl_->size(); }
// TODO: check if this is needed
bool empty() const { return !impl_ || impl_->empty(); } bool empty() const { return !impl_ || impl_->empty(); }
void walk(std::function<void(entry_view)> const& func) const { void walk(std::function<void(entry_view)> const& func) const {

View File

@ -179,7 +179,7 @@ void block_manager_<LoggerPolicy>::finish_blocks() {
} }
for (const auto& sti : stats_) { for (const auto& sti : stats_) {
static char const* const percent = "{:.2%}%"; static char const* const percent = "{:.2}%";
const auto& st = sti.second; const auto& st = sti.second;
log_.debug() << "blockhash window <" << sti.first << ">: " << st.collisions log_.debug() << "blockhash window <" << sti.first << ">: " << st.collisions
<< " collisions (" << " collisions ("

View File

@ -159,21 +159,21 @@ class filesystem_ : public filesystem_v2::impl {
void dump(std::ostream& os) const override; void dump(std::ostream& os) const override;
void walk(std::function<void(entry_view)> const& func) const override; void walk(std::function<void(entry_view)> const& func) const override;
#if 0 std::optional<entry_view> find(const char* path) const override;
const dir_entry* find(const char* path) const override; std::optional<entry_view> find(int inode) const override;
const dir_entry* find(int inode) const override; std::optional<entry_view> find(int inode, const char* name) const override;
const dir_entry* find(int inode, const char* name) const override; int getattr(entry_view entry, struct ::stat* stbuf) const override;
int getattr(const dir_entry* de, struct ::stat* stbuf) const override; int access(entry_view entry, int mode, uid_t uid, gid_t gid) const override;
int access(const dir_entry* de, int mode, uid_t uid, std::optional<directory_view> opendir(entry_view entry) const override;
gid_t gid) const override; std::optional<std::pair<entry_view, std::string_view>>
const directory* opendir(const dir_entry* de) const override; readdir(directory_view dir, size_t offset) const override;
const dir_entry* size_t dirsize(directory_view dir) const override;
readdir(const directory* d, size_t offset, std::string* name) const override; int readlink(entry_view entry, std::string* buf) const override;
size_t dirsize(const directory* d) const override; folly::Expected<std::string_view, int>
int readlink(const dir_entry* de, char* buf, size_t size) const override; readlink(entry_view entry) const override;
int readlink(const dir_entry* de, std::string* buf) const override;
int statvfs(struct ::statvfs* stbuf) const override; int statvfs(struct ::statvfs* stbuf) const override;
int open(const dir_entry* de) const override; int open(entry_view entry) const override;
#if 0
ssize_t ssize_t
read(uint32_t inode, char* buf, size_t size, off_t offset) const override; read(uint32_t inode, char* buf, size_t size, off_t offset) const override;
ssize_t readv(uint32_t inode, iovec_read_buf& buf, size_t size, ssize_t readv(uint32_t inode, iovec_read_buf& buf, size_t size,
@ -249,62 +249,62 @@ void filesystem_<LoggerPolicy>::walk(
meta_.walk(func); meta_.walk(func);
} }
#if 0
template <typename LoggerPolicy> template <typename LoggerPolicy>
const dir_entry* filesystem_<LoggerPolicy>::find(const char* path) const { std::optional<entry_view>
filesystem_<LoggerPolicy>::find(const char* path) const {
return meta_.find(path); return meta_.find(path);
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
const dir_entry* filesystem_<LoggerPolicy>::find(int inode) const { std::optional<entry_view> filesystem_<LoggerPolicy>::find(int inode) const {
return meta_.find(inode); return meta_.find(inode);
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
const dir_entry* std::optional<entry_view>
filesystem_<LoggerPolicy>::find(int inode, const char* name) const { filesystem_<LoggerPolicy>::find(int inode, const char* name) const {
return meta_.find(inode, name); return meta_.find(inode, name);
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
int filesystem_<LoggerPolicy>::getattr(const dir_entry* de, int filesystem_<LoggerPolicy>::getattr(entry_view entry,
struct ::stat* stbuf) const { struct ::stat* stbuf) const {
return meta_.getattr(de, stbuf); return meta_.getattr(entry, stbuf);
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
int filesystem_<LoggerPolicy>::access(const dir_entry* de, int mode, uid_t uid, int filesystem_<LoggerPolicy>::access(entry_view entry, int mode, uid_t uid,
gid_t gid) const { gid_t gid) const {
return meta_.access(de, mode, uid, gid); return meta_.access(entry, mode, uid, gid);
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
const directory* filesystem_<LoggerPolicy>::opendir(const dir_entry* de) const { std::optional<directory_view>
return meta_.opendir(de); filesystem_<LoggerPolicy>::opendir(entry_view entry) const {
return meta_.opendir(entry);
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
const dir_entry* std::optional<std::pair<entry_view, std::string_view>>
filesystem_<LoggerPolicy>::readdir(const directory* d, size_t offset, filesystem_<LoggerPolicy>::readdir(directory_view dir, size_t offset) const {
std::string* name) const { return meta_.readdir(dir, offset);
return meta_.readdir(d, offset, name);
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
size_t filesystem_<LoggerPolicy>::dirsize(const directory* d) const { size_t filesystem_<LoggerPolicy>::dirsize(directory_view dir) const {
return meta_.dirsize(d); return meta_.dirsize(dir);
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
int filesystem_<LoggerPolicy>::readlink(const dir_entry* de, char* buf, int filesystem_<LoggerPolicy>::readlink(entry_view entry,
size_t size) const {
return meta_.readlink(de, buf, size);
}
template <typename LoggerPolicy>
int filesystem_<LoggerPolicy>::readlink(const dir_entry* de,
std::string* buf) const { std::string* buf) const {
return meta_.readlink(de, buf); return meta_.readlink(entry, buf);
}
template <typename LoggerPolicy>
folly::Expected<std::string_view, int>
filesystem_<LoggerPolicy>::readlink(entry_view entry) const {
return meta_.readlink(entry);
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
@ -314,10 +314,11 @@ int filesystem_<LoggerPolicy>::statvfs(struct ::statvfs* stbuf) const {
} }
template <typename LoggerPolicy> template <typename LoggerPolicy>
int filesystem_<LoggerPolicy>::open(const dir_entry* de) const { int filesystem_<LoggerPolicy>::open(entry_view entry) const {
return meta_.open(de); return meta_.open(entry);
} }
#if 0
template <typename LoggerPolicy> template <typename LoggerPolicy>
ssize_t filesystem_<LoggerPolicy>::read(uint32_t inode, char* buf, size_t size, ssize_t filesystem_<LoggerPolicy>::read(uint32_t inode, char* buf, size_t size,
off_t offset) const { off_t offset) const {