]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/mds/MDSContext.cc
import ceph 14.2.5
[ceph.git] / ceph / src / mds / MDSContext.cc
index 3d1d1688620ee41b66ff7786bd60ef0cdd58ac31..c09e8c3ab5666455775e567fd2c1608a0b625a54 100644 (file)
 #define dout_context g_ceph_context
 #define dout_subsys ceph_subsys_mds
 
-void MDSInternalContextBase::complete(int r) {
+void MDSContext::complete(int r) {
   MDSRank *mds = get_mds();
+  ceph_assert(mds != nullptr);
+  ceph_assert(mds->mds_lock.is_locked_by_me());
+  dout(10) << "MDSContext::complete: " << typeid(*this).name() << dendl;
+  return Context::complete(r);
+}
 
-  dout(10) << "MDSInternalContextBase::complete: " << typeid(*this).name() << dendl;
-  assert(mds != NULL);
-  assert(mds->mds_lock.is_locked_by_me());
-  MDSContext::complete(r);
+void MDSInternalContextWrapper::finish(int r)
+{
+  fin->complete(r);
 }
 
+elist<MDSIOContextBase*> MDSIOContextBase::ctx_list(member_offset(MDSIOContextBase, list_item));
+ceph::spinlock MDSIOContextBase::ctx_list_lock;
 
-MDSRank *MDSInternalContext::get_mds() {
-  return mds;
+MDSIOContextBase::MDSIOContextBase(bool track)
+{
+  created_at = ceph::coarse_mono_clock::now();
+  if (track) {
+    ctx_list_lock.lock();
+    ctx_list.push_back(&list_item);
+    ctx_list_lock.unlock();
+  }
 }
 
-MDSRank *MDSInternalContextWrapper::get_mds()
+MDSIOContextBase::~MDSIOContextBase()
 {
-  return mds;
+  ctx_list_lock.lock();
+  list_item.remove_myself();
+  ctx_list_lock.unlock();
 }
 
-void MDSInternalContextWrapper::finish(int r)
+bool MDSIOContextBase::check_ios_in_flight(ceph::coarse_mono_time cutoff,
+                                          std::string& slow_count,
+                                          ceph::coarse_mono_time& oldest)
 {
-  fin->complete(r);
+  static const unsigned MAX_COUNT = 100;
+  unsigned slow = 0;
+
+  ctx_list_lock.lock();
+  for (elist<MDSIOContextBase*>::iterator p = ctx_list.begin(); !p.end(); ++p) {
+    MDSIOContextBase *c = *p;
+    if (c->created_at >= cutoff)
+      break;
+    ++slow;
+    if (slow > MAX_COUNT)
+      break;
+    if (slow == 1)
+      oldest = c->created_at;
+  }
+  ctx_list_lock.unlock();
+
+  if (slow > 0) {
+    if (slow > MAX_COUNT)
+      slow_count = std::to_string(MAX_COUNT) + "+";
+    else
+      slow_count = std::to_string(slow);
+    return true;
+  } else {
+    return false;
+  }
 }
 
 void MDSIOContextBase::complete(int r) {
   MDSRank *mds = get_mds();
 
   dout(10) << "MDSIOContextBase::complete: " << typeid(*this).name() << dendl;
-  assert(mds != NULL);
-  Mutex::Locker l(mds->mds_lock);
+  ceph_assert(mds != NULL);
+  std::lock_guard l(mds->mds_lock);
+
   if (mds->is_daemon_stopping()) {
     dout(4) << "MDSIOContextBase::complete: dropping for stopping "
             << typeid(*this).name() << dendl;
+    MDSContext::complete(r);
     return;
   }
 
@@ -74,14 +116,6 @@ void MDSLogContextBase::complete(int r) {
   mdlog->set_safe_pos(safe_pos);
 }
 
-MDSRank *MDSIOContext::get_mds() {
-  return mds;
-}
-
-MDSRank *MDSIOContextWrapper::get_mds() {
-  return mds;
-}
-
 void MDSIOContextWrapper::finish(int r)
 {
   fin->complete(r);
@@ -96,10 +130,3 @@ void C_IO_Wrapper::complete(int r)
     MDSIOContext::complete(r);
   }
 }
-
-MDSRank *MDSInternalContextGather::get_mds()
-{
-  derr << "Forbidden call to MDSInternalContextGather::get_mds by " << typeid(*this).name() << dendl;
-  ceph_abort();
-}
-