From: Yan, Zheng Date: Tue, 10 Nov 2015 14:13:04 +0000 (+0800) Subject: mds: properly update scrubs_in_progress X-Git-Tag: v10.0.1~51^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b65ace2443421357df2dda3abb20753d3401b13f;p=ceph.git mds: properly update scrubs_in_progress Signed-off-by: Yan, Zheng --- diff --git a/src/mds/ScrubStack.cc b/src/mds/ScrubStack.cc index 9fe1c4622d4f..0d99bebcb95e 100644 --- a/src/mds/ScrubStack.cc +++ b/src/mds/ScrubStack.cc @@ -100,8 +100,10 @@ void ScrubStack::kick_off_scrubs() pop_dentry(cur); // we only touch it this once, so remove from stack if (curi->is_file()) { - if (!cur->scrub_info()->on_finish) + if (!cur->scrub_info()->on_finish) { + scrubs_in_progress++; cur->scrub_set_finisher(&scrub_kick); + } scrub_file_dentry(cur); can_continue = true; } else { @@ -228,8 +230,10 @@ void ScrubStack::scrub_dir_dentry(CDentry *dn, if (all_frags_done) { assert (!*added_children); // can't do this if children are still pending - if (!dn->scrub_info()->on_finish) + if (!dn->scrub_info()->on_finish) { + scrubs_in_progress++; dn->scrub_set_finisher(&scrub_kick); + } // OK, so now I can... fire off a validate on the dir inode, and // when it completes, come through here again, noticing that we've @@ -255,6 +259,7 @@ bool ScrubStack::get_next_cdir(CInode *in, CDir **new_dir) dout(25) << "looking up new frag " << next_frag << dendl; CDir *next_dir = in->get_or_open_dirfrag(mdcache, next_frag); if (!next_dir->is_complete()) { + scrubs_in_progress++; next_dir->fetch(&scrub_kick); dout(25) << "fetching frag from RADOS" << dendl; return false; @@ -324,6 +329,7 @@ void ScrubStack::scrub_dirfrag(CDir *dir, bool *added_children, // scrub initialize, so that it can populate its lists // of dentries. if (!dir->is_complete()) { + scrubs_in_progress++; dir->fetch(&scrub_kick); return; } @@ -334,10 +340,12 @@ void ScrubStack::scrub_dirfrag(CDir *dir, bool *added_children, int r = 0; while(r == 0) { CDentry *dn = NULL; + scrubs_in_progress++; r = dir->scrub_dentry_next(&scrub_kick, &dn); if (r != EAGAIN) { // ctx only used by scrub_dentry_next in EAGAIN case // FIXME It's kind of annoying to keep allocating and deleting a ctx here + scrubs_in_progress--; } if (r == EAGAIN) { diff --git a/src/mds/ScrubStack.h b/src/mds/ScrubStack.h index c9bbbd077050..b01ee84e5187 100644 --- a/src/mds/ScrubStack.h +++ b/src/mds/ScrubStack.h @@ -44,6 +44,7 @@ protected: C_KickOffScrubs(MDCache *mdcache, ScrubStack *s); void finish(int r) { } void complete(int r) { + stack->scrubs_in_progress--; stack->kick_off_scrubs(); // don't delete self }