Reviewed-by: Greg Farnum <greg@xxxxxxxxxxx> On Sun, Mar 17, 2013 at 7:51 AM, Yan, Zheng <zheng.z.yan@xxxxxxxxx> wrote: > From: "Yan, Zheng" <zheng.z.yan@xxxxxxxxx> > > Signed-off-by: Yan, Zheng <zheng.z.yan@xxxxxxxxx> > --- > src/mds/MDCache.cc | 33 +++++++++++++++++++++++++++++---- > src/mds/MDCache.h | 7 ++++++- > src/mds/Server.cc | 9 +++++++++ > src/mds/journal.cc | 2 +- > 4 files changed, 45 insertions(+), 6 deletions(-) > > diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc > index 6853bf1..9b37b1e 100644 > --- a/src/mds/MDCache.cc > +++ b/src/mds/MDCache.cc > @@ -2177,6 +2177,17 @@ void MDCache::committed_master_slave(metareqid_t r, int from) > log_master_commit(r); > } > > +void MDCache::logged_master_update(metareqid_t reqid) > +{ > + dout(10) << "logged_master_update " << reqid << dendl; > + assert(uncommitted_masters.count(reqid)); > + uncommitted_masters[reqid].safe = true; > + if (pending_masters.count(reqid)) { > + pending_masters.erase(reqid); > + if (pending_masters.empty()) > + process_delayed_resolve(); > + } > +} > > /* > * The mds could crash after receiving all slaves' commit acknowledgement, > @@ -2764,8 +2775,23 @@ void MDCache::handle_resolve(MMDSResolve *m) > return; > } > > + discard_delayed_resolve(from); > + > // ambiguous slave requests? > if (!m->slave_requests.empty()) { > + for (vector<metareqid_t>::iterator p = m->slave_requests.begin(); > + p != m->slave_requests.end(); > + ++p) { > + if (uncommitted_masters.count(*p) && !uncommitted_masters[*p].safe) > + pending_masters.insert(*p); > + } > + > + if (!pending_masters.empty()) { > + dout(10) << " still have pending updates, delay processing slave resolve" << dendl; > + delayed_resolve[from] = m; > + return; > + } > + > MMDSResolveAck *ack = new MMDSResolveAck; > for (vector<metareqid_t>::iterator p = m->slave_requests.begin(); > p != m->slave_requests.end(); > @@ -2788,7 +2814,6 @@ void MDCache::handle_resolve(MMDSResolve *m) > > if (!resolve_ack_gather.empty() || !need_resolve_rollback.empty()) { > dout(10) << "delay processing subtree resolve" << dendl; > - discard_delayed_resolve(from); > delayed_resolve[from] = m; > return; > } > @@ -2883,10 +2908,10 @@ void MDCache::handle_resolve(MMDSResolve *m) > void MDCache::process_delayed_resolve() > { > dout(10) << "process_delayed_resolve" << dendl; > - for (map<int, MMDSResolve *>::iterator p = delayed_resolve.begin(); > - p != delayed_resolve.end(); ++p) > + map<int, MMDSResolve*> tmp; > + tmp.swap(delayed_resolve); > + for (map<int, MMDSResolve*>::iterator p = tmp.begin(); p != tmp.end(); ++p) > handle_resolve(p->second); > - delayed_resolve.clear(); > } > > void MDCache::discard_delayed_resolve(int who) > diff --git a/src/mds/MDCache.h b/src/mds/MDCache.h > index 379f715..8f262b9 100644 > --- a/src/mds/MDCache.h > +++ b/src/mds/MDCache.h > @@ -281,14 +281,16 @@ public: > snapid_t follows=CEPH_NOSNAP); > > // slaves > - void add_uncommitted_master(metareqid_t reqid, LogSegment *ls, set<int> &slaves) { > + void add_uncommitted_master(metareqid_t reqid, LogSegment *ls, set<int> &slaves, bool safe=false) { > uncommitted_masters[reqid].ls = ls; > uncommitted_masters[reqid].slaves = slaves; > + uncommitted_masters[reqid].safe = safe; > } > void wait_for_uncommitted_master(metareqid_t reqid, Context *c) { > uncommitted_masters[reqid].waiters.push_back(c); > } > void log_master_commit(metareqid_t reqid); > + void logged_master_update(metareqid_t reqid); > void _logged_master_commit(metareqid_t reqid, LogSegment *ls, list<Context*> &waiters); > void committed_master_slave(metareqid_t r, int from); > void finish_committed_masters(); > @@ -320,9 +322,12 @@ protected: > set<int> slaves; > LogSegment *ls; > list<Context*> waiters; > + bool safe; > }; > map<metareqid_t, umaster> uncommitted_masters; // master: req -> slave set > > + set<metareqid_t> pending_masters; > + > //map<metareqid_t, bool> ambiguous_slave_updates; // for log trimming. > //map<metareqid_t, Context*> waiting_for_slave_update_commit; > friend class ESlaveUpdate; > diff --git a/src/mds/Server.cc b/src/mds/Server.cc > index 8e89e4c..1330f11 100644 > --- a/src/mds/Server.cc > +++ b/src/mds/Server.cc > @@ -4463,6 +4463,9 @@ void Server::_link_remote_finish(MDRequest *mdr, bool inc, > > assert(g_conf->mds_kill_link_at != 3); > > + if (!mdr->more()->witnessed.empty()) > + mdcache->logged_master_update(mdr->reqid); > + > if (inc) { > // link the new dentry > dn->pop_projected_linkage(); > @@ -5073,6 +5076,9 @@ void Server::_unlink_local_finish(MDRequest *mdr, > { > dout(10) << "_unlink_local_finish " << *dn << dendl; > > + if (!mdr->more()->witnessed.empty()) > + mdcache->logged_master_update(mdr->reqid); > + > // unlink main dentry > dn->get_dir()->unlink_inode(dn); > dn->pop_projected_linkage(); > @@ -5881,6 +5887,9 @@ void Server::_rename_finish(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDe > { > dout(10) << "_rename_finish " << *mdr << dendl; > > + if (!mdr->more()->witnessed.empty()) > + mdcache->logged_master_update(mdr->reqid); > + > // apply > _rename_apply(mdr, srcdn, destdn, straydn); > > diff --git a/src/mds/journal.cc b/src/mds/journal.cc > index 3375e40..6475eec 100644 > --- a/src/mds/journal.cc > +++ b/src/mds/journal.cc > @@ -1738,7 +1738,7 @@ void EUpdate::replay(MDS *mds) > dout(10) << "EUpdate.replay " << reqid << " had slaves, expecting a matching ECommitted" << dendl; > _segment->uncommitted_masters.insert(reqid); > set<int> slaves; > - mds->mdcache->add_uncommitted_master(reqid, _segment, slaves); > + mds->mdcache->add_uncommitted_master(reqid, _segment, slaves, true); > } > > if (client_map.length()) { > -- > 1.7.11.7 > -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html