From: Erqi Chen Date: Fri, 30 Aug 2019 08:02:03 +0000 (+0800) Subject: mds: use set to store to evict client X-Git-Tag: v15.1.0~1534^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f4afb43f3649161516f2350df9fd1d918b13736b;p=ceph.git mds: use set to store to evict client 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 --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 910b048a007..805c645dbc2 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -3686,15 +3686,15 @@ bool Locker::any_late_revoking_caps(xlist const &revoking, } } -std::vector Locker::get_late_revoking_clients(double timeout) const +std::set Locker::get_late_revoking_clients(double timeout) const { - std::vector result; + std::set 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 { diff --git a/src/mds/Locker.h b/src/mds/Locker.h index f1e867a5096..ee704dbf6ae 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -181,7 +181,7 @@ public: void remove_client_cap(CInode *in, Capability *cap, bool kill=false); - std::vector get_late_revoking_clients(double timeout) const; + std::set get_late_revoking_clients(double timeout) const; private: bool any_late_revoking_caps(xlist const &revoking, double timeout) const;