summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-05-17 10:27:27 -0700
committerSage Weil <sage@inktank.com>2013-06-24 21:21:47 -0700
commitdb564d30cdef6a5a1e43b5bd5b8c663c78c8c1fb (patch)
tree6fd9a03143719cbf3f1331d3bf81ccde37fbbc82
parent44cbdfb643398414d1a7037362025508754b679a (diff)
downloadceph-db564d30cdef6a5a1e43b5bd5b8c663c78c8c1fb.tar.gz
client: handle traceless rename in insert_trace, not verify_reply_trace
The insert_trace() logic is about managing local cache consistency; the verify_reply_trace() is about retrying requests to get the results that our callers need. Set up stubs to handle rmdir and unlink while we are here. Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/client/Client.cc23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc
index 5f1d68dfc13..0340f240b3b 100644
--- a/src/client/Client.cc
+++ b/src/client/Client.cc
@@ -913,12 +913,25 @@ Inode* Client::insert_trace(MetaRequest *request, MetaSession *session)
ldout(cct, 10) << "insert_trace -- no trace" << dendl;
Dentry *d = request->dentry();
- if (d && d->dir &&
+ if (d &&
+ d->dir &&
(d->dir->parent_inode->flags & I_COMPLETE)) {
ldout(cct, 10) << " clearing I_COMPLETE on " << *d->dir->parent_inode << dendl;
d->dir->parent_inode->flags &= ~I_COMPLETE;
d->dir->release_count++;
}
+
+ if (d && reply->get_result() == 0) {
+ Dentry *od = request->old_dentry();
+ if (od) {
+ // rename
+ unlink(od, false, false);
+ } else if (request->head.op == CEPH_MDS_OP_RMDIR ||
+ request->head.op == CEPH_MDS_OP_UNLINK) {
+ // unlink, rmdir
+ // ...
+ }
+ }
return NULL;
}
@@ -1189,14 +1202,6 @@ int Client::verify_reply_trace(int r,
Inode *target = 0; // ptarget may be NULL
Dentry *d = request->dentry();
if (d) {
- // rename is special: we handle old_dentry unlink explicitly
- // in insert_dentry_inode(), so we need to compensate and do
- // the same here.
- Dentry *od = request->old_dentry();
- if (od) {
- unlink(od, false, false);
- }
-
if (d->dir) {
ldout(cct, 10) << "make_request got traceless reply, looking up #"
<< d->dir->parent_inode->ino << "/" << d->name