]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: add `--lifetime` parameter to the `lock path` asok command
authorLeonid Usov <leonid.usov@ibm.com>
Wed, 22 May 2024 08:00:13 +0000 (11:00 +0300)
committerLeonid Usov <leonid.usov@ibm.com>
Sun, 26 May 2024 08:33:52 +0000 (11:33 +0300)
Signed-off-by: Leonid Usov <leonid.usov@ibm.com>
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/MDSDaemon.cc
src/mds/MDSRank.cc

index 291c08768b70a33be8e85702f3e5bee46582ffac..a96a2a03e4908e57c715dc6b6bd73323750822ac 100644 (file)
@@ -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::function<void(MDRequ
     });
   }
   mdr->internal_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;
 }
index feda66729970dea520fe4401687fd82f6097a9b5..2a3397cbd9d13df7f35855a6187dada6a3d67888 100644 (file)
@@ -627,8 +627,10 @@ private:
   void add_quiesce(CInode* parent, CInode* in);
 
   struct LockPathConfig {
+    using Lifetime = std::chrono::milliseconds;
     filepath fpath;
     std::vector<std::string> locks;
+    std::optional<Lifetime> lifetime;
     bool ap_dont_block = false;
     bool ap_freeze = false;
   };
index 8fb1109b8caa2ba7ed0de6a228eed21164e44b22..6b0f975e6659cabaffea25e7b84bb8d40405f1fa 100644 (file)
@@ -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);
index 6b2cc31e96037183b7d7c996933c2becb6a1727c..cd49ce68a729ae11427905878f9072ec98d975e0 100644 (file)
@@ -3531,6 +3531,10 @@ void MDSRank::command_lock_path(Formatter* f, const cmdmap_t& cmdmap, std::funct
   config.ap_dont_block = cmd_getval_or<bool>(cmdmap, "ap_dont_block", false);
   config.ap_freeze = cmd_getval_or<bool>(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<MDCache::LockPathConfig::Lifetime>(std::chrono::duration<double>(lifetime));
+  }
   bool await = cmd_getval_or<bool>(cmdmap, "await", false);
 
   auto respond = [f, on_finish=std::move(on_finish)](MDRequestRef const& req) {