From 710f5f61ecdcacb0c649dccc9643da4ca0d6891e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 4 Aug 2008 14:32:27 -0700 Subject: [PATCH] mds: snaprealm replay, reconnect fixes --- src/mds/MDCache.cc | 4 +++- src/mds/MDCache.h | 2 +- src/mds/Server.cc | 12 +++++++++--- src/mds/journal.cc | 26 +++++++++++++++++++------- src/mds/snap.cc | 24 ++++++++++++++++++++++++ src/mds/snap.h | 21 +-------------------- 6 files changed, 57 insertions(+), 32 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 837e4eab454fc..113e0a4515ad1 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -3504,7 +3504,7 @@ void MDCache::process_reconnected_caps() 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; @@ -6180,9 +6180,11 @@ void MDCache::_snaprealm_create_finish(MDRequest *mdr, Mutation *mut, CInode *in 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 diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h index da852d47d4dd4..6007f3be9d546 100644 --- a/src/mds/MDCache.h +++ b/src/mds/MDCache.h @@ -654,7 +654,7 @@ public: // [reconnect/rejoin caps] map > reconnected_caps; // inode -> client -> realmino - map > reconnected_snaprealms; + map > reconnected_snaprealms; // realmino -> client -> realmseq void add_reconnected_cap(CInode *in, int client, inodeno_t realm) { reconnected_caps[in][client] = realm; diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 482d2a3d794d6..696675ec7de4c 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -382,11 +382,16 @@ void Server::handle_client_reconnect(MClientReconnect *m) 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)); } } @@ -398,7 +403,8 @@ void Server::handle_client_reconnect(MClientReconnect *m) 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)); diff --git a/src/mds/journal.cc b/src/mds/journal.cc index 63327fab688bd..d0778d8c0f151 100644 --- a/src/mds/journal.cc +++ b/src/mds/journal.cc @@ -371,6 +371,7 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg) 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); @@ -379,6 +380,8 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg) 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); @@ -405,7 +408,10 @@ void EMetaBlob::replay(MDS *mds, LogSegment *logseg) 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); @@ -418,16 +424,22 @@ void EMetaBlob::replay(MDS *mds, LogSegment *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 diff --git a/src/mds/snap.cc b/src/mds/snap.cc index cfd08bfaf5291..83f0301138e16 100644 --- a/src/mds/snap.cc +++ b/src/mds/snap.cc @@ -27,6 +27,30 @@ << ".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::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; diff --git a/src/mds/snap.h b/src/mds/snap.h index 928905181ff43..3f5d63c23357e 100644 --- a/src/mds/snap.h +++ b/src/mds/snap.h @@ -211,26 +211,7 @@ struct SnapRealm { }; 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::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); -- 2.39.5