]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: clear I_COMPLETE on traceless reply for dentry request
authorSage Weil <sage@inktank.com>
Fri, 1 Mar 2013 06:32:30 +0000 (22:32 -0800)
committerSage Weil <sage@inktank.com>
Fri, 8 Mar 2013 00:09:45 +0000 (16:09 -0800)
If a request is against a dentry, and we get a traceless reply, clear
the directory I_COMPLETE flag on the parent directory because we can no
longer trust that our cache is complete.

It is possible we could do something a bit more intelligent here, but it
is not trivial because of racing requests, and traceless replies are
rare, so it's not worth the effort.

Signed-off-by: Sage Weil <sage@inktank.com>
src/client/Client.cc

index b3bea7adcbcd5cfe0a06e4d11d186dd3d219305f..6497558008ddf0fa7df9a505338fdeb57d776eb1 100644 (file)
@@ -903,6 +903,14 @@ Inode* Client::insert_trace(MetaRequest *request, int mds)
   bufferlist::iterator p = reply->get_trace_bl().begin();
   if (p.end()) {
     ldout(cct, 10) << "insert_trace -- no trace" << dendl;
+
+    if (request->dentry &&
+       request->dentry->dir &&
+       (request->dentry->dir->parent_inode->flags & I_COMPLETE)) {
+      ldout(cct, 10) << " clearing I_COMPLETE on " << *request->dentry->dir->parent_inode << dendl;
+      request->dentry->dir->parent_inode->flags &= ~I_COMPLETE;
+      request->dentry->dir->release_count++;
+    }
     return NULL;
   }