@@ -72,7 +72,9 @@ class LockerLogContext : public MDSLogContextBase {
7272};
7373
7474Locker::Locker (MDSRank *m, MDCache *c) :
75- need_snapflush_inodes(member_offset(CInode, item_to_flush)), mds(m), mdcache(c) {}
75+ revoking_caps(member_offset(Capability, item_revoking_caps)),
76+ need_snapflush_inodes(member_offset(CInode, item_to_flush)),
77+ mds(m), mdcache(c) {}
7678
7779
7880void Locker::dispatch (const cref_t <Message> &m)
@@ -2629,9 +2631,11 @@ int Locker::issue_caps(CInode *in, Capability *only_cap)
26292631
26302632 int op = (before & ~after) ? CEPH_CAP_OP_REVOKE : CEPH_CAP_OP_GRANT;
26312633 if (op == CEPH_CAP_OP_REVOKE) {
2632- if (mds->logger ) mds->logger ->inc (l_mdss_ceph_cap_op_revoke);
2634+ if (mds->logger ) mds->logger ->inc (l_mdss_ceph_cap_op_revoke);
26332635 revoking_caps.push_back (&cap->item_revoking_caps );
2634- revoking_caps_by_client[cap->get_client ()].push_back (&cap->item_client_revoking_caps );
2636+ auto em = revoking_caps_by_client.emplace (cap->get_client (),
2637+ member_offset (Capability, item_client_revoking_caps));
2638+ em.first ->second .push_back (&cap->item_client_revoking_caps );
26352639 cap->set_last_revoke_stamp (ceph_clock_now ());
26362640 cap->reset_num_revoke_warnings ();
26372641 } else {
@@ -2670,7 +2674,7 @@ void Locker::issue_truncate(CInode *in)
26702674 cap->get_mseq (),
26712675 mds->get_osd_epoch_barrier ());
26722676 in->encode_cap_message (m, cap);
2673- mds->send_message_client_counted (m, p. first );
2677+ mds->send_message_client_counted (m, cap-> get_session () );
26742678 }
26752679
26762680 // should we increase max_size?
@@ -3160,7 +3164,7 @@ void Locker::share_inode_max_size(CInode *in, Capability *only_cap)
31603164 cap->get_mseq (),
31613165 mds->get_osd_epoch_barrier ());
31623166 in->encode_cap_message (m, cap);
3163- mds->send_message_client_counted (m, client );
3167+ mds->send_message_client_counted (m, cap-> get_session () );
31643168 }
31653169 if (only_cap)
31663170 break ;
@@ -4311,42 +4315,33 @@ void Locker::remove_client_cap(CInode *in, Capability *cap, bool kill)
43114315 try_eval (in, CEPH_CAP_LOCKS);
43124316}
43134317
4314-
4315- /* *
4316- * Return true if any currently revoking caps exceed the
4317- * session_timeout threshold.
4318- */
4319- bool Locker::any_late_revoking_caps (xlist<Capability*> const &revoking,
4320- double timeout) const
4318+ std::set<client_t > Locker::get_late_revoking_clients (double timeout)
43214319{
4322- xlist<Capability*>::const_iterator p = revoking.begin ();
4323- if (p.end ()) {
4320+ auto any_late_revoking = [timeout](elist<Capability*> &revoking) {
4321+ auto p = revoking.begin ();
4322+ if (p.end ())
43244323 // No revoking caps at the moment
43254324 return false ;
4326- } else {
4327- utime_t now = ceph_clock_now ();
4328- utime_t age = now - (*p)->get_last_revoke_stamp ();
4329- if (age <= timeout) {
4330- return false ;
4331- } else {
4332- return true ;
4333- }
4334- }
4335- }
43364325
4337- std::set< client_t > Locker::get_late_revoking_clients ( double timeout) const
4338- {
4339- std::set< client_t > result ;
4326+ utime_t now = ceph_clock_now ();
4327+ return now - (*p)-> get_last_revoke_stamp () > timeout;
4328+ } ;
43404329
4341- if (any_late_revoking_caps (revoking_caps, timeout)) {
4330+ std::set<client_t > result;
4331+ if (!any_late_revoking (revoking_caps)) {
4332+ // Fast path: no misbehaving clients, execute in O(1)
4333+ } else {
43424334 // Slow path: execute in O(N_clients)
4343- for (auto &p : revoking_caps_by_client) {
4344- if (any_late_revoking_caps (p.second , timeout)) {
4345- result.insert (p.first );
4335+ for (auto it = revoking_caps_by_client.begin ();
4336+ it != revoking_caps_by_client.end (); ) {
4337+ if (it->second .empty ()) {
4338+ revoking_caps_by_client.erase (it++);
4339+ continue ;
43464340 }
4341+ if (any_late_revoking (it->second ))
4342+ result.insert (it->first );
4343+ ++it;
43474344 }
4348- } else {
4349- // Fast path: no misbehaving clients, execute in O(1)
43504345 }
43514346 return result;
43524347}
@@ -4378,11 +4373,10 @@ void Locker::caps_tick()
43784373 }
43794374 }
43804375
4381- dout (20 ) << __func__ << " " << revoking_caps.size () << " revoking caps" << dendl;
43824376
43834377 now = ceph_clock_now ();
43844378 int n = 0 ;
4385- for (xlist<Capability*>::iterator p = revoking_caps.begin (); !p.end (); ++p) {
4379+ for (auto p = revoking_caps.begin (); !p.end (); ++p) {
43864380 Capability *cap = *p;
43874381
43884382 utime_t age = now - cap->get_last_revoke_stamp ();
@@ -4508,7 +4502,7 @@ void Locker::issue_client_lease(CDentry *dn, CInode *in, const MDRequestRef& mdr
45084502 ceph_assert (!in);
45094503 }
45104504 // issue a dentry lease
4511- ClientLease *l = dn->add_client_lease (client, session);
4505+ ClientLease *l = dn->add_client_lease (session);
45124506 session->touch_lease (l);
45134507
45144508 int pool = 1 ; // fixme.. do something smart!
@@ -4537,20 +4531,17 @@ void Locker::issue_client_lease(CDentry *dn, CInode *in, const MDRequestRef& mdr
45374531void Locker::revoke_client_leases (SimpleLock *lock)
45384532{
45394533 CDentry *dn = static_cast <CDentry*>(lock->get_parent ());
4540- for (map<client_t , ClientLease*>::iterator p = dn->client_lease_map .begin ();
4541- p != dn->client_lease_map .end ();
4542- ++p) {
4543- ClientLease *l = p->second ;
4544-
4534+ for (ClientLease& l : dn->client_leases ) {
4535+
45454536 ceph_assert (lock->get_type () == CEPH_LOCK_DN);
45464537
45474538 CDentry *dn = static_cast <CDentry*>(lock->get_parent ());
45484539 int mask = 1 | CEPH_LOCK_DN; // old and new bits
45494540
45504541 // i should also revoke the dir ICONTENT lease, if they have it!
45514542 CInode *diri = dn->get_dir ()->get_inode ();
4552- auto lease = make_message<MClientLease>(CEPH_MDS_LEASE_REVOKE, l-> seq , mask, diri->ino (), diri->first , CEPH_NOSNAP, dn->get_name ());
4553- mds->send_message_client_counted (lease, l-> client );
4543+ auto lease = make_message<MClientLease>(CEPH_MDS_LEASE_REVOKE, l. seq , mask, diri->ino (), diri->first , CEPH_NOSNAP, dn->get_name ());
4544+ mds->send_message_client_counted (lease, l. session );
45544545 }
45554546}
45564547
0 commit comments