*/
Inode* Client::insert_trace(MetaRequest *request, utime_t from, int mds)
{
- MClientRequest *req = request->request;
MClientReply *reply = request->reply;
dout(10) << "insert_trace from " << from << " mds" << mds << dendl;
assert(inode_map.count(vino));
Inode *diri = inode_map[vino];
- string dname = req->get_filepath().last_dentry();
+ string dname = request->path.last_dentry();
LeaseStat dlease;
dlease.duration_ms = 0;
* Additionally, if you set any *drop member, you'd better have
* set the corresponding dentry!
*/
-void Client::encode_cap_releases(MetaRequest *req, int mds) {
+void Client::encode_cap_releases(MetaRequest *req, MClientRequest *m, int mds) {
dout(20) << "encode_cap_releases enter (req: "
<< req << ", mds: " << mds << ")" << dendl;
if (req->inode_drop && req->inode)
- encode_inode_release(req->inode, req->request,
+ encode_inode_release(req->inode, m,
mds, req->inode_drop,
req->inode_unless);
if (req->old_inode_drop && req->old_inode)
- encode_inode_release(req->old_inode, req->request,
+ encode_inode_release(req->old_inode, m,
mds, req->old_inode_drop,
req->old_inode_unless);
if (req->dentry_drop && req->dentry)
- encode_dentry_release(req->dentry, req->request,
+ encode_dentry_release(req->dentry, m,
mds, req->dentry_drop,
req->dentry_unless);
if (req->old_dentry_drop && req->old_dentry)
- encode_dentry_release(req->old_dentry, req->request,
+ encode_dentry_release(req->old_dentry, m,
mds, req->old_dentry_drop,
req->old_dentry_unless);
dout(25) << "encode_cap_releases exit (req: "
void Client::send_request(MetaRequest *request, int mds)
{
- MClientRequest *r = request->request;
// make the request
dout(10) << "send_request rebuilding request " << request->get_tid()
<< " for mds" << mds << dendl;
- r = make_request_from_Meta(request);
+ MClientRequest *r = make_request_from_Meta(request);
if (request->dentry)
r->set_dentry_wanted();
if (request->got_unsafe)
r->set_replayed_op();
-
- request->request = r;
- encode_cap_releases(request, mds);
- request->request = 0;
-
r->set_mdsmap_epoch(mdsmap->get_epoch());
+ encode_cap_releases(request, r, mds);
+
if (request->mds == -1) {
request->sent_stamp = g_clock.now();
dout(20) << "send_request set sent_stamp to " << request->sent_stamp << dendl;
}
+ request->mds = mds;
mds_sessions[mds].requests.push_back(&request->item);
dout(10) << "send_request " << *r << " to mds" << mds << dendl;
messenger->send_message(r, mdsmap->get_inst(mds));
-
- request->mds = mds;
}
void Client::handle_client_request_forward(MClientRequestForward *fwd)
class Dentry;
struct MetaRequest {
- MClientRequest *request; // the actual request to send out
- //used in constructing MClientRequests
ceph_mds_request_head head;
filepath path, path2;
bufferlist data;
Inode *target;
- MetaRequest(MClientRequest *req, tid_t t) :
- request(req), inode_drop(0), inode_unless(0),
- old_inode_drop(0), old_inode_unless(0),
- dentry_drop(0), dentry_unless(0),
- old_dentry_drop(0), old_dentry_unless(0),
- inode(NULL), old_inode(NULL),
- dentry(NULL), old_dentry(NULL),
- resend_mds(-1), num_fwd(0), retry_attempt(0),
- ref(1), reply(0),
- kick(false), got_safe(false), got_unsafe(false), item(this), unsafe_item(this),
- lock("MetaRequest lock"),
- caller_cond(0), dispatch_cond(0),
- target(0) {
- memcpy(&head, &req->head, sizeof(ceph_mds_request_head));
- }
-
MetaRequest(int op) :
- request(NULL), inode_drop(0), inode_unless(0),
+ inode_drop(0), inode_unless(0),
old_inode_drop(0), old_inode_unless(0),
dentry_drop(0), dentry_unless(0),
old_dentry_drop(0), old_dentry_unless(0),
//MClientRequest *req, int uid, int gid,
Inode **ptarget = 0,
int use_mds=-1, bufferlist *pdirbl=0);
- void encode_cap_releases(MetaRequest *request, int mds);
+ void encode_cap_releases(MetaRequest *request, MClientRequest *m, int mds);
int encode_inode_release(Inode *in, MClientRequest *req,
int mds, int drop,
int unless,int force=0);