From: Yan, Zheng Date: Tue, 27 Oct 2015 06:41:29 +0000 (+0800) Subject: client: wait unsafe requests that created/modified the file in fsync() X-Git-Tag: v10.0.3~120^2~6 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=8d2df89ae22031226b9e0268d78fc17aeb73c957;p=ceph.git client: wait unsafe requests that created/modified the file in fsync() Signed-off-by: Yan, Zheng --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 651349789196..c5dbb23cf82c 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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); } diff --git a/src/client/Inode.h b/src/client/Inode.h index a13fd98bc7be..7b7daa1ec692 100644 --- a/src/client/Inode.h +++ b/src/client/Inode.h @@ -295,7 +295,7 @@ struct Inode { ceph_lock_state_t *fcntl_locks; ceph_lock_state_t *flock_locks; - xlist unsafe_dir_ops; + xlist unsafe_ops; Inode(Client *c, vinodeno_t vino, ceph_file_layout *newlayout) : client(c), ino(vino.ino), snapid(vino.snapid), faked_ino(0), diff --git a/src/client/MetaRequest.h b/src/client/MetaRequest.h index 660a88a9ac96..7ace1dc65cfe 100644 --- a/src/client/MetaRequest.h +++ b/src/client/MetaRequest.h @@ -72,6 +72,7 @@ public: xlist::item item; xlist::item unsafe_item; xlist::item unsafe_dir_item; + xlist::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));