diff --git a/src/client/Client.cc b/src/client/Client.cc index 52980d5ecb07c..7e7b2078f7c1d 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -6582,11 +6582,18 @@ void Client::_unmount(bool abort) } mount_cond.wait(lock, [this] { - if (!mds_requests.empty()) { - ldout(cct, 10) << "waiting on " << mds_requests.size() << " requests" - << dendl; + // Only wait for write OPs + for (auto& [tid, req] : mds_requests) { + if (req->is_write()) { + ldout(cct, 10) << "waiting for write request '" << tid + << "' to complete, currently there are " + << mds_requests.size() + << " outstanding read/write requests" + << dendl; + return false; + } } - return mds_requests.empty(); + return true; }); cwd.reset(); @@ -6599,7 +6606,7 @@ void Client::_unmount(bool abort) ldout(cct, 0) << " destroyed lost open file " << fh << " on " << *fh->inode << dendl; _release_fh(fh); } - + while (!ll_unclosed_fh_set.empty()) { set::iterator it = ll_unclosed_fh_set.begin(); Fh *fh = *it; @@ -11691,6 +11698,9 @@ int Client::_sync_fs() flush_caps_sync(); ceph_tid_t flush_tid = last_flush_tid; + // flush the mdlog before waiting for unsafe requests. + flush_mdlog_sync(); + // wait for unsafe mds requests wait_unsafe_requests();