From: Yan, Zheng Date: Thu, 3 Aug 2017 03:11:08 +0000 (+0800) Subject: mds: cleanup snaprealm past parents open check X-Git-Tag: v13.1.0~413^2~29 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=471046f449e5e5b7e3e6faf4e5686b9a0ccdb3cb;p=ceph.git mds: cleanup snaprealm past parents open check For new format snaprealm, there is no need to open past parent, SnapRealm::have_past_parents_open() always return true, In multimds setup, mds may use snaprealm whithout opening past parents. So the assertion in SnapRealm::check_cache() is wrong. Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 9a703d9c5e37..c55df5c7a17b 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -7943,7 +7943,7 @@ int MDCache::path_traverse(MDRequestRef& mdr, Message *req, MDSInternalContextBa return -ESTALE; // make sure snaprealm are open... - if (mdr && cur->snaprealm && !cur->snaprealm->is_open() && + if (mdr && cur->snaprealm && !cur->snaprealm->have_past_parents_open() && !cur->snaprealm->open_parents(_get_waiter(mdr, req, fin))) { return 1; } @@ -8109,7 +8109,7 @@ int MDCache::path_traverse(MDRequestRef& mdr, Message *req, MDSInternalContextBa cur = in; // make sure snaprealm are open... - if (mdr && cur->snaprealm && !cur->snaprealm->is_open() && + if (mdr && cur->snaprealm && !cur->snaprealm->have_past_parents_open() && !cur->snaprealm->open_parents(_get_waiter(mdr, req, fin))) { return 1; } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 1002bfc600e8..cfd89fcfe04e 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3095,7 +3095,7 @@ void Server::handle_client_lookup_ino(MDRequestRef& mdr, return; } - if (mdr && in->snaprealm && !in->snaprealm->is_open() && + if (mdr && in->snaprealm && !in->snaprealm->have_past_parents_open() && !in->snaprealm->open_parents(new C_MDS_RetryRequest(mdcache, mdr))) { return; } diff --git a/src/mds/SnapRealm.cc b/src/mds/SnapRealm.cc index 4b7f7075daf7..b705a29f3de3 100644 --- a/src/mds/SnapRealm.cc +++ b/src/mds/SnapRealm.cc @@ -187,7 +187,7 @@ bool SnapRealm::open_parents(MDSInternalContextBase *retryorfinish) { return true; } -bool SnapRealm::have_past_parents_open(snapid_t first, snapid_t last) +bool SnapRealm::have_past_parents_open(snapid_t first, snapid_t last) const { dout(10) << "have_past_parents_open [" << first << "," << last << "]" << dendl; if (open) @@ -196,18 +196,19 @@ bool SnapRealm::have_past_parents_open(snapid_t first, snapid_t last) if (!srnode.past_parent_snaps.empty()) assert(mdcache->mds->snapclient->get_cached_version() > 0); - for (map::iterator p = srnode.past_parents.lower_bound(first); + for (auto p = srnode.past_parents.lower_bound(first); p != srnode.past_parents.end(); ++p) { if (p->second.first > last) break; dout(10) << " past parent [" << p->second.first << "," << p->first << "] was " << p->second.ino << dendl; - if (open_past_parents.count(p->second.ino) == 0) { + auto q = open_past_parents.find(p->second.ino); + if (q == open_past_parents.end()) { dout(10) << " past parent " << p->second.ino << " is not open" << dendl; return false; } - SnapRealm *parent_realm = open_past_parents[p->second.ino].first; + SnapRealm *parent_realm = q->second.first; if (!parent_realm->have_past_parents_open(std::max(first, p->second.first), std::min(last, p->first))) return false; @@ -282,7 +283,7 @@ void SnapRealm::build_snap_set(set &s, void SnapRealm::check_cache() const { - assert(open); + assert(have_past_parents_open()); uint64_t destroy_seq = mdcache->mds->snapclient->get_destroy_seq(); if (cached_seq >= srnode.seq && cached_destroy_seq == destroy_seq) @@ -632,7 +633,6 @@ void SnapRealm::prune_past_parents() { dout(10) << "prune_past_parents" << dendl; check_cache(); - assert(open); // convert past_parents to past_parent_snaps if (!srnode.past_parents.empty()) { diff --git a/src/mds/SnapRealm.h b/src/mds/SnapRealm.h index cbbe6abb460d..5799808fa379 100644 --- a/src/mds/SnapRealm.h +++ b/src/mds/SnapRealm.h @@ -46,15 +46,13 @@ public: MDCache *mdcache; CInode *inode; - bool open; // set to true once all past_parents are opened + mutable bool open; // set to true once all past_parents are opened SnapRealm *parent; set open_children; // active children that are currently open set open_past_children; // past children who has pinned me map > > open_past_parents; // these are explicitly pinned. unsigned num_open_past_parents; - - elist inodes_with_caps; // for efficient realm splits map* > client_caps; // to identify clients who need snap notifications @@ -77,12 +75,11 @@ public: return false; } - bool is_open() const { return open; } void _close_parents() { open = false; } bool _open_parents(MDSInternalContextBase *retryorfinish, snapid_t first=1, snapid_t last=CEPH_NOSNAP); bool open_parents(MDSInternalContextBase *retryorfinish); void _remove_missing_parent(snapid_t snapid, inodeno_t parent, int err); - bool have_past_parents_open(snapid_t first=1, snapid_t last=CEPH_NOSNAP); + bool have_past_parents_open(snapid_t first=1, snapid_t last=CEPH_NOSNAP) const; void add_open_past_parent(SnapRealm *parent, snapid_t last); void remove_open_past_parent(inodeno_t ino, snapid_t last); void close_parents();