]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: flush the mdlog in _fsync before waiting on unstable reqs 21542/head
authorJeff Layton <jlayton@redhat.com>
Mon, 16 Apr 2018 17:48:10 +0000 (13:48 -0400)
committerPrashant D <pdhange@redhat.com>
Fri, 20 Apr 2018 01:12:30 +0000 (21:12 -0400)
Recently, we changed ganesha to call to ceph_ll_sync_inode after
issuing a setattr call, to ensure that the attribute changes makes it
to the backing store before returning.

While testing with this, I noticed that we'd occasionally see setattr
calls stall for a long time. Analysis showed that the client's _fsync
request was stalled waiting on an mdlog flush.

This patch adds a call to flush_mdlog_sync prior to waiting on unsafe
requests in _fsync and seems to resolve the issue.

Tracker: http://tracker.ceph.com/issues/23714
Signed-off-by: Jeff Layton <jlayton@redhat.com>
(cherry picked from commit d790108158d21616fdf6ea148bf7f9d1534326d0)

src/client/Client.cc

index 1fd435839490a2d240a7a4d207d292aa45871559..203d6c2f712b3fadb2cfc9049798b338d753319d 100644 (file)
@@ -9478,6 +9478,8 @@ int Client::_fsync(Inode *in, bool syncdataonly)
   } else ldout(cct, 10) << "no metadata needs to commit" << dendl;
 
   if (!syncdataonly && !in->unsafe_ops.empty()) {
+    flush_mdlog_sync();
+
     MetaRequest *req = in->unsafe_ops.back();
     ldout(cct, 15) << "waiting on unsafe requests, last tid " << req->get_tid() <<  dendl;