From d11f5f1c59cf30d3a05724c2cfdea1826305c0a5 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 22 Dec 2008 13:48:40 -0800 Subject: [PATCH] mds: early_reply infrastructure --- src/mds/CInode.cc | 8 ++++++-- src/mds/CInode.h | 2 +- src/mds/Server.cc | 37 +++++++++++++++++++++++++++++++++---- src/mds/Server.h | 4 +++- src/messages/MClientReply.h | 2 ++ 5 files changed, 45 insertions(+), 8 deletions(-) diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index ac9903156251f..78f549de373fb 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -1275,12 +1275,16 @@ void CInode::decode_snap_blob(bufferlist& snapbl) } -bool CInode::encode_inodestat(bufferlist& bl, snapid_t snapid) +bool CInode::encode_inodestat(bufferlist& bl, snapid_t snapid, bool projected) { bool valid = true; // pick a version! - inode_t *i = &inode; + inode_t *i; + if (projected) + i = get_projected_inode(); + else + i = &inode; bufferlist xbl; if (snapid && is_multiversion()) { diff --git a/src/mds/CInode.h b/src/mds/CInode.h index af3f79c07e5ab..396b382469941 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -419,7 +419,7 @@ private: // for giving to clients - bool encode_inodestat(bufferlist& bl, snapid_t snapid=CEPH_NOSNAP); + bool encode_inodestat(bufferlist& bl, snapid_t snapid=CEPH_NOSNAP, bool projected=false); // -- locks -- diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 863e6808ba78f..62572eabc62a6 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -502,6 +502,28 @@ void Server::reply_request(MDRequest *mdr, int r, CInode *tracei, CDentry *trace } +void Server::early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn) +{ + MClientRequest *req = mdr->client_request; + entity_inst_t client_inst = req->get_orig_source_inst(); + if (client_inst.name.is_mds()) + return; + + MClientReply *reply = new MClientReply(mdr->client_request, 0); + reply->set_unsafe(); + + dout(10) << "early_reply " << reply->get_result() + << " (" << strerror(-reply->get_result()) + << ") " << *req << dendl; + + snapid_t snapid = CEPH_NOSNAP; + CInode *snapdiri = 0; + if (tracei || tracedn) + set_trace_dist(mdr->session, reply, tracei, tracedn, snapid, snapdiri, true); + + messenger->send_message(reply, client_inst); +} + /* * send given reply * include a trace to tracei @@ -613,7 +635,8 @@ void Server::encode_null_lease(bufferlist& bl) * trace is in reverse order (i.e. root inode comes last) */ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn, - snapid_t snapid, CInode *snapdiri) + snapid_t snapid, CInode *snapdiri, + bool projected) { // inode, dentry, dir, ..., inode bufferlist bl; @@ -635,7 +658,7 @@ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, C inode: numi++; - if (in->encode_inodestat(bl, snapid)) + if (in->encode_inodestat(bl, snapid, projected)) lmask = mds->locker->issue_client_lease(in, client, bl, now, session); else { lmask = CEPH_STAT_MASK_INODE; // immutable bits @@ -663,12 +686,18 @@ void Server::set_trace_dist(Session *session, MClientReply *reply, CInode *in, C dout(10) << " snapdiri at pos " << snapdirpos << dendl; } - if (!dn) - dn = in->get_parent_dn(); + if (!dn) { + if (projected) + dn = in->get_projected_parent_dn(); + else + dn = in->get_parent_dn(); + } if (!dn) goto done; dentry: + projected = false; + ::encode(dn->get_name(), bl); if (snapid == CEPH_NOSNAP) lmask = mds->locker->issue_client_lease(dn, client, bl, now, session); diff --git a/src/mds/Server.h b/src/mds/Server.h index e08d268a0bfe8..93774693a934f 100644 --- a/src/mds/Server.h +++ b/src/mds/Server.h @@ -75,10 +75,12 @@ public: void handle_client_request(MClientRequest *m); void dispatch_client_request(MDRequest *mdr); + void early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn); void reply_request(MDRequest *mdr, int r = 0, CInode *tracei = 0, CDentry *tracedn = 0); void reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei = 0, CDentry *tracedn = 0); void set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn, - snapid_t snapid, CInode *snapdiri); + snapid_t snapid, CInode *snapdiri, + bool projected = false); void encode_empty_dirstat(bufferlist& bl); void encode_infinite_lease(bufferlist& bl); diff --git a/src/messages/MClientReply.h b/src/messages/MClientReply.h index e50a0855140c0..bfabd4a4ec167 100644 --- a/src/messages/MClientReply.h +++ b/src/messages/MClientReply.h @@ -190,6 +190,8 @@ public: void set_file_caps_mseq(capseq_t s) { st.file_caps_mseq = s; } //void set_file_data_version(uint64_t v) { st.file_data_version = v; } + void set_unsafe() { st.safe = 0; } + MClientReply() {} MClientReply(MClientRequest *req, int result = 0) : Message(CEPH_MSG_CLIENT_REPLY) { -- 2.39.5