From: Yan, Zheng Date: Fri, 22 May 2015 01:47:44 +0000 (+0800) Subject: mds: don't add setfilelock requests to session's completed_requests X-Git-Tag: v9.0.2~39^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2517ea99455504969ef249bba70f6704a9d2fa36;p=ceph.git mds: don't add setfilelock requests to session's completed_requests setfilelock requests only modify states in MDS memory. The states get lost when MDS fails. If a setfilelock reply gets lost when MDS fails, client will re-send corresponding setfilelock request when new MDS restarts. The new MDS should re-execute the setfilelock request Signed-off-by: Yan, Zheng --- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 39a4465aa331..e069a457b854 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -1078,7 +1078,13 @@ void Server::reply_client_request(MDRequestRef& mdr, MClientReply *reply) mdr->mark_event("replying"); // note successful request in session map? - if (req->may_write() && mdr->session && reply->get_result() == 0) { + // + // setfilelock requests are special, they only modify states in MDS memory. + // The states get lost when MDS fails. If Client re-send a completed + // setfilelock request, it means that client did not receive corresponding + // setfilelock reply. So MDS should re-execute the setfilelock request. + if (req->may_write() && req->get_op() != CEPH_MDS_OP_SETFILELOCK && + reply->get_result() == 0 && mdr->session) { inodeno_t created = mdr->alloc_ino ? mdr->alloc_ino : mdr->used_prealloc_ino; mdr->session->add_completed_request(mdr->reqid.tid, created); if (mdr->ls) {