From: Yan, Zheng Date: Sat, 9 Nov 2013 03:07:27 +0000 (+0800) Subject: mds: avoid issuing caps when inode is frozen X-Git-Tag: v0.75~93^2~26 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=3ac08860d488b92e4f716a2803742bb81cc621dc;p=ceph.git mds: avoid issuing caps when inode is frozen Signed-off-by: Yan, Zheng --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index cded965bcb51..b2e44dbec69e 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -2573,6 +2573,38 @@ void Locker::process_request_cap_release(MDRequest *mdr, client_t client, const mdr->cap_releases[in->vino()] = cap->get_last_seq(); } +class C_Locker_RetryKickIssueCaps : public Context { + Locker *locker; + CInode *in; + client_t client; + ceph_seq_t seq; +public: + C_Locker_RetryKickIssueCaps(Locker *l, CInode *i, client_t c, ceph_seq_t s) : + locker(l), in(i), client(c), seq(s) { + in->get(CInode::PIN_PTRWAITER); + } + void finish(int r) { + locker->kick_issue_caps(in, client, seq); + in->put(CInode::PIN_PTRWAITER); + } +}; + +void Locker::kick_issue_caps(CInode *in, client_t client, ceph_seq_t seq) +{ + Capability *cap = in->get_client_cap(client); + if (!cap || cap->get_last_sent() != seq) + return; + if (in->is_frozen()) { + dout(10) << "kick_issue_caps waiting for unfreeze on " << *in << dendl; + in->add_waiter(CInode::WAIT_UNFREEZE, + new C_Locker_RetryKickIssueCaps(this, in, client, seq)); + return; + } + dout(10) << "kick_issue_caps released at current seq " << seq + << ", reissuing" << dendl; + issue_caps(in, cap); +} + void Locker::kick_cap_releases(MDRequest *mdr) { client_t client = mdr->get_client(); @@ -2582,18 +2614,10 @@ void Locker::kick_cap_releases(MDRequest *mdr) CInode *in = mdcache->get_inode(p->first); if (!in) continue; - Capability *cap = in->get_client_cap(client); - if (!cap) - continue; - if (cap->get_last_sent() == p->second) { - dout(10) << "kick_cap_releases released at current seq " << p->second - << ", reissuing" << dendl; - issue_caps(in, cap); - } + kick_issue_caps(in, client, p->second); } } - static uint64_t calc_bounding(uint64_t t) { t |= t >> 1; diff --git a/src/mds/Locker.h b/src/mds/Locker.h index 0c9931a47345..466f7c92f81b 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -213,6 +213,7 @@ public: const string &dname); void kick_cap_releases(MDRequest *mdr); + void kick_issue_caps(CInode *in, client_t client, ceph_seq_t seq); void remove_client_cap(CInode *in, client_t client);