From 0c148788e9598a2ddd47739fa49687179c7ab0a2 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 8 May 2014 17:02:18 +0800 Subject: [PATCH] mds: allow early reply when there is no journaled slave update Early reply should be Ok when there were slave requests, but none of them modifies any object. Signed-off-by: Yan, Zheng --- src/mds/Mutation.h | 3 ++- src/mds/Server.cc | 17 ++++++++++++++--- src/messages/MMDSSlaveRequest.h | 3 +++ 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/mds/Mutation.h b/src/mds/Mutation.h index e07089ddbc225..2a704235d5e2e 100644 --- a/src/mds/Mutation.h +++ b/src/mds/Mutation.h @@ -209,6 +209,7 @@ struct MDRequestImpl : public MutationImpl, public TrackedOp { set witnessed; // nodes who have journaled a RenamePrepare map pvmap; + bool has_journaled_slaves; bool slave_update_journaled; // for rename @@ -244,7 +245,7 @@ struct MDRequestImpl : public MutationImpl, public TrackedOp { dirfrag_t fragment_base; More() : - slave_update_journaled(false), + has_journaled_slaves(false), slave_update_journaled(false), srcdn_auth_mds(-1), inode_import_v(0), rename_inode(0), is_freeze_authpin(false), is_ambiguous_auth(false), is_remote_frozen_authpin(false), is_inode_exporter(false), diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 9351fc6a6006b..e7440f021820d 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -845,8 +845,8 @@ void Server::early_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn) if (!g_conf->mds_early_reply) return; - if (mdr->has_witnesses()) { - dout(10) << "early_reply - there are witnesses, not allowed." << dendl; + if (mdr->has_more() && mdr->more()->has_journaled_slaves) { + dout(10) << "early_reply - there are journaled slaves, not allowed." << dendl; mds->mdlog->flush(); return; } @@ -4562,6 +4562,7 @@ void Server::handle_slave_link_prep(MDRequestRef& mdr) // set up commit waiter mdr->more()->slave_commit = new C_MDS_SlaveLinkCommit(this, mdr, targeti); + mdr->more()->slave_update_journaled = true; submit_mdlog_entry(le, new C_MDS_SlaveLinkPrep(this, mdr, targeti), mdr, __func__); mdlog->flush(); @@ -4742,6 +4743,8 @@ void Server::handle_slave_link_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *m) // witnessed! assert(mdr->more()->witnessed.count(from) == 0); mdr->more()->witnessed.insert(from); + assert(!m->is_not_journaled()); + mdr->more()->has_journaled_slaves = true; // remove from waiting list assert(mdr->more()->waiting_on_slave.count(from)); @@ -5134,6 +5137,7 @@ void Server::handle_slave_rmdir_prep(MDRequestRef& mdr) MMDSSlaveRequest *reply = new MMDSSlaveRequest(mdr->reqid, mdr->attempt, MMDSSlaveRequest::OP_RMDIRPREPACK); + reply->mark_not_journaled(); mds->send_message_mds(reply, mdr->slave_to_mds); // send caps to auth (if we're not already) @@ -5207,6 +5211,8 @@ void Server::handle_slave_rmdir_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ac mdr->more()->slaves.insert(from); mdr->more()->witnessed.insert(from); + if (!ack->is_not_journaled()) + mdr->more()->has_journaled_slaves = true; // remove from waiting list assert(mdr->more()->waiting_on_slave.count(from)); @@ -6659,8 +6665,11 @@ void Server::_logged_slave_rename(MDRequestRef& mdr, // prepare ack MMDSSlaveRequest *reply = NULL; - if (!mdr->aborted) + if (!mdr->aborted) { reply= new MMDSSlaveRequest(mdr->reqid, mdr->attempt, MMDSSlaveRequest::OP_RENAMEPREPACK); + if (!mdr->more()->slave_update_journaled) + reply->mark_not_journaled(); + } CDentry::linkage_t *srcdnl = srcdn->get_linkage(); CDentry::linkage_t *destdnl = NULL; @@ -7180,6 +7189,8 @@ void Server::handle_slave_rename_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *a assert(mdr->more()->witnessed.count(from) == 0); if (ack->witnesses.empty()) { mdr->more()->witnessed.insert(from); + if (!ack->is_not_journaled()) + mdr->more()->has_journaled_slaves = true; } else { dout(10) << " extra witnesses (srcdn replicas) are " << ack->witnesses << dendl; mdr->more()->extra_witnesses.swap(ack->witnesses); diff --git a/src/messages/MMDSSlaveRequest.h b/src/messages/MMDSSlaveRequest.h index 15f095bf7748a..455bc6361b6d7 100644 --- a/src/messages/MMDSSlaveRequest.h +++ b/src/messages/MMDSSlaveRequest.h @@ -98,6 +98,7 @@ class MMDSSlaveRequest : public Message { static const unsigned FLAG_NONBLOCK = 1; static const unsigned FLAG_WOULDBLOCK = 2; + static const unsigned FLAG_NOTJOURNALED = 4; // for locking __u16 lock_type; // lock object type @@ -133,6 +134,8 @@ public: bool is_nonblock() { return (flags & FLAG_NONBLOCK); } void mark_error_wouldblock() { flags |= FLAG_WOULDBLOCK; } bool is_error_wouldblock() { return (flags & FLAG_WOULDBLOCK); } + void mark_not_journaled() { flags |= FLAG_NOTJOURNALED; } + bool is_not_journaled() { return (flags & FLAG_NOTJOURNALED); } void set_lock_type(int t) { lock_type = t; } -- 2.39.5