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;
}
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;
}
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;
}
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)
if (!srnode.past_parent_snaps.empty())
assert(mdcache->mds->snapclient->get_cached_version() > 0);
- for (map<snapid_t, snaplink_t>::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;
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)
{
dout(10) << "prune_past_parents" << dendl;
check_cache();
- assert(open);
// convert past_parents to past_parent_snaps
if (!srnode.past_parents.empty()) {
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<SnapRealm*> open_children; // active children that are currently open
set<SnapRealm*> open_past_children; // past children who has pinned me
map<inodeno_t, pair<SnapRealm*, set<snapid_t> > > open_past_parents; // these are explicitly pinned.
unsigned num_open_past_parents;
-
-
elist<CInode*> inodes_with_caps; // for efficient realm splits
map<client_t, xlist<Capability*>* > client_caps; // to identify clients who need snap notifications
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();