close_dir(dir);
}
+ request->target = in;
return in;
}
// got it!
MClientReply *reply = request->reply;
- int mds = reply->get_source().num();
+ request->reply = 0;
+ if (ptarget)
+ *ptarget = request->target;
// kick dispatcher (we've got it!)
assert(request->dispatch_cond);
dout(20) << "sendrecv kickback on tid " << tid << " " << request->dispatch_cond << dendl;
request->dispatch_cond = 0;
- // insert trace
- utime_t from = request->sent_stamp;
- Inode *target = insert_trace(request, from, mds);
- if (ptarget)
- *ptarget = target;
-
// -- log times --
if (client_logger) {
utime_t lat = g_clock.real_now();
- lat -= start;
+ lat -= request->sent_stamp;
dout(20) << "lat " << lat << dendl;
client_logger->favg(l_c_lat,(double)lat);
client_logger->favg(l_c_reply,(double)lat);
return;
}
+ int mds = reply->get_source().num();
+ request->reply = reply;
+ insert_trace(request, request->sent_stamp, mds);
+
if (!request->got_unsafe) {
request->got_unsafe = true;
mds_sessions[mds_num].unsafe_requests.push_back(&request->unsafe_item);
- // store reply
- request->reply = reply;
-
Cond cond;
request->dispatch_cond = &cond;
*/
struct InodeCap;
+struct Inode;
struct MetaRequest {
tid_t tid;
Cond *caller_cond; // who to take up
Cond *dispatch_cond; // who to kick back
+ Inode *target;
+
MetaRequest(MClientRequest *req, tid_t t) :
tid(t), request(req),
resend_mds(-1), num_fwd(0), retry_attempt(0),
ref(1), reply(0),
got_safe(false), got_unsafe(false), unsafe_item(this),
lock("MetaRequest lock"),
- caller_cond(0), dispatch_cond(0) { }
+ caller_cond(0), dispatch_cond(0), target(0) { }
MetaRequest* get() {++ref; return this; }