- also needs cope with mds failures
kernel client
-- direct mds requests intelligently
- flush caps on sync, fsync, etc.
- do we need to block?
- timeout mds session close on umount
- deal with CAP_RDCACHE properly: invalidate cache pages?
- what happens after reconnect when we get successful reply but no trace (!) on e.g. rename, unlink, link, open+O_CREAT, etc...
- fallback in each case (in ceph_unlink, _rename, etc.) when reply has no trace?
- - what about open(O_WR or O_CREAT)? pbly needs fix in mds... tho it's racey now...
- procfs/debugfs
- adjust granular debug levels too
- should we be using debugfs?
CEPH_MDS_OP_RMDIR = 0x01221,
CEPH_MDS_OP_SYMLINK = 0x01222,
- CEPH_MDS_OP_CREATE = 0x10301,
CEPH_MDS_OP_OPEN = 0x10302,
CEPH_MDS_OP_TRUNCATE = 0x11303,
CEPH_MDS_OP_LTRUNCATE = 0x01303,
}
// retry?
- if (req->get_retry_attempt()) {
+ if (req->get_retry_attempt() &&
+ req->get_op() != CEPH_MDS_OP_OPEN) {
assert(session);
if (session->have_completed_request(req->get_reqid().tid)) {
dout(5) << "already completed " << req->get_reqid() << dendl;
// funky.
case CEPH_MDS_OP_OPEN:
- if ((req->head.args.open.flags & O_CREAT) == 0) {
+ if ((req->head.args.open.flags & O_CREAT) &&
+ !(req->get_retry_attempt() &&
+ mdr->session->have_completed_request(req->get_reqid().tid)))
+ handle_client_openc(mdr);
+ else
handle_client_open(mdr);
- break;
- }
- case CEPH_MDS_OP_CREATE:
- handle_client_openc(mdr);
break;
// namespace.
// hmm, check permissions or something.
// O_TRUNC
- if (flags & O_TRUNC) {
+ if ((flags & O_TRUNC) &&
+ !(req->get_retry_attempt() &&
+ mdr->session->have_completed_request(req->get_reqid().tid))) {
assert(cur->is_auth());
// xlock file size