SnapRealm *realm = in->find_snaprealm();
- // is this realm's parents fully open?
+ // are this realm's parents fully open?
if (realm->have_past_parents_open()) {
dout(10) << " have past snap parents for realm " << *realm
<< " on " << *realm->inode << dendl;
send_realm_splits(updates);
+ /*
static int count = 5;
if (--count == 0)
assert(0); // hack test test **********
+ */
// done.
mdr->more()->stid = 0; // caller will likely need to reuse this
// [reconnect/rejoin caps]
map<CInode*,map<int, inodeno_t> > reconnected_caps; // inode -> client -> realmino
- map<inodeno_t,map<int, snapid_t> > reconnected_snaprealms;
+ map<inodeno_t,map<int, snapid_t> > reconnected_snaprealms; // realmino -> client -> realmseq
void add_reconnected_cap(CInode *in, int client, inodeno_t realm) {
reconnected_caps[in][client] = realm;
CInode *in = mdcache->get_inode(p->first);
if (in) {
assert(in->snaprealm);
- if (in->snaprealm->have_past_parents_open())
+ if (in->snaprealm->have_past_parents_open()) {
+ dout(15) << "open snaprealm (w/ past parents) on " << *in << dendl;
mdcache->finish_snaprealm_reconnect(from, in->snaprealm, snapid_t(p->second.seq));
- else
+ } else {
+ dout(15) << "open snaprealm (w/o past parents) on " << *in << dendl;
mdcache->add_reconnected_snaprealm(from, p->first, snapid_t(p->second.seq));
+ }
} else {
+ dout(15) << "open snaprealm (w/o inode) on " << p->first
+ << " seq " << p->second.seq << dendl;
mdcache->add_reconnected_snaprealm(from, p->first, snapid_t(p->second.seq));
}
}
CInode *in = mdcache->get_inode(p->first);
if (in && in->is_auth()) {
// we recovered it, and it's ours. take note.
- dout(15) << "open caps on " << *in << dendl;
+ dout(15) << "open cap realm " << inodeno_t(p->second.capinfo.snaprealm)
+ << " on " << *in << dendl;
Capability *cap = in->reconnect_cap(from, p->second.capinfo);
session->touch_cap(cap);
mds->mdcache->add_reconnected_cap(in, from, inodeno_t(p->second.capinfo.snaprealm));
assert(dn->last == p->dnlast);
}
+ bool do_snap_split = false;
CInode *in = mds->mdcache->get_inode(p->inode.ino, p->dnlast);
if (!in) {
in = new CInode(mds->mdcache, true, p->dnfirst, p->dnlast);
if (in->inode.is_dir()) {
in->dirfragtree = p->dirfragtree;
in->decode_snap_blob(p->snapbl);
+ if (in->snaprealm)
+ do_snap_split = true;
}
if (in->inode.is_symlink()) in->symlink = p->symlink;
mds->mdcache->add_inode(in);
in->xattrs = p->xattrs;
if (in->inode.is_dir()) {
in->dirfragtree = p->dirfragtree;
+ bool had = in->snaprealm ? true:false;
in->decode_snap_blob(p->snapbl);
+ if (!had && in->snaprealm)
+ do_snap_split = true;
}
if (in->inode.is_symlink()) in->symlink = p->symlink;
if (p->dirty) in->_mark_dirty(logseg);
dout(10) << "EMetaBlob.replay for [" << p->dnfirst << "," << p->dnlast << "] had " << *in << dendl;
}
in->first = p->dnfirst;
- }
- // verify open snaprealm parents
- if (in->snaprealm) {
- SnapRealm *actual = in->get_parent_dn()->get_dir()->inode->find_snaprealm();
- if (actual != in->snaprealm->parent) {
- dout(10) << "EMetaBlob.replay fixing snaprealm open_parent" << dendl;
- in->snaprealm->change_open_parent_to(actual);
+ // verify open snaprealm parent
+ if (in->snaprealm) {
+ SnapRealm *actual = in->get_parent_dn()->get_dir()->inode->find_snaprealm();
+ if (actual != in->snaprealm->parent) {
+ dout(10) << "EMetaBlob.replay fixing snaprealm open parent" << dendl;
+ in->snaprealm->change_open_parent_to(actual);
+ }
}
}
+
+ if (do_snap_split && in->snaprealm) {
+ dout(10) << "EMetaBlob.reply splitting snaprealm" << dendl;
+ in->snaprealm->parent->split_at(in->snaprealm);
+ }
+
}
// remote dentries
<< ".cache.snaprealm(" << inode->ino() \
<< " seq " << seq << " " << this << ") "
+ostream& operator<<(ostream& out, const SnapRealm& realm)
+{
+ out << "snaprealm(" << realm.inode->ino()
+ << " seq " << realm.seq
+ << " lc " << realm.last_created
+ << " snaps=" << realm.snaps;
+ if (realm.past_parents.size()) {
+ out << " past_parents=(";
+ for (map<snapid_t, snaplink_t>::const_iterator p = realm.past_parents.begin();
+ p != realm.past_parents.end();
+ p++) {
+ if (p != realm.past_parents.begin()) out << ",";
+ out << p->second.first << "-" << p->first
+ << "=" << p->second.ino;
+ }
+ out << ")";
+ }
+ out << " " << &realm << ")";
+ return out;
+}
+
+
+
+
void SnapRealm::add_open_past_parent(SnapRealm *parent)
{
open_past_parents[parent->inode->ino()] = parent;
};
WRITE_CLASS_ENCODER(SnapRealm)
-inline ostream& operator<<(ostream& out, const SnapRealm &realm) {
- out << "snaprealm(seq " << realm.seq
- << " lc " << realm.last_created
- << " snaps=" << realm.snaps;
- if (realm.past_parents.size()) {
- out << " past_parents=(";
- for (map<snapid_t, snaplink_t>::const_iterator p = realm.past_parents.begin();
- p != realm.past_parents.end();
- p++) {
- if (p != realm.past_parents.begin()) out << ",";
- out << p->second.first << "-" << p->first
- << "=" << p->second.ino;
- }
- out << ")";
- }
- out << " " << &realm << ")";
- return out;
-}
-
-
+ostream& operator<<(ostream& out, const SnapRealm &realm);