]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: start flushing dirty caps in Client::_fsync() 4778/head
authorYan, Zheng <zyan@redhat.com>
Thu, 28 May 2015 09:38:18 +0000 (17:38 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 29 May 2015 02:03:08 +0000 (10:03 +0800)
Client::flush_caps(Inode *, MetaSession *) does not start flushing
dirty caps. It only re-send caps message for caps that are already
being flushed.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/client/Client.cc

index a1305566a48cbca3f25563f898de65948a8c5af1..7016c0fd51848b955f750047f596cf57a29cc9ba 100644 (file)
@@ -7728,15 +7728,11 @@ int Client::_fsync(Fh *f, bool syncdataonly)
   }
   
   if (!syncdataonly && (in->dirty_caps & ~CEPH_CAP_ANY_FILE_WR)) {
-    for (map<mds_rank_t, Cap*>::iterator iter = in->caps.begin(); iter != in->caps.end(); ++iter) {
-      if (iter->second->implemented & ~CEPH_CAP_ANY_FILE_WR) {
-       MetaSession *session = mds_sessions[iter->first];
-       assert(session);
-        flush_caps(in, session);
-      }
+    check_caps(in, true);
+    if (in->flushing_caps) {
+      flushed_metadata = true;
+      memcpy(wait_on_flush, in->flushing_cap_tid, sizeof(wait_on_flush));
     }
-    flushed_metadata = true;
-    memcpy(wait_on_flush, in->flushing_cap_tid, sizeof(wait_on_flush));
   } else ldout(cct, 10) << "no metadata needs to commit" << dendl;
 
   if (object_cacher_completion) { // wait on a real reply instead of guessing