From dfcc2a20ebdfb56c470d269955d2531855e0d5c4 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Fri, 26 Jul 2024 23:10:23 +0200 Subject: [PATCH] feat(filesystem_v2): add error_code / throwing API for getattr --- include/dwarfs/filesystem_v2.h | 8 ++++++++ src/dwarfs/filesystem_v2.cpp | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/include/dwarfs/filesystem_v2.h b/include/dwarfs/filesystem_v2.h index fbcf9ccd..8c331fec 100644 --- a/include/dwarfs/filesystem_v2.h +++ b/include/dwarfs/filesystem_v2.h @@ -118,6 +118,12 @@ class filesystem_v2 { return impl_->getattr(entry, stbuf); } + file_stat getattr(inode_view entry, std::error_code& ec) const { + return impl_->getattr(entry, ec); + } + + file_stat getattr(inode_view entry) const { return impl_->getattr(entry); } + int access(inode_view entry, int mode, uid_t uid, gid_t gid) const { return impl_->access(entry, mode, uid, gid); } @@ -239,6 +245,8 @@ class filesystem_v2 { virtual std::optional find(int inode, const char* name) const = 0; virtual int getattr(inode_view entry, file_stat* stbuf) const = 0; + virtual file_stat getattr(inode_view entry, std::error_code& ec) const = 0; + virtual file_stat getattr(inode_view entry) const = 0; virtual int access(inode_view entry, int mode, uid_t uid, gid_t gid) const = 0; virtual std::optional opendir(inode_view entry) const = 0; diff --git a/src/dwarfs/filesystem_v2.cpp b/src/dwarfs/filesystem_v2.cpp index d663395b..a2720637 100644 --- a/src/dwarfs/filesystem_v2.cpp +++ b/src/dwarfs/filesystem_v2.cpp @@ -425,6 +425,8 @@ class filesystem_ final : public filesystem_v2::impl { std::optional find(int inode) const override; std::optional find(int inode, const char* name) const override; int getattr(inode_view entry, file_stat* stbuf) const override; + file_stat getattr(inode_view entry, std::error_code& ec) const override; + file_stat getattr(inode_view entry) const override; int access(inode_view entry, int mode, uid_t uid, gid_t gid) const override; std::optional opendir(inode_view entry) const override; std::optional> @@ -495,6 +497,8 @@ class filesystem_ final : public filesystem_v2::impl { PERFMON_CLS_TIMER_DECL(find_inode) PERFMON_CLS_TIMER_DECL(find_inode_name) PERFMON_CLS_TIMER_DECL(getattr) + PERFMON_CLS_TIMER_DECL(getattr_ec) + PERFMON_CLS_TIMER_DECL(getattr_throw) PERFMON_CLS_TIMER_DECL(access) PERFMON_CLS_TIMER_DECL(opendir) PERFMON_CLS_TIMER_DECL(readdir) @@ -575,6 +579,8 @@ filesystem_::filesystem_( PERFMON_CLS_TIMER_INIT(find_inode) PERFMON_CLS_TIMER_INIT(find_inode_name) PERFMON_CLS_TIMER_INIT(getattr) + PERFMON_CLS_TIMER_INIT(getattr_ec) + PERFMON_CLS_TIMER_INIT(getattr_throw) PERFMON_CLS_TIMER_INIT(access) PERFMON_CLS_TIMER_INIT(opendir) PERFMON_CLS_TIMER_INIT(readdir) @@ -1049,6 +1055,20 @@ int filesystem_::getattr(inode_view entry, return meta_.getattr(entry, stbuf); } +template +file_stat filesystem_::getattr(inode_view entry, + std::error_code& ec) const { + PERFMON_CLS_SCOPED_SECTION(getattr_ec) + return call_int_error( + [&](auto& stbuf) { return getattr(entry, &stbuf); }, ec); +} + +template +file_stat filesystem_::getattr(inode_view entry) const { + PERFMON_CLS_SCOPED_SECTION(getattr_throw) + return call_ec_throw([&](std::error_code& ec) { return getattr(entry, ec); }); +} + template int filesystem_::access(inode_view entry, int mode, uid_t uid, gid_t gid) const {