]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: properly set reply buffer for table request 'agree' message
authorYan, Zheng <zyan@redhat.com>
Thu, 17 Aug 2017 06:33:02 +0000 (14:33 +0800)
committerYan, Zheng <zyan@redhat.com>
Thu, 9 Nov 2017 01:13:24 +0000 (09:13 +0800)
Origin code does not set reply buffer for 'agree' messages that
are re-sent.

Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/mds/MDSTableServer.cc
src/mds/MDSTableServer.h
src/mds/Server.cc
src/mds/SnapClient.h
src/mds/SnapServer.cc
src/mds/SnapServer.h

index ee9d29ffaef1279856fb8ba424cc9532cd0e9132..88db122ab9c527f1825b16ff8f051f9a9c4dd8d6 100644 (file)
@@ -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);
   }
 
index 34bca0519e22e9d20d1184570e52c36a557b948a..23510f2dbd8890a528e9a64b8ae7cc3fd2984c13 100644 (file)
@@ -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(); }
index cdbee50c44f1a465700b73484580e65370bf628b..340f719bed4a1f2226fd63ac12a7927deaec0109 100644 (file)
@@ -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();
index 64a18e666042ca0d57b833bffbc69cc4823189e6..a4daf70106957e84e1dd2ed920ff7581b08192ec 100644 (file)
@@ -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);
   }
 };
 
index 6c37bdc0b1c01ed215df22ba2b9f566f44fce168..2d567ac02ab635cdb112d4a5ea14436bba2699ca 100644 (file)
@@ -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)
index 058a6e2bdb2ab31ba8f449df0bd1b38da6ad867d..b26293d5f5080c949b95da1e6c34110f0c45ca1b 100644 (file)
@@ -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;