From c395c78e09f9b41088801dcea1fab1cd10b0ba00 Mon Sep 17 00:00:00 2001 From: Leonid Usov Date: Wed, 22 May 2024 11:00:13 +0300 Subject: [PATCH] mds: add `--lifetime` parameter to the `lock path` asok command Signed-off-by: Leonid Usov --- src/mds/MDCache.cc | 15 ++++++++++++++- src/mds/MDCache.h | 2 ++ src/mds/MDSDaemon.cc | 1 + src/mds/MDSRank.cc | 4 ++++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 291c08768b70a..a96a2a03e4908 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -9972,8 +9972,13 @@ void MDCache::request_kill(const MDRequestRef& mdr) return; } + // TODO: maybe other internal requests don't care + bool ignore_peer_requests = false + || mdr->internal_op == CEPH_MDS_OP_LOCK_PATH + ; + // rollback peer requests is tricky. just let the request proceed. - if (mdr->has_more() && + if (!ignore_peer_requests && mdr->has_more() && (!mdr->more()->witnessed.empty() || !mdr->more()->waiting_on_peer.empty())) { if (!(mdr->locking_state & MutationImpl::ALL_LOCKED)) { ceph_assert(mdr->more()->witnessed.empty()); @@ -14056,6 +14061,14 @@ MDRequestRef MDCache::lock_path(LockPathConfig config, std::functioninternal_op_private = new LockPathState{std::move(config)}; + if (config.lifetime) { + mds->timer.add_event_after(*config.lifetime, new LambdaContext([this, mdr]() { + if (!mdr->result && !mdr->aborted && !mdr->killed && !mdr->dead) { + mdr->result = -CEPHFS_ECANCELED; + request_kill(mdr); + } + })); + } dispatch_request(mdr); return mdr; } diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index feda66729970d..2a3397cbd9d13 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -627,8 +627,10 @@ private: void add_quiesce(CInode* parent, CInode* in); struct LockPathConfig { + using Lifetime = std::chrono::milliseconds; filepath fpath; std::vector locks; + std::optional lifetime; bool ap_dont_block = false; bool ap_freeze = false; }; diff --git a/src/mds/MDSDaemon.cc b/src/mds/MDSDaemon.cc index 8fb1109b8caa2..6b0f975e6659c 100644 --- a/src/mds/MDSDaemon.cc +++ b/src/mds/MDSDaemon.cc @@ -366,6 +366,7 @@ void MDSDaemon::set_up_admin_socket() " name=ap_dont_block,type=CephBool,req=false" " name=ap_freeze,type=CephBool,req=false" " name=await,type=CephBool,req=false" + " name=lifetime,type=CephFloat,req=false" ,asok_hook ,"lock a path"); ceph_assert(r == 0); diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index 6b2cc31e96037..cd49ce68a729a 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -3531,6 +3531,10 @@ void MDSRank::command_lock_path(Formatter* f, const cmdmap_t& cmdmap, std::funct config.ap_dont_block = cmd_getval_or(cmdmap, "ap_dont_block", false); config.ap_freeze = cmd_getval_or(cmdmap, "ap_freeze", false); config.fpath = filepath(path); + if (double lifetime; cmd_getval(cmdmap, "lifetime", lifetime)) { + using std::chrono::duration_cast; + config.lifetime = duration_cast(std::chrono::duration(lifetime)); + } bool await = cmd_getval_or(cmdmap, "await", false); auto respond = [f, on_finish=std::move(on_finish)](MDRequestRef const& req) { -- 2.39.5