]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
client: wait unsafe requests that created/modified the file in fsync()
authorYan, Zheng <zyan@redhat.com>
Tue, 27 Oct 2015 06:41:29 +0000 (14:41 +0800)
committerYan, Zheng <zyan@redhat.com>
Thu, 24 Dec 2015 07:49:47 +0000 (15:49 +0800)
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/client/Client.cc
src/client/Inode.h
src/client/MetaRequest.h

index 651349789196c6a5bfdb8e2fb7e86f83b4ac8067..c5dbb23cf82c1f09c4ee529c7f63956aa94aca61 100644 (file)
@@ -2176,7 +2176,11 @@ void Client::handle_client_reply(MClientReply *reply)
     if (is_dir_operation(request)) {
       Inode *dir = request->inode();
       assert(dir);
-      dir->unsafe_dir_ops.push_back(&request->unsafe_dir_item);
+      dir->unsafe_ops.push_back(&request->unsafe_dir_item);
+    }
+    if (request->target) {
+      InodeRef &in = request->target;
+      in->unsafe_ops.push_back(&request->unsafe_target_item);
     }
   }
 
@@ -2203,6 +2207,7 @@ void Client::handle_client_reply(MClientReply *reply)
     if (request->got_unsafe) {
       request->unsafe_item.remove_myself();
       request->unsafe_dir_item.remove_myself();
+      request->unsafe_target_item.remove_myself();
       signal_cond_list(request->waitfor_safe);
     }
     request->item.remove_myself();
@@ -2582,6 +2587,7 @@ void Client::kick_requests_closed(MetaSession *session)
        lderr(cct) << "kick_requests_closed removing unsafe request " << req->get_tid() << dendl;
        req->unsafe_item.remove_myself();
        req->unsafe_dir_item.remove_myself();
+       req->unsafe_target_item.remove_myself();
        signal_cond_list(req->waitfor_safe);
        unregister_request(req);
       }
@@ -8102,8 +8108,8 @@ int Client::_fsync(Inode *in, bool syncdataonly)
     }
   }
 
-  if (!in->unsafe_dir_ops.empty()) {
-    MetaRequest *req = in->unsafe_dir_ops.back();
+  if (!in->unsafe_ops.empty()) {
+    MetaRequest *req = in->unsafe_ops.back();
     uint64_t last_tid = req->get_tid();
     ldout(cct, 15) << "waiting on unsafe requests, last tid " << last_tid <<  dendl;
 
@@ -8111,9 +8117,9 @@ int Client::_fsync(Inode *in, bool syncdataonly)
       req->get();
       wait_on_list(req->waitfor_safe);
       put_request(req);
-      if (in->unsafe_dir_ops.empty())
+      if (in->unsafe_ops.empty())
        break;
-      req = in->unsafe_dir_ops.front();
+      req = in->unsafe_ops.front();
     } while (req->tid < last_tid);
   }
 
index a13fd98bc7bee47d562d601b7dccc388121aba77..7b7daa1ec692fb53a4905e575bf8fcf008687eed 100644 (file)
@@ -295,7 +295,7 @@ struct Inode {
   ceph_lock_state_t *fcntl_locks;
   ceph_lock_state_t *flock_locks;
 
-  xlist<MetaRequest*> unsafe_dir_ops;
+  xlist<MetaRequest*> unsafe_ops;
 
   Inode(Client *c, vinodeno_t vino, ceph_file_layout *newlayout)
     : client(c), ino(vino.ino), snapid(vino.snapid), faked_ino(0),
index 660a88a9ac966ca630f2d9e3e29e6b06b26533ea..7ace1dc65cfeed38ec6c32fbb29fe7ed09d71f63 100644 (file)
@@ -72,6 +72,7 @@ public:
   xlist<MetaRequest*>::item item;
   xlist<MetaRequest*>::item unsafe_item;
   xlist<MetaRequest*>::item unsafe_dir_item;
+  xlist<MetaRequest*>::item unsafe_target_item;
   Mutex lock; //for get/set sync
 
   Cond  *caller_cond;          // who to take up
@@ -94,7 +95,8 @@ public:
     ref(1), reply(0), 
     kick(false), aborted(false), success(false),
     readdir_offset(0), readdir_end(false), readdir_num(0),
-    got_unsafe(false), item(this), unsafe_item(this), unsafe_dir_item(this),
+    got_unsafe(false), item(this), unsafe_item(this),
+    unsafe_dir_item(this), unsafe_target_item(this),
     lock("MetaRequest lock"),
     caller_cond(0), dispatch_cond(0) {
     memset(&head, 0, sizeof(ceph_mds_request_head));