add_past_parent hack.
Adjusted pop_projected to invalidate caches if needed, and removed
project_past_parent's deletion of projected snaprealm.
Removed add_past_parent.
{
sr_t *new_snap = project_snaprealm();
SnapRealm *oldparent;
- if (!snaprealm)
+ if (!snaprealm) {
oldparent = find_snaprealm();
+ new_snap->seq = oldparent->get_newest_seq();
+ }
else
oldparent = snaprealm->parent;
new_snap->current_parent_since = MAX(oldparentseq, newparent->get_last_created()) + 1;
}
new_snap->encode(snapbl);
- projected_srnode.pop_back();
- delete new_snap;
}
void CInode::pop_projected_snaprealm()
assert(!projected_srnode.empty());
dout(0) << "pop_projected_snaprealm " << projected_srnode.front()
<< " seq" << projected_srnode.front()->seq << dendl;
+ bool invalidate_cached_snaps = false;
if (!snaprealm)
open_snaprealm();
+ else if (projected_srnode.front()->past_parents.size() !=
+ snaprealm->srnode.past_parents.size())
+ invalidate_cached_snaps = true;
snaprealm->srnode = *projected_srnode.front();
delete projected_srnode.front();
projected_srnode.pop_front();
+
+ if (invalidate_cached_snaps)
+ snaprealm->invalidate_cached_snaps();
}
dout(20) << " straydn is " << *straydn << dendl;
straydnl = straydn->pop_projected_linkage();
- SnapRealm *oldparent = dn->get_dir()->inode->find_snaprealm();
-
bool isnew = false;
- if (!straydnl->get_inode()->snaprealm) {
- straydnl->get_inode()->open_snaprealm();
- straydnl->get_inode()->snaprealm->srnode.seq = oldparent->get_newest_seq();
+ if (!straydnl->get_inode()->snaprealm)
isnew = true;
- }
- straydnl->get_inode()->snaprealm->add_past_parent(oldparent);
+ straydnl->get_inode()->pop_projected_snaprealm();
if (isnew)
mdcache->do_realm_invalidate_and_update_notify(straydnl->get_inode(), CEPH_SNAP_OP_SPLIT, true);
straydn->get_dir()->link_primary_inode(straydn, oldin);
if (straydn->is_auth()) {
- SnapRealm *oldparent = destdn->get_dir()->inode->find_snaprealm();
bool isnew = false;
- if (!straydnl->get_inode()->snaprealm) {
- straydnl->get_inode()->open_snaprealm();
- straydnl->get_inode()->snaprealm->srnode.seq = oldparent->get_newest_seq();
+ if (!straydnl->get_inode()->snaprealm)
isnew = true;
- }
- straydnl->get_inode()->snaprealm->add_past_parent(oldparent);
+ straydnl->get_inode()->pop_projected_snaprealm();
if (isnew)
mdcache->do_realm_invalidate_and_update_notify(straydnl->get_inode(), CEPH_SNAP_OP_SPLIT);
}
// snap parent update?
if (destdn->is_auth() && destdnl->get_inode()->snaprealm)
- destdnl->get_inode()->snaprealm->add_past_parent(srcdn->get_dir()->inode->find_snaprealm());
+ destdnl->get_inode()->pop_projected_snaprealm();
}
// src
-void SnapRealm::add_past_parent(SnapRealm *oldparent)
-{
- snapid_t newlast = parent->get_last_created();
- snapid_t oldlast = oldparent->get_newest_seq();
- snapid_t first = srnode.current_parent_since;
-
- if (oldlast >= srnode.current_parent_since) {
- srnode.past_parents[oldlast].ino = oldparent->inode->ino();
- srnode.past_parents[oldlast].first = first;
- add_open_past_parent(oldparent);
- dout(10) << "add_past_parent [" << first << "," << oldlast << "] = "
- << oldparent->inode->ino() << dendl;
- }
- srnode.current_parent_since = MAX(oldlast, newlast) + 1;
- dout(10) << "add_past_parent current_parent_since " << srnode.current_parent_since << dendl;
-
- invalidate_cached_snaps();
-}
-
void SnapRealm::prune_past_parents()
{
dout(10) << "prune_past_parents" << dendl;
void add_open_past_parent(SnapRealm *parent);
void close_parents();
- void add_past_parent(SnapRealm *oldparent);
void prune_past_parents();
bool has_past_parents() { return !srnode.past_parents.empty(); }