]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
squid: 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>
Tue, 28 May 2024 19:00:08 +0000 (22:00 +0300)
Signed-off-by: Leonid Usov <leonid.usov@ibm.com>
(cherry picked from commit c395c78e09f9b41088801dcea1fab1cd10b0ba00)
Fixes: https://tracker.ceph.com/issues/66258
src/mds/MDCache.cc
src/mds/MDCache.h
src/mds/MDSDaemon.cc
src/mds/MDSRank.cc

index 690db14d9405422057f2c570d19d16bced33a9b0..dce21f26bd8f468d213e5d25d84d54869f34177f 100644 (file)
@@ -9953,8 +9953,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());
@@ -14035,6 +14040,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 c1711386872a23bc4da02ab73f01c3955fd297e1..ab1dee684c981ae520c5519f2922f943b33366ae 100644 (file)
@@ -625,8 +625,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 1a9af6786f35d2653e5118de9916a3a399b6d647..2e0009d55cbeb755d76c89d264f4259bac09b013 100644 (file)
@@ -3532,6 +3532,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) {