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);
}
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(); }
// 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();
}
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);
::encode(snapid, bl);
::encode(name, bl);
::encode(stamp, bl);
- _prepare(bl, pstid, pbl, onfinish);
+ _prepare(bl, pstid, NULL, onfinish);
}
};
dout(10) << "prepare v" << version << " update " << info << dendl;
bl.clear();
- ::encode(last_snap, bl);
}
break;
//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)
// 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;