From: Yan, Zheng Date: Mon, 23 Mar 2020 09:09:26 +0000 (+0800) Subject: mds: don't assert empty io context list when shutting down X-Git-Tag: wip-pdonnell-testing-20200918.022351~1630^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=7f26bb7bb768a90177601915050b4f5020902943;p=ceph-ci.git mds: don't assert empty io context list when shutting down Fixes: https://tracker.ceph.com/issues/44680 Signed-off-by: "Yan, Zheng" --- diff --git a/src/mds/MDSContext.cc b/src/mds/MDSContext.cc index e1f7da6d6d3..94726a2cb4f 100644 --- a/src/mds/MDSContext.cc +++ b/src/mds/MDSContext.cc @@ -34,24 +34,30 @@ void MDSInternalContextWrapper::finish(int r) fin->complete(r); } -elist MDSIOContextBase::ctx_list(member_offset(MDSIOContextBase, list_item)); -ceph::spinlock MDSIOContextBase::ctx_list_lock; +struct MDSIOContextList { + elist 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::iterator p = ctx_list.begin(); !p.end(); ++p) { + ioctx_list.lock.lock(); + for (elist::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) diff --git a/src/mds/MDSContext.h b/src/mds/MDSContext.h index 78d251ee4b0..242690085cd 100644 --- a/src/mds/MDSContext.h +++ b/src/mds/MDSContext.h @@ -111,9 +111,8 @@ public: private: ceph::coarse_mono_time created_at; elist::item list_item; - - static elist ctx_list; - static ceph::spinlock ctx_list_lock; + + friend struct MDSIOContextList; }; /**