// -------
-int Client::choose_target_mds(MClientRequest *req)
+int Client::choose_target_mds(MetaRequest *req)
{
int mds = 0;
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;
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 {
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());
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;
+ }
};
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);