]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: require filter for client/session evict command
authorneeraj pratap singh <neerajpratapsingh@li-ff7f0d4c-3462-11b2-a85c-d4004c0fa1a0.ibm.com>
Tue, 7 Nov 2023 10:44:54 +0000 (16:14 +0530)
committerneeraj pratap singh <neerajpratapsingh@li-ff7f0d4c-3462-11b2-a85c-d4004c0fa1a0.ibm.com>
Mon, 22 Jul 2024 15:22:34 +0000 (20:52 +0530)
This commit fixes the issues in client/session evict command
using below solutions:
(1) client evict without filter is forbidden
(2) SessionFilter::parse is modified to support id=* (id=0 is not allowed)
(3) Invalid id error is handled
User can use client evict id=* to evict all clients.

Fixes: https://tracker.ceph.com/issues/58619
Signed-off-by: Neeraj Pratap Singh <neesingh@redhat.com>
(cherry picked from commit 0ef5941a2e79feeae79a705080b57d410fa38136)

src/mds/MDSDaemon.cc
src/mds/MDSRank.cc
src/mds/SessionMap.cc

index 126a9a668e1682b64b97bbb7e789ce9a621559d3..84880f3b0499a82626c12de83d5f2802a080aae2 100644 (file)
@@ -362,11 +362,11 @@ void MDSDaemon::set_up_admin_socket()
                                     asok_hook,
                                     "List client sessions based on a filter");
   ceph_assert(r == 0);
-  r = admin_socket->register_command("session evict name=filters,type=CephString,n=N,req=false",
+  r = admin_socket->register_command("session evict name=filters,type=CephString,n=N,req=true",
                                     asok_hook,
                                     "Evict client session(s) based on a filter");
   ceph_assert(r == 0);
-  r = admin_socket->register_command("client evict name=filters,type=CephString,n=N,req=false",
+  r = admin_socket->register_command("client evict name=filters,type=CephString,n=N,req=true",
                                     asok_hook,
                                     "Evict client session(s) based on a filter");
   ceph_assert(r == 0);
index a3adb19936335f12580b8d75f1b250efbe394259..d303c76dc15ba0b6fc372d9c196ba208f1c2ccc2 100644 (file)
@@ -2960,7 +2960,7 @@ void MDSRankDispatcher::evict_clients(
   dout(20) << __func__ << " matched " << victims.size() << " sessions" << dendl;
 
   if (victims.empty()) {
-    on_finish(0, {}, outbl);
+    on_finish(-ESRCH, "no hosts match", outbl);
     return;
   }
 
index 9cc2b013847e276e6ed0e72034523d92adf4c781..dcd7a318f40d83e54a7fca4a54ce30e3f1b32db5 100644 (file)
@@ -1216,6 +1216,13 @@ int SessionFilter::parse(
       state = v;
     } else if (k == "id") {
       std::string err;
+      if (v == "*") {
+        // evict all clients , by default id set to 0
+        return 0;
+      } else if (v == "0") {
+        *ss << "Invalid value";
+        return -CEPHFS_EINVAL;
+      }
       id = strict_strtoll(v.c_str(), 10, &err);
       if (!err.empty()) {
         *ss << err;