]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: don't assert empty io context list when shutting down
authorYan, Zheng <zyan@redhat.com>
Mon, 23 Mar 2020 09:09:26 +0000 (17:09 +0800)
committerYan, Zheng <zyan@redhat.com>
Mon, 23 Mar 2020 09:50:52 +0000 (17:50 +0800)
Fixes: https://tracker.ceph.com/issues/44680
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
src/mds/MDSContext.cc
src/mds/MDSContext.h

index e1f7da6d6d33d5590c3f7499bb4f666e67ae434e..94726a2cb4f45d2c77b7e30be5a163c0ed2aff35 100644 (file)
@@ -34,24 +34,30 @@ void MDSInternalContextWrapper::finish(int r)
   fin->complete(r);
 }
 
-elist<MDSIOContextBase*> MDSIOContextBase::ctx_list(member_offset(MDSIOContextBase, list_item));
-ceph::spinlock MDSIOContextBase::ctx_list_lock;
+struct MDSIOContextList {
+  elist<MDSIOContextBase*> list;
+  ceph::spinlock lock;
+  MDSIOContextList() : list(member_offset(MDSIOContextBase, list_item)) {}
+  ~MDSIOContextList() {
+    list.clear(); // avoid assertion in elist's destructor
+  }
+} ioctx_list;
 
 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();
+    ioctx_list.lock.lock();
+    ioctx_list.list.push_back(&list_item);
+    ioctx_list.lock.unlock();
   }
 }
 
 MDSIOContextBase::~MDSIOContextBase()
 {
-  ctx_list_lock.lock();
+  ioctx_list.lock.lock();
   list_item.remove_myself();
-  ctx_list_lock.unlock();
+  ioctx_list.lock.unlock();
 }
 
 bool MDSIOContextBase::check_ios_in_flight(ceph::coarse_mono_time cutoff,
@@ -61,8 +67,8 @@ bool MDSIOContextBase::check_ios_in_flight(ceph::coarse_mono_time cutoff,
   static const unsigned MAX_COUNT = 100;
   unsigned slow = 0;
 
-  ctx_list_lock.lock();
-  for (elist<MDSIOContextBase*>::iterator p = ctx_list.begin(); !p.end(); ++p) {
+  ioctx_list.lock.lock();
+  for (elist<MDSIOContextBase*>::iterator p = ioctx_list.list.begin(); !p.end(); ++p) {
     MDSIOContextBase *c = *p;
     if (c->created_at >= cutoff)
       break;
@@ -72,7 +78,7 @@ bool MDSIOContextBase::check_ios_in_flight(ceph::coarse_mono_time cutoff,
     if (slow == 1)
       oldest = c->created_at;
   }
-  ctx_list_lock.unlock();
+  ioctx_list.lock.unlock();
 
   if (slow > 0) {
     if (slow > MAX_COUNT)
index 78d251ee4b0741cf9ad3445b0f65278cff3ebd32..242690085cd98c87ecebf7b570ce1b5964a9baea 100644 (file)
@@ -111,9 +111,8 @@ public:
 private:
   ceph::coarse_mono_time created_at;
   elist<MDSIOContextBase*>::item list_item;
-
-  static elist<MDSIOContextBase*> ctx_list;
-  static ceph::spinlock ctx_list_lock;
+  
+  friend struct MDSIOContextList;
 };
 
 /**