From 3e027a51ff0301caee4b55faca38f385f9834763 Mon Sep 17 00:00:00 2001 From: Chris Hogan Date: Thu, 9 Dec 2021 11:41:38 -0600 Subject: [PATCH 1/3] Intercept __fxstat in posix adapter --- adapter/include/hermes/adapter/posix.h | 6 ++- .../hermes/adapter/posix/metadata_manager.cc | 3 +- .../hermes/adapter/posix/metadata_manager.h | 5 ++ adapter/src/hermes/adapter/posix/posix.cc | 52 ++++++++++++++++++- adapter/test/data/hermes.conf | 4 +- adapter/test/mpiio/CMakeLists.txt | 4 +- 6 files changed, 67 insertions(+), 7 deletions(-) diff --git a/adapter/include/hermes/adapter/posix.h b/adapter/include/hermes/adapter/posix.h index f5d8d4b94..b87bfc8c8 100644 --- a/adapter/include/hermes/adapter/posix.h +++ b/adapter/include/hermes/adapter/posix.h @@ -21,10 +21,13 @@ */ #include #include +#include + /** * Dependent library headers */ #include "glog/logging.h" + /** * Internal headers */ @@ -60,11 +63,12 @@ HERMES_FORWARD_DECL(pwrite64, ssize_t, (int fd, const void *buf, size_t count, off64_t offset)); HERMES_FORWARD_DECL(lseek, off_t, (int fd, off_t offset, int whence)); HERMES_FORWARD_DECL(lseek64, off64_t, (int fd, off64_t offset, int whence)); +HERMES_FORWARD_DECL(__fxstat, int, (int version, int fd, struct stat *buf)); HERMES_FORWARD_DECL(fsync, int, (int fd)); HERMES_FORWARD_DECL(fdatasync, int, (int fd)); HERMES_FORWARD_DECL(close, int, (int fd)); /** - * MPI functions declarations + * MPI function declarations */ HERMES_FORWARD_DECL(MPI_Init, int, (int *argc, char ***argv)); HERMES_FORWARD_DECL(MPI_Finalize, int, (void)); diff --git a/adapter/src/hermes/adapter/posix/metadata_manager.cc b/adapter/src/hermes/adapter/posix/metadata_manager.cc index 6558ad1df..ec545d812 100644 --- a/adapter/src/hermes/adapter/posix/metadata_manager.cc +++ b/adapter/src/hermes/adapter/posix/metadata_manager.cc @@ -50,7 +50,8 @@ std::pair MetadataManager::Find(int fh) { FileID MetadataManager::Convert(int fd) { struct stat st; - int status = fstat(fd, &st); + MAP_OR_FAIL(__fxstat); + int status = real___fxstat_(_STAT_VER, fd, &st); if (status == 0) { return FileID(st.st_dev, st.st_ino); } else { diff --git a/adapter/src/hermes/adapter/posix/metadata_manager.h b/adapter/src/hermes/adapter/posix/metadata_manager.h index 05e91c155..8d08741e4 100644 --- a/adapter/src/hermes/adapter/posix/metadata_manager.h +++ b/adapter/src/hermes/adapter/posix/metadata_manager.h @@ -163,6 +163,11 @@ class MetadataManager { * The bool in pair indicated whether metadata entry exists. */ std::pair Find(int fh); + + /** + * Return the FileID associated with the file descriptor @p fd + */ + FileID GetFileId(int fd); }; } // namespace hermes::adapter::posix diff --git a/adapter/src/hermes/adapter/posix/posix.cc b/adapter/src/hermes/adapter/posix/posix.cc index 3f1bcaa4d..36f2b06fc 100644 --- a/adapter/src/hermes/adapter/posix/posix.cc +++ b/adapter/src/hermes/adapter/posix/posix.cc @@ -79,7 +79,8 @@ int simple_open(int ret, const std::string &path_str, int flags) { if (!existing.second) { LOG(INFO) << "File not opened before by adapter" << std::endl; struct stat st; - int status = fstat(ret, &st); + MAP_OR_FAIL(__fxstat); + int status = real___fxstat_(_STAT_VER, ret, &st); if (status == 0) { AdapterStat stat(st); stat.ref_count = 1; @@ -396,6 +397,7 @@ int HERMES_DECL(MPI_Finalize)(void) { int status = real_MPI_Finalize_(); return status; } + /** * POSIX */ @@ -429,6 +431,7 @@ int HERMES_DECL(open)(const char *path, int flags, ...) { } return (ret); } + int HERMES_DECL(open64)(const char *path, int flags, ...) { int ret; int mode = 0; @@ -459,6 +462,7 @@ int HERMES_DECL(open64)(const char *path, int flags, ...) { } return (ret); } + int HERMES_DECL(__open_2)(const char *path, int oflag) { int ret; if (hermes::adapter::IsTracked(path)) { @@ -478,6 +482,7 @@ int HERMES_DECL(__open_2)(const char *path, int oflag) { } return (ret); } + int HERMES_DECL(creat)(const char *path, mode_t mode) { int ret; std::string path_str(path); @@ -491,6 +496,7 @@ int HERMES_DECL(creat)(const char *path, mode_t mode) { } return (ret); } + int HERMES_DECL(creat64)(const char *path, mode_t mode) { int ret; std::string path_str(path); @@ -504,6 +510,7 @@ int HERMES_DECL(creat64)(const char *path, mode_t mode) { } return (ret); } + ssize_t HERMES_DECL(read)(int fd, void *buf, size_t count) { size_t ret; if (hermes::adapter::IsTracked(fd)) { @@ -523,6 +530,7 @@ ssize_t HERMES_DECL(read)(int fd, void *buf, size_t count) { } return (ret); } + ssize_t HERMES_DECL(write)(int fd, const void *buf, size_t count) { size_t ret; if (hermes::adapter::IsTracked(fd)) { @@ -541,6 +549,7 @@ ssize_t HERMES_DECL(write)(int fd, const void *buf, size_t count) { } return (ret); } + ssize_t HERMES_DECL(pread)(int fd, void *buf, size_t count, off_t offset) { size_t ret; if (hermes::adapter::IsTracked(fd)) { @@ -562,6 +571,7 @@ ssize_t HERMES_DECL(pread)(int fd, void *buf, size_t count, off_t offset) { } return (ret); } + ssize_t HERMES_DECL(pwrite)(int fd, const void *buf, size_t count, off_t offset) { size_t ret; @@ -584,6 +594,7 @@ ssize_t HERMES_DECL(pwrite)(int fd, const void *buf, size_t count, } return (ret); } + ssize_t HERMES_DECL(pread64)(int fd, void *buf, size_t count, off64_t offset) { size_t ret; if (hermes::adapter::IsTracked(fd)) { @@ -605,6 +616,7 @@ ssize_t HERMES_DECL(pread64)(int fd, void *buf, size_t count, off64_t offset) { } return (ret); } + ssize_t HERMES_DECL(pwrite64)(int fd, const void *buf, size_t count, off64_t offset) { size_t ret; @@ -715,6 +727,44 @@ off64_t HERMES_DECL(lseek64)(int fd, off64_t offset, int whence) { } return (ret); } + +int HERMES_DECL(__fxstat)(int version, int fd, struct stat *buf) { + int result = 0; + if (hermes::adapter::IsTracked(fd)) { + LOG(INFO) << "Intercepted fstat." << std::endl; + auto mdm = hermes::adapter::Singleton::GetInstance(); + auto existing = mdm->Find(fd); + if (existing.second) { + AdapterStat &astat = existing.first; + // TODO(chogan): st_dev and st_ino need to be assigned by us, but + // currently we get them by calling the real fstat on open. + buf->st_dev = 0; + buf->st_ino = 0; + buf->st_mode = astat.st_mode; + buf->st_nlink = 0; + buf->st_uid = astat.st_uid; + buf->st_gid = astat.st_gid; + buf->st_rdev = 0; + buf->st_size = astat.st_size; + buf->st_blksize = astat.st_blksize; + buf->st_blocks = 0; + buf->st_atime = astat.st_atime; + buf->st_mtime = astat.st_mtime; + buf->st_ctime = astat.st_ctime; + } else { + result = -1; + errno = EBADF; + LOG(ERROR) << "File with descriptor" << fd + << "does not exist in Hermes\n"; + } + } else { + MAP_OR_FAIL(__fxstat); + result = real___fxstat_(version, fd, buf); + } + + return result; +} + int HERMES_DECL(fsync)(int fd) { int ret; if (hermes::adapter::IsTracked(fd)) { diff --git a/adapter/test/data/hermes.conf b/adapter/test/data/hermes.conf index 6c67f6fb1..8f3f394ef 100644 --- a/adapter/test/data/hermes.conf +++ b/adapter/test/data/hermes.conf @@ -29,8 +29,8 @@ metadata_arena_percentage = 0.08; transfer_window_arena_percentage = 0.08; transient_arena_percentage = 0.03; -max_buckets_per_node = 16; -max_vbuckets_per_node = 32; +max_buckets_per_node = 64; +max_vbuckets_per_node = 64; system_view_state_update_interval_ms = 1000; mount_points = {"", "./", "./", "./"}; diff --git a/adapter/test/mpiio/CMakeLists.txt b/adapter/test/mpiio/CMakeLists.txt index 7057837b8..ac038329b 100644 --- a/adapter/test/mpiio/CMakeLists.txt +++ b/adapter/test/mpiio/CMakeLists.txt @@ -14,5 +14,5 @@ add_dependencies(hermes_mpiio_adapter_test hermes_mpiio) add_dependencies(hermes_mpiio_adapter_test hermes_daemon) set_target_properties(hermes_mpiio_adapter_test PROPERTIES COMPILE_FLAGS "-DHERMES_INTERCEPT=1") -mpi_daemon(hermes_mpiio_adapter_test 2 "[synchronicity=async]" "async" 1) -mpi_daemon(hermes_mpiio_adapter_test 2 "[synchronicity=sync]" "sync" 1) \ No newline at end of file +mpi_daemon(hermes_mpiio_adapter_test 8 "[synchronicity=async]" "async" 1) +mpi_daemon(hermes_mpiio_adapter_test 2 "[synchronicity=sync]" "sync" 1) From 81944cb0e0183025f73c3465b152694b3c728bf2 Mon Sep 17 00:00:00 2001 From: Chris Hogan Date: Thu, 9 Dec 2021 15:28:53 -0600 Subject: [PATCH 2/3] Add fstat test --- .../test/posix/posix_adapter_basic_test.cpp | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/adapter/test/posix/posix_adapter_basic_test.cpp b/adapter/test/posix/posix_adapter_basic_test.cpp index 288abe8f3..308917314 100644 --- a/adapter/test/posix/posix_adapter_basic_test.cpp +++ b/adapter/test/posix/posix_adapter_basic_test.cpp @@ -10,6 +10,8 @@ * have access to the file, you may request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +#include + TEST_CASE("Open", "[process=" + std::to_string(info.comm_size) + "]" "[operation=single_open]" @@ -1451,3 +1453,24 @@ TEST_CASE("SingleMixed", "[process=" + std::to_string(info.comm_size) + } posttest(); } + +TEST_CASE("fstat") { + pretest(); + + SECTION("fstat on new file") { + test::test_open(info.new_file.c_str(), O_WRONLY | O_CREAT | O_EXCL, 0600); + REQUIRE(test::fh_orig != -1); + test::test_write(info.write_data.data(), args.request_size); + REQUIRE(test::size_written_orig == args.request_size); + + struct stat buf = {}; + int result = fstat(test::fh_orig, &buf); + REQUIRE(result == 0); + REQUIRE(buf.st_size == (off_t)test::size_written_orig); + + test::test_close(); + REQUIRE(test::status_orig == 0); + } + + posttest(); +} From 6af9b53ecc4676083610ea82b8a4dc0c257ae1f6 Mon Sep 17 00:00:00 2001 From: Chris Hogan Date: Thu, 9 Dec 2021 15:54:33 -0600 Subject: [PATCH 3/3] Revert test code --- adapter/src/hermes/adapter/posix/metadata_manager.h | 5 ----- adapter/test/data/hermes.conf | 4 ++-- adapter/test/mpiio/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/adapter/src/hermes/adapter/posix/metadata_manager.h b/adapter/src/hermes/adapter/posix/metadata_manager.h index 8d08741e4..05e91c155 100644 --- a/adapter/src/hermes/adapter/posix/metadata_manager.h +++ b/adapter/src/hermes/adapter/posix/metadata_manager.h @@ -163,11 +163,6 @@ class MetadataManager { * The bool in pair indicated whether metadata entry exists. */ std::pair Find(int fh); - - /** - * Return the FileID associated with the file descriptor @p fd - */ - FileID GetFileId(int fd); }; } // namespace hermes::adapter::posix diff --git a/adapter/test/data/hermes.conf b/adapter/test/data/hermes.conf index 8f3f394ef..6c67f6fb1 100644 --- a/adapter/test/data/hermes.conf +++ b/adapter/test/data/hermes.conf @@ -29,8 +29,8 @@ metadata_arena_percentage = 0.08; transfer_window_arena_percentage = 0.08; transient_arena_percentage = 0.03; -max_buckets_per_node = 64; -max_vbuckets_per_node = 64; +max_buckets_per_node = 16; +max_vbuckets_per_node = 32; system_view_state_update_interval_ms = 1000; mount_points = {"", "./", "./", "./"}; diff --git a/adapter/test/mpiio/CMakeLists.txt b/adapter/test/mpiio/CMakeLists.txt index ac038329b..182e4cfc2 100644 --- a/adapter/test/mpiio/CMakeLists.txt +++ b/adapter/test/mpiio/CMakeLists.txt @@ -14,5 +14,5 @@ add_dependencies(hermes_mpiio_adapter_test hermes_mpiio) add_dependencies(hermes_mpiio_adapter_test hermes_daemon) set_target_properties(hermes_mpiio_adapter_test PROPERTIES COMPILE_FLAGS "-DHERMES_INTERCEPT=1") -mpi_daemon(hermes_mpiio_adapter_test 8 "[synchronicity=async]" "async" 1) +mpi_daemon(hermes_mpiio_adapter_test 2 "[synchronicity=async]" "async" 1) mpi_daemon(hermes_mpiio_adapter_test 2 "[synchronicity=sync]" "sync" 1)