}
}
+class C_MDC_RejoinGatherFinish : public Context {
+ MDCache *cache;
+public:
+ C_MDC_RejoinGatherFinish(MDCache *c) : cache(c) {}
+ void finish(int r) {
+ cache->rejoin_gather_finish();
+ }
+};
/**
* parallel_fetch -- make a pass at fetching a bunch of paths in parallel
{
dout(10) << "parallel_fetch on " << pathmap.size() << " paths" << dendl;
- C_GatherBuilder gather_bld(g_ceph_context);
+ C_GatherBuilder gather_bld(g_ceph_context, new C_MDC_RejoinGatherFinish(this));
// scan list
set<CDir*> fetch_queue;
assert(rejoin_undef_inodes.empty());
}
-class C_MDC_RejoinGatherFinish : public Context {
- MDCache *cache;
-public:
- C_MDC_RejoinGatherFinish(MDCache *c) : cache(c) {}
- void finish(int r) {
- cache->rejoin_gather_finish();
- }
-};
-
-
-
void MDCache::rejoin_gather_finish()
{
dout(10) << "rejoin_gather_finish" << dendl;
if (!cap_import_paths.empty()) {
C_Gather *gather = parallel_fetch(cap_import_paths, cap_imports_missing);
if (gather) {
- gather->set_finisher(new C_MDC_RejoinGatherFinish(this));
return;
}
}
void MDLog::try_expire(LogSegment *ls)
{
- C_Gather *exp = ls->try_to_expire(mds);
- if (exp) {
+ C_GatherBuilder gather_bld(g_ceph_context, new C_MaybeExpiredSegment(this, ls));
+ ls->try_to_expire(mds, gather_bld);
+ if (gather_bld.has_subs()) {
assert(expiring_segments.count(ls) == 0);
expiring_segments.insert(ls);
expiring_events += ls->num_events;
dout(5) << "try_expire expiring segment " << ls->offset << dendl;
- exp->set_finisher(new C_MaybeExpiredSegment(this, ls));
} else {
dout(10) << "try_expire expired segment " << ls->offset << dendl;
_expired(ls);
// -----------------------
// LogSegment
-C_Gather *LogSegment::try_to_expire(MDS *mds)
+void LogSegment::try_to_expire(MDS *mds, C_GatherBuilder &gather_bld)
{
- C_GatherBuilder gather_bld(g_ceph_context);
-
set<CDir*> commit;
dout(6) << "LogSegment(" << offset << ").try_to_expire" << dendl;
if (gather_bld.has_subs()) {
dout(6) << "LogSegment(" << offset << ").try_to_expire waiting" << dendl;
mds->mdlog->flush();
- return gather_bld.get();
} else {
dout(6) << "LogSegment(" << offset << ").try_to_expire success" << dendl;
- return NULL;
}
}
ops[0].op.extent.truncate_size = extents[0].offset;
objecter->_modify(extents[0].oid, extents[0].oloc, ops, mtime, snapc, flags, onack, oncommit);
} else {
- C_Gather *gack = 0, *gcom = 0;
- if (onack)
- gack = new C_Gather(cct, onack);
- if (oncommit)
- gcom = new C_Gather(cct, oncommit);
+ C_GatherBuilder gack(cct, onack);
+ C_GatherBuilder gcom(cct, oncommit);
for (vector<ObjectExtent>::iterator p = extents.begin(); p != extents.end(); p++) {
vector<OSDOp> ops(1);
ops[0].op.op = CEPH_OSD_OP_TRIMTRUNC;
ops[0].op.extent.truncate_size = p->offset;
ops[0].op.extent.truncate_seq = truncate_seq;
objecter->_modify(p->oid, p->oloc, ops, mtime, snapc, flags,
- gack ? gack->new_sub():0,
- gcom ? gcom->new_sub():0);
+ onack ? gack.new_sub():0,
+ oncommit ? gcom.new_sub():0);
}
}
return 0;
objecter->zero(extents[0].oid, extents[0].oloc, extents[0].offset, extents[0].length,
snapc, mtime, flags, onack, oncommit);
} else {
- C_Gather *gack = 0, *gcom = 0;
- if (onack)
- gack = new C_Gather(cct, onack);
- if (oncommit)
- gcom = new C_Gather(cct, oncommit);
+ C_GatherBuilder gack(cct, onack);
+ C_GatherBuilder gcom(cct, oncommit);
for (vector<ObjectExtent>::iterator p = extents.begin(); p != extents.end(); p++) {
if (p->offset == 0 && p->length == layout->fl_object_size)
objecter->remove(p->oid, p->oloc,
snapc, mtime, flags,
- gack ? gack->new_sub():0,
- gcom ? gcom->new_sub():0);
+ onack ? gack.new_sub():0,
+ oncommit ? gcom.new_sub():0);
else
objecter->zero(p->oid, p->oloc, p->offset, p->length,
snapc, mtime, flags,
- gack ? gack->new_sub():0,
- gcom ? gcom->new_sub():0);
+ onack ? gack.new_sub():0,
+ oncommit ? gcom.new_sub():0);
}
}
return 0;