// save the mask
dn->inode->mask = st->mask;
- dn->inode->ttl = ttl;
+ if (ttl > dn->inode->ttl) dn->inode->ttl = ttl;
// or do we have newer size/mtime from writing?
if (dn->inode->file_wr_size > dn->inode->inode.size)
*
* insert a trace from a MDS reply into the cache.
*/
-Inode* Client::insert_trace(MClientReply *reply)
+Inode* Client::insert_trace(MClientReply *reply, utime_t ttl)
{
Inode *cur = root;
utime_t now = g_clock.real_now();
- utime_t ttl = now;
- ttl += 60.0; /* FIXME ASKJSDFJKDFJKDFSJK*/
dout(10) << "insert_trace got " << reply->get_trace_in().size() << " inodes" << dendl;
inode_map[root->inode.ino] = root;
root->dir_auth = 0;
}
- cur->ttl = ttl;
+ if (ttl > cur->ttl) cur->ttl = ttl;
cur->mask = (*pin)->mask;
} else {
// not root.
-MClientReply *Client::make_request(MClientRequest *req,
- int use_mds) // this param is purely for debug hacking
+MClientReply *Client::make_request(MClientRequest *req, Inode **ppin, int use_mds)
{
// time the call
utime_t start = g_clock.real_now();
request.idempotent = req->is_idempotent();
// hack target mds?
- if (use_mds)
+ if (use_mds >= 0)
request.resend_mds = use_mds;
// set up wait cond
mds_requests.erase(tid);
+ // insert trace
+ if (reply->get_result() >= 0) {
+ utime_t ttl = request.sent_stamp;
+ ttl += 1000.0 * (float)reply->get_lease_duration_ms();
+ Inode *in = insert_trace(reply, ttl);
+ if (ppin)
+ *ppin = in;
+ }
+
// -- log times --
if (client_logger) {
utime_t lat = g_clock.real_now();
r->set_mdsmap_epoch(mdsmap->get_epoch());
+ if (request->mds.empty())
+ request->sent_stamp = g_clock.now();
+
dout(10) << "send_request " << *r << " to mds" << mds << dendl;
messenger->send_message(r, mdsmap->get_inst(mds));
req->set_caller_uid(getuid());
req->set_caller_gid(getgid());
- MClientReply *reply = make_request(req, utime);
+ MClientReply *reply = make_request(req);
int res = reply->get_result();
-
- insert_trace(reply);
delete reply;
dout(10) << "link result is " << res << dendl;
unlink(dn);
}
}
- insert_trace(reply);
delete reply;
dout(10) << "unlink result is " << res << dendl;
unlink(dn);
}
}
- insert_trace(reply);
delete reply;
dout(10) << "rename result is " << res << dendl;
MClientReply *reply = make_request(req);
int res = reply->get_result();
- insert_trace(reply);
delete reply;
dout(10) << "mkdir result is " << res << dendl;
unlink(dn);
}
}
- insert_trace(reply);
delete reply;
trim_cache();
MClientReply *reply = make_request(req);
int res = reply->get_result();
- insert_trace(reply); //FIXME assuming trace of link, not of target
delete reply;
trim_cache();
int res = 0;
Dentry *dn = lookup(fpath);
- inode_t inode;
utime_t now = g_clock.real_now();
if (dn) {
now <= dn->inode->ttl &&
((mask & ~CEPH_STAT_MASK_INODE) || now <= dn->inode->ttl) &&
((dn->inode->mask & mask) == mask)) {
- inode = dn->inode->inode;
dout(10) << "lstat cache hit w/ sufficient mask, valid until " << dn->inode->ttl << dendl;
//if (g_conf.client_cache_stat_ttl == 0)
req->head.args.stat.mask = mask;
req->set_filepath(fpath);
- MClientReply *reply = make_request(req);
+ MClientReply *reply = make_request(req, in);
res = reply->get_result();
dout(10) << "lstat res is " << res << dendl;
- if (res == 0) {
- //Transfer information from reply to stbuf
- inode = reply->get_inode();
-
- //Update metadata cache
- *in = insert_trace(reply);
- }
-
delete reply;
-
if (res != 0)
*in = 0; // not a success.
}
MClientReply *reply = make_request(req);
int res = reply->get_result();
- insert_trace(reply);
delete reply;
trim_cache();
MClientReply *reply = make_request(req);
int res = reply->get_result();
- insert_trace(reply);
delete reply;
dout(10) << "chown result is " << res << dendl;
MClientReply *reply = make_request(req);
int res = reply->get_result();
- insert_trace(reply);
delete reply;
dout(3) << "utimes(\"" << path << "\", " << mtime << ", " << atime << ") = " << res << dendl;
MClientReply *reply = make_request(req);
int res = reply->get_result();
- insert_trace(reply);
delete reply;
MClientReply *reply = make_request(req);
int res = reply->get_result();
- insert_trace(reply);
inodeno_t ino = reply->get_ino();
// did i get directory inode?
MClientReply *reply = make_request(req);
assert(reply);
- insert_trace(reply);
int result = reply->get_result();
// success?
MClientReply *reply = make_request(req);
int res = reply->get_result();
- insert_trace(reply);
delete reply;
dout(3) << "truncate(\"" << file << "\", " << length << ") = " << res << dendl;
MClientReply *reply = make_request(req);
int res = reply->get_result();
- insert_trace(reply);
delete reply;
dout(3) << "ftruncate(\"" << fh << "\", " << length << ") = " << res << dendl;
MClientRequest *request;
bufferlist request_payload; // in case i have to retry
+ utime_t sent_stamp;
bool idempotent; // is request idempotent?
set<int> mds; // who i am asking
int resend_mds; // someone wants you to (re)send the request here
};
map<tid_t,StatfsRequest*> statfs_requests;
- MClientReply *make_request(MClientRequest *req, int use_auth=-1);
+ MClientReply *make_request(MClientRequest *req, Inode **ppin=0, int use_mds=-1);
int choose_target_mds(MClientRequest *req);
void send_request(MetaRequest *request, int mds);
void kick_requests(int mds);
// metadata cache
Inode* insert_inode(Dir *dir, InodeStat *in_info, const string& dn, utime_t ttl);
void update_dir_dist(Inode *in, DirStat *st);
- Inode* insert_trace(MClientReply *reply);
+ Inode* insert_trace(MClientReply *reply, utime_t ttl);
// ----------------------
// fs ops.