From 12ec4b0aac640060a2e19e255d91040d3e6693c3 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Thu, 17 Aug 2017 14:33:02 +0800 Subject: [PATCH] mds: properly set reply buffer for table request 'agree' message Origin code does not set reply buffer for 'agree' messages that are re-sent. Signed-off-by: "Yan, Zheng" --- src/mds/MDSTableServer.cc | 1 + src/mds/MDSTableServer.h | 1 + src/mds/Server.cc | 7 ++----- src/mds/SnapClient.h | 4 ++-- src/mds/SnapServer.cc | 25 ++++++++++++++++++++----- src/mds/SnapServer.h | 2 +- 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/mds/MDSTableServer.cc b/src/mds/MDSTableServer.cc index ee9d29ffaef..88db122ab9c 100644 --- a/src/mds/MDSTableServer.cc +++ b/src/mds/MDSTableServer.cc @@ -258,6 +258,7 @@ void MDSTableServer::handle_mds_recovery(mds_rank_t who) if (p->second.reqid >= next_reqid) next_reqid = p->second.reqid + 1; MMDSTableRequest *reply = new MMDSTableRequest(table, TABLESERVER_OP_AGREE, p->second.reqid, p->second.tid); + _get_reply_buffer(p->second.tid, &reply->bl); mds->send_message_mds(reply, who); } diff --git a/src/mds/MDSTableServer.h b/src/mds/MDSTableServer.h index 34bca0519e2..23510f2dbd8 100644 --- a/src/mds/MDSTableServer.h +++ b/src/mds/MDSTableServer.h @@ -44,6 +44,7 @@ private: public: virtual void handle_query(MMDSTableRequest *m) = 0; virtual void _prepare(bufferlist &bl, uint64_t reqid, mds_rank_t bymds) = 0; + virtual void _get_reply_buffer(version_t tid, bufferlist *pbl) const = 0; virtual void _commit(version_t tid, MMDSTableRequest *req=NULL) = 0; virtual void _rollback(version_t tid) = 0; virtual void _server_update(bufferlist& bl) { ceph_abort(); } diff --git a/src/mds/Server.cc b/src/mds/Server.cc index cdbee50c44f..340f719bed4 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -8783,16 +8783,13 @@ void Server::handle_client_renamesnap(MDRequestRef& mdr) // prepare if (!mdr->more()->stid) { mds->snapclient->prepare_update(diri->ino(), snapid, dstname, utime_t(), - &mdr->more()->stid, &mdr->more()->snapidbl, + &mdr->more()->stid, new C_MDS_RetryRequest(mdcache, mdr)); return; } version_t stid = mdr->more()->stid; - bufferlist::iterator p = mdr->more()->snapidbl.begin(); - snapid_t seq; - ::decode(seq, p); - dout(10) << " stid is " << stid << ", seq is " << seq << dendl; + dout(10) << " stid is " << stid << dendl; // journal inode_t *pi = diri->project_inode(); diff --git a/src/mds/SnapClient.h b/src/mds/SnapClient.h index 64a18e66604..a4daf701069 100644 --- a/src/mds/SnapClient.h +++ b/src/mds/SnapClient.h @@ -58,7 +58,7 @@ public: } void prepare_update(inodeno_t ino, snapid_t snapid, const string& name, utime_t stamp, - version_t *pstid, bufferlist *pbl, MDSInternalContextBase *onfinish) { + version_t *pstid, MDSInternalContextBase *onfinish) { bufferlist bl; __u32 op = TABLE_OP_UPDATE; ::encode(op, bl); @@ -66,7 +66,7 @@ public: ::encode(snapid, bl); ::encode(name, bl); ::encode(stamp, bl); - _prepare(bl, pstid, pbl, onfinish); + _prepare(bl, pstid, NULL, onfinish); } }; diff --git a/src/mds/SnapServer.cc b/src/mds/SnapServer.cc index 6c37bdc0b1c..2d567ac02ab 100644 --- a/src/mds/SnapServer.cc +++ b/src/mds/SnapServer.cc @@ -123,7 +123,6 @@ void SnapServer::_prepare(bufferlist &bl, uint64_t reqid, mds_rank_t bymds) dout(10) << "prepare v" << version << " update " << info << dendl; bl.clear(); - ::encode(last_snap, bl); } break; @@ -133,11 +132,27 @@ void SnapServer::_prepare(bufferlist &bl, uint64_t reqid, mds_rank_t bymds) //dump(); } -bool SnapServer::_is_prepared(version_t tid) const +void SnapServer::_get_reply_buffer(version_t tid, bufferlist *pbl) const { - return - pending_update.count(tid) || - pending_destroy.count(tid); + auto p = pending_update.find(tid); + if (p != pending_update.end()) { + if (pbl && p->second.long_name == "create") + ::encode(p->second.snapid, *pbl); + return; + } + auto q = pending_destroy.find(tid); + if (q != pending_destroy.end()) { + if (pbl) + ::encode(q->second.second, *pbl); + return; + } + auto r = pending_noop.find(tid); + if (r != pending_noop.end()) { + if (pbl) + ::encode(last_snap, *pbl); + return; + } + assert (0 == "tid not found"); } void SnapServer::_commit(version_t tid, MMDSTableRequest *req) diff --git a/src/mds/SnapServer.h b/src/mds/SnapServer.h index 058a6e2bdb2..b26293d5f50 100644 --- a/src/mds/SnapServer.h +++ b/src/mds/SnapServer.h @@ -81,7 +81,7 @@ public: // server bits void _prepare(bufferlist &bl, uint64_t reqid, mds_rank_t bymds) override; - bool _is_prepared(version_t tid) const; + void _get_reply_buffer(version_t tid, bufferlist *pbl) const override; void _commit(version_t tid, MMDSTableRequest *req=NULL) override; void _rollback(version_t tid) override; void _server_update(bufferlist& bl) override; -- 2.39.5