From 779f54cce9130ac41dcebed72936a1c5cc593704 Mon Sep 17 00:00:00 2001 From: Julius Athenstaedt Date: Wed, 20 Dec 2023 14:11:28 +0100 Subject: [PATCH 1/2] mtime and ctime update on rocksdb merge --- src/daemon/backend/metadata/merge.cpp | 7 +++++++ tests/integration/status/test_status.py | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/daemon/backend/metadata/merge.cpp b/src/daemon/backend/metadata/merge.cpp index 4f5d134ef..dacec4508 100644 --- a/src/daemon/backend/metadata/merge.cpp +++ b/src/daemon/backend/metadata/merge.cpp @@ -181,6 +181,10 @@ MetadataMergeOperator::FullMergeV2(const MergeOperationInput& merge_in, auto operand_id = MergeOperand::get_id(serialized_op); auto parameters = MergeOperand::get_params(serialized_op); + if constexpr(gkfs::config::metadata::use_mtime) { + md.mtime(std::time(nullptr)); + } + if(operand_id == OperandID::increase_size) { auto op = IncreaseSizeOperand(parameters); if(op.append()) { @@ -199,6 +203,9 @@ MetadataMergeOperator::FullMergeV2(const MergeOperationInput& merge_in, assert(op.size() < fsize); // we assume no concurrency here fsize = op.size(); } else if(operand_id == OperandID::create) { + if constexpr(gkfs::config::metadata::use_ctime) { + md.ctime(std::time(nullptr)); + } continue; } else { throw ::runtime_error("Unrecognized merge operand ID: " + diff --git a/tests/integration/status/test_status.py b/tests/integration/status/test_status.py index df75b855f..96dd43c22 100644 --- a/tests/integration/status/test_status.py +++ b/tests/integration/status/test_status.py @@ -36,6 +36,7 @@ import sh import sys import pytest from harness.logger import logger +from datetime import datetime nonexisting = "nonexisting" @@ -52,6 +53,11 @@ def test_statx(gkfs_daemon, gkfs_client): file_a = topdir / "file_a" subdir_a = dir_a / "subdir_a" + # creation timestamp + # it is only checked if mtime and ctime are greater than + # the creation timestamp due to inprecesion between test and daemon + ts = int(datetime.timestamp(datetime.now())) + # create topdir ret = gkfs_client.mkdir( topdir, @@ -91,6 +97,13 @@ def test_statx(gkfs_daemon, gkfs_client): assert ret.retval == 0 assert (ret.statbuf.stx_size == 2) + # if greater zero, it is activated in config.hpp + if ret.statbuf.stx_mtime.tv_sec > 0: + assert (ret.statbuf.stx_mtime.tv_sec > ts) + + if ret.statbuf.stx_ctime.tv_sec > 0: + assert (ret.statbuf.stx_ctime.tv_sec > ts) + return -- GitLab From 6c68de44d90172f73eeb6f6e44dfea913195b3f3 Mon Sep 17 00:00:00 2001 From: Marc Vef Date: Wed, 31 Jan 2024 17:08:08 +0100 Subject: [PATCH 2/2] Review and remove dead code --- include/common/metadata.hpp | 7 +++-- src/common/metadata.cpp | 41 +++++++++++++++------------ src/daemon/backend/metadata/merge.cpp | 5 +--- src/daemon/ops/metadentry.cpp | 2 +- 4 files changed, 30 insertions(+), 25 deletions(-) diff --git a/include/common/metadata.hpp b/include/common/metadata.hpp index d64f94921..9121f10c5 100644 --- a/include/common/metadata.hpp +++ b/include/common/metadata.hpp @@ -64,6 +64,8 @@ private: #endif #endif + void + init_time(); public: Metadata() = default; @@ -82,11 +84,12 @@ public: std::string serialize() const; + // currently unused void - init_ACM_time(); + update_atime_now(); void - update_ACM_time(bool a, bool c, bool m); + update_mtime_now(); // Getter and Setter time_t diff --git a/src/common/metadata.cpp b/src/common/metadata.cpp index 26f60ced5..dc725f7a8 100644 --- a/src/common/metadata.cpp +++ b/src/common/metadata.cpp @@ -69,22 +69,36 @@ gen_unique_id(const std::string& path) { return static_cast(hash_value & 0xFFFF); } +inline void +Metadata::init_time() { + if constexpr(gkfs::config::metadata::use_ctime) { + ctime_ = std::time(nullptr); + } + if constexpr(gkfs::config::metadata::use_mtime) { + mtime_ = std::time(nullptr); + } + if constexpr(gkfs::config::metadata::use_atime) { + atime_ = std::time(nullptr); + } +} + Metadata::Metadata(const mode_t mode) - : atime_(), mtime_(), ctime_(), mode_(mode), link_count_(0), size_(0), - blocks_(0) { + : mode_(mode), link_count_(0), size_(0), blocks_(0) { assert(S_ISDIR(mode_) || S_ISREG(mode_)); + init_time(); } #ifdef HAS_SYMLINKS Metadata::Metadata(const mode_t mode, const std::string& target_path) - : atime_(), mtime_(), ctime_(), mode_(mode), link_count_(0), size_(0), - blocks_(0), target_path_(target_path) { + : mode_(mode), link_count_(0), size_(0), blocks_(0), + target_path_(target_path) { assert(S_ISLNK(mode_) || S_ISDIR(mode_) || S_ISREG(mode_)); // target_path should be there only if this is a link assert(target_path_.empty() || S_ISLNK(mode_)); // target_path should be absolute assert(target_path_.empty() || target_path_[0] == '/'); + init_time(); } #endif @@ -205,24 +219,15 @@ Metadata::serialize() const { } void -Metadata::init_ACM_time() { - std::time_t time; - std::time(&time); +Metadata::update_atime_now() { + auto time = std::time(nullptr); atime_ = time; - mtime_ = time; - ctime_ = time; } void -Metadata::update_ACM_time(bool a, bool c, bool m) { - std::time_t time; - std::time(&time); - if(a) - atime_ = time; - if(c) - ctime_ = time; - if(m) - mtime_ = time; +Metadata::update_mtime_now() { + auto time = std::time(nullptr); + mtime_ = time; } //-------------------------------------------- GETTER/SETTER diff --git a/src/daemon/backend/metadata/merge.cpp b/src/daemon/backend/metadata/merge.cpp index dacec4508..67cd80cd9 100644 --- a/src/daemon/backend/metadata/merge.cpp +++ b/src/daemon/backend/metadata/merge.cpp @@ -182,7 +182,7 @@ MetadataMergeOperator::FullMergeV2(const MergeOperationInput& merge_in, auto parameters = MergeOperand::get_params(serialized_op); if constexpr(gkfs::config::metadata::use_mtime) { - md.mtime(std::time(nullptr)); + md.update_mtime_now(); } if(operand_id == OperandID::increase_size) { @@ -203,9 +203,6 @@ MetadataMergeOperator::FullMergeV2(const MergeOperationInput& merge_in, assert(op.size() < fsize); // we assume no concurrency here fsize = op.size(); } else if(operand_id == OperandID::create) { - if constexpr(gkfs::config::metadata::use_ctime) { - md.ctime(std::time(nullptr)); - } continue; } else { throw ::runtime_error("Unrecognized merge operand ID: " + diff --git a/src/daemon/ops/metadentry.cpp b/src/daemon/ops/metadentry.cpp index c456ed4a9..17f470fc1 100644 --- a/src/daemon/ops/metadentry.cpp +++ b/src/daemon/ops/metadentry.cpp @@ -76,7 +76,7 @@ create(const std::string& path, Metadata& md) { if(GKFS_DATA->ctime_state()) md.ctime(time); } - if(gkfs::config::metadata::create_exist_check) { + if constexpr(gkfs::config::metadata::create_exist_check) { GKFS_DATA->mdb()->put_no_exist(path, md.serialize()); } else { GKFS_DATA->mdb()->put(path, md.serialize()); -- GitLab