From: Greg Farnum Date: Mon, 21 Sep 2009 20:46:37 +0000 (-0700) Subject: uclient: Only make the MClientRequest in send_request itself. X-Git-Tag: v0.16~102 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=99c58ba57dd8a710cf9a17b2eb5e0055d15338f4;p=ceph.git uclient: Only make the MClientRequest in send_request itself. Add a few more functions to MetaRequest so we can use those in choose_mds. --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 48965964dd53..8ecd4800ba1c 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -689,7 +689,7 @@ Inode* Client::insert_trace(MetaRequest *request, utime_t from, int mds) // ------- -int Client::choose_target_mds(MClientRequest *req) +int Client::choose_target_mds(MetaRequest *req) { int mds = 0; @@ -794,10 +794,6 @@ int Client::make_request(MetaRequest *request, else request->set_oldest_client_tid(tid); // this one is the oldest. - // -- make request -- - MClientRequest *req = make_request_from_Meta(request); - request->request = req; - // hack target mds? if (use_mds >= 0) request->resend_mds = use_mds; @@ -815,7 +811,7 @@ int Client::make_request(MetaRequest *request, request->resend_mds = -1; dout(10) << "target resend_mds specified as mds" << mds << dendl; } else { - mds = choose_target_mds(req); + mds = choose_target_mds(request); if (mds >= 0) { dout(10) << "chose target mds" << mds << " based on hierarchy" << dendl; } else { @@ -1050,20 +1046,16 @@ void Client::handle_client_session(MClientSession *m) void Client::send_request(MetaRequest *request, int mds) { MClientRequest *r = request->request; - if (!r) { - // make a new one - dout(10) << "send_request rebuilding request " << request->get_tid() - << " for mds" << mds << dendl; - r = make_request_from_Meta(request); - r->set_dentry_wanted(); - if (request->got_unsafe) - r->set_replayed_op(); - request->request = r; - } - else - request->retry_attempt++; - if (!r->releases.size()) - encode_cap_releases(request, mds); + // make the request + dout(10) << "send_request rebuilding request " << request->get_tid() + << " for mds" << mds << dendl; + r = make_request_from_Meta(request); + 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()); diff --git a/src/client/Client.h b/src/client/Client.h index 2c8c3e7d27e3..41285db626a8 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -187,6 +187,29 @@ struct MetaRequest { tid_t get_tid() { return head.tid; } filepath& get_filepath() { return path; } filepath& get_filepath2() { return path2; } + + bool is_write() { + return + (head.op & CEPH_MDS_OP_WRITE) || + (head.op == CEPH_MDS_OP_OPEN && !(head.args.open.flags & (O_CREAT|O_TRUNC))) || + (head.op == CEPH_MDS_OP_CREATE && !(head.args.open.flags & (O_CREAT|O_TRUNC))); + } + bool can_forward() { + if (is_write() || + head.op == CEPH_MDS_OP_OPEN || // do not forward _any_ open request. + head.op == CEPH_MDS_OP_CREATE) // do not forward _any_ open request. + return false; + return true; + } + bool auth_is_best() { + if (is_write()) + return true; + if (head.op == CEPH_MDS_OP_OPEN || + head.op == CEPH_MDS_OP_CREATE || + head.op == CEPH_MDS_OP_READDIR) + return true; + return false; + } }; @@ -843,7 +866,7 @@ public: int unless,int force=0); void encode_dentry_release(Dentry *dn, MClientRequest *req, int mds, int drop, int unless); - int choose_target_mds(MClientRequest *req); + int choose_target_mds(MetaRequest *req); void send_request(MetaRequest *request, int mds); void kick_requests(int mds, bool signal); void handle_client_request_forward(MClientRequestForward *reply);