]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: use set to store to evict client 30029/head
authorErqi Chen <chenerqi@gmail.com>
Fri, 30 Aug 2019 08:02:03 +0000 (16:02 +0800)
committerErqi Chen <chenerqi@gmail.com>
Fri, 30 Aug 2019 08:02:03 +0000 (16:02 +0800)
client is put to to_evict vector more than once if client does't
response more than one caps revoke, it may cause session hang
if session opening is aborted by next evict, use set structure
to keep to evict client unique.

Fixes: https://tracker.ceph.com/issues/41585
Signed-off-by: Erqi Chen <chenerqi@gmail.com>
src/mds/Locker.cc
src/mds/Locker.h

index 910b048a007b74ae7df1da776b1adb738f0ec827..805c645dbc217130ff96a871374baa551d5ef099 100644 (file)
@@ -3686,15 +3686,15 @@ bool Locker::any_late_revoking_caps(xlist<Capability*> const &revoking,
     }
 }
 
-std::vector<client_t> Locker::get_late_revoking_clients(double timeout) const
+std::set<client_t> Locker::get_late_revoking_clients(double timeout) const
 {
-  std::vector<client_t> result;
+  std::set<client_t> result;
 
   if (any_late_revoking_caps(revoking_caps, timeout)) {
     // Slow path: execute in O(N_clients)
     for (auto &p : revoking_caps_by_client) {
       if (any_late_revoking_caps(p.second, timeout)) {
-        result.push_back(p.first);
+        result.insert(p.first);
       }
     }
   } else {
index f1e867a509627c7dfa04772ad65218da74b16a72..ee704dbf6ae411662b49d2ac1ce46efffd35773c 100644 (file)
@@ -181,7 +181,7 @@ public:
 
   void remove_client_cap(CInode *in, Capability *cap, bool kill=false);
 
-  std::vector<client_t> get_late_revoking_clients(double timeout) const;
+  std::set<client_t> get_late_revoking_clients(double timeout) const;
 
 private:
   bool any_late_revoking_caps(xlist<Capability*> const &revoking, double timeout) const;