if (curi->is_file()) {
if (!cur->scrub_info()->on_finish)
- cur->scrub_set_finisher(new C_KickOffScrubs(mdcache->mds, this));
+ cur->scrub_set_finisher(&scrub_kick);
scrub_file_dentry(cur);
can_continue = true;
} else {
assert (!*added_children); // can't do this if children are still pending
if (!dn->scrub_info()->on_finish)
- dn->scrub_set_finisher(new C_KickOffScrubs(mdcache->mds, this));
+ 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
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()) {
- C_KickOffScrubs *c = new C_KickOffScrubs(mdcache->mds, this);
- next_dir->fetch(c);
+ next_dir->fetch(&scrub_kick);
dout(25) << "fetching frag from RADOS" << dendl;
return false;
}
// scrub initialize, so that it can populate its lists
// of dentries.
if (!dir->is_complete()) {
- dir->fetch(new C_KickOffScrubs(mdcache->mds, this));
+ dir->fetch(&scrub_kick);
return;
}
int r = 0;
while(r == 0) {
- MDSInternalContext *kick = new C_KickOffScrubs(mdcache->mds, this);
CDentry *dn = NULL;
- r = dir->scrub_dentry_next(kick, &dn);
+ 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
- delete kick;
}
if (r == EAGAIN) {
}
}
+ScrubStack::C_KickOffScrubs::C_KickOffScrubs(MDCache *mdcache, ScrubStack *s)
+ : MDSInternalContext(mdcache->mds), stack(s) { }
class Finisher;
class ScrubStack {
- protected:
+protected:
/// A finisher needed so that we don't re-enter kick_off_scrubs
Finisher *finisher;
int scrubs_in_progress;
ScrubStack *scrubstack; // hack for dout
int stack_size;
+
+ class C_KickOffScrubs : public MDSInternalContext {
+ ScrubStack *stack;
+ public:
+ C_KickOffScrubs(MDCache *mdcache, ScrubStack *s);
+ void finish(int r) { }
+ void complete(int r) {
+ stack->kick_off_scrubs();
+ // don't delete self
+ }
+ };
+ C_KickOffScrubs scrub_kick;
+
public:
MDCache *mdcache;
ScrubStack(MDCache *mdc, Finisher *finisher_) :
scrubs_in_progress(0),
scrubstack(this),
stack_size(0),
+ scrub_kick(mdc, this),
mdcache(mdc) {}
~ScrubStack() {
assert(dentry_stack.empty());
*/
bool get_next_cdir(CInode *in, CDir **new_dir);
- class C_KickOffScrubs : public MDSInternalContext {
- ScrubStack *stack;
- public:
- C_KickOffScrubs(MDSRank *mds, ScrubStack *s)
- : MDSInternalContext(mds), stack(s)
- {
- }
- void finish(int r){
- stack->kick_off_scrubs();
- }
- };
};
#endif /* SCRUBSTACK_H_ */