#include "global/global_context.h"
#include "include/assert.h"
-#include "common/Continuation.h"
+#include "mds/MDSContinuation.h"
#define dout_subsys ceph_subsys_mds
#undef dout_prefix
}
void CInode::validate_disk_state(CInode::validated_data *results,
- Context *fin)
+ MDRequestRef &mdr)
{
- class ValidationContinuation : public Continuation {
+ class ValidationContinuation : public MDSContinuation {
public:
CInode *in;
CInode::validated_data *results;
ValidationContinuation(CInode *i,
CInode::validated_data *data_r,
- Context *fin) :
- Continuation(fin),
+ MDRequestRef &mdr) :
+ MDSContinuation(mdr, i->mdcache->mds->server),
in(i),
results(data_r),
shadow_in(NULL) {
results->passed_validation = false; // we haven't finished it yet
- MDSIOContextWrapper *mdsioc =
- new MDSIOContextWrapper(in->mdcache->mds, get_callback(BACKTRACE));
- C_OnFinisher *conf = new C_OnFinisher(mdsioc,
+ C_OnFinisher *conf = new C_OnFinisher(get_io_callback(BACKTRACE),
&in->mdcache->mds->finisher);
in->fetch_backtrace(conf, &bl);
in->mdcache->create_unlinked_system_inode(shadow_in,
in->inode.ino,
in->inode.mode);
- shadow_in->fetch(new MDSInternalContextWrapper(in->mdcache->mds,
- get_callback(INODE)));
+ shadow_in->fetch(get_internal_callback(INODE));
return false;
} else {
return fetch_dirfrag_rstats();
dirfrag->fetch(gather.new_sub(), false);
}
if (gather.has_subs()) {
- gather.set_finisher(new MDSInternalContextWrapper(in->mdcache->mds,
- get_callback(DIRFRAGS)));
+ gather.set_finisher(get_internal_callback(DIRFRAGS));
gather.activate();
return false;
} else {
ValidationContinuation *vc = new ValidationContinuation(this,
results,
- fin);
+ mdr);
vc->begin();
}
class MClientCaps;
struct ObjectOperation;
class EMetaBlob;
+struct MDRequestImpl;
+typedef ceph::shared_ptr<MDRequestImpl> MDRequestRef;
+
ostream& operator<<(ostream& out, CInode& in);
* been completed.
*/
void validate_disk_state(validated_data *results,
- Context *fin);
+ MDRequestRef& mdr);
static void dump_validation_results(const validated_data& results,
Formatter *f);
private:
class C_scrub_dentry_finish : public Context {
public:
CInode::validated_data results;
- MDCache *mdcache;
MDRequestRef mdr;
Context *on_finish;
Formatter *formatter;
- C_scrub_dentry_finish(MDCache *mdc, MDRequestRef& mdr,
+ C_scrub_dentry_finish(MDRequestRef& mdr,
Context *fin, Formatter *f) :
- mdcache(mdc), mdr(mdr), on_finish(fin), formatter(f) {}
+ mdr(mdr), on_finish(fin), formatter(f) {}
void finish(int r) {
if (r >= 0) { // we got into the scrubbing dump it
formatter->dump_int("return_code", r);
formatter->close_section(); // results
}
- mdcache->request_finish(mdr);
on_finish->complete(r);
}
};
MDRequestRef mdr = request_start_internal(CEPH_MDS_OP_VALIDATE);
filepath fp(path.c_str());
mdr->set_filepath(fp);
- C_scrub_dentry_finish *csd = new C_scrub_dentry_finish(this, mdr, fin, f);
+ C_scrub_dentry_finish *csd = new C_scrub_dentry_finish(mdr, fin, f);
mdr->internal_op_finish = csd;
mdr->internal_op_private = &csd->results;
scrub_dentry_work(mdr);
CInode::validated_data *vr =
static_cast<CInode::validated_data*>(mdr->internal_op_private);
- in->validate_disk_state(vr, mdr->internal_op_finish);
+ in->validate_disk_state(vr, mdr);
return;
}
flush_dentry_work(mdr);
}
+class C_FinishIOMDR : public MDSInternalContextBase {
+protected:
+ MDS *mds;
+ MDRequestRef mdr;
+ MDS *get_mds() { return mds; }
+public:
+ C_FinishIOMDR(MDS *mds_, MDRequestRef& mdr_) : mds(mds_), mdr(mdr_) {}
+ void finish(int r) { mds->server->respond_to_request(mdr, r); }
+};
+
void MDCache::flush_dentry_work(MDRequestRef& mdr)
{
set<SimpleLock*> rdlocks, wrlocks, xlocks;
bool locked = mds->locker->acquire_locks(mdr, rdlocks, wrlocks, xlocks);
if (!locked)
return;
- in->flush(new MDSInternalContextWrapper(mds,mdr->internal_op_finish));
+ in->flush(new C_FinishIOMDR(mds, mdr));
}
typedef C_GatherBuilderBase<MDSInternalContextBase, MDSGather> MDSGatherBuilder;
-
#endif // MDS_CONTEXT_H
-
if (!mdr->internal_op_finish)
assert(0 == "trying to respond to internal op without finisher");
mdr->internal_op_finish->complete(r);
+ mdcache->request_finish(mdr);
}
}
{
return client_reconnect_gather.count(c) > 0;
}
-