dout(7) << "request_forward " << *mdr << " to mds." << who << " req "
<< *mdr->client_request << dendl;
if (mdr->is_batch_head) {
- BatchOp* bop = nullptr;
int mask = mdr->client_request->head.args.getattr.mask;
switch (mdr->client_request->get_op()) {
if (in) {
auto it = in->batch_ops.find(mask);
if (it != in->batch_ops.end()) {
- bop = it->second;
+ it->second->forward(who);
+ in->batch_ops.erase(it);
}
}
break;
if (dn) {
auto it = dn->batch_ops.find(mask);
if (it != dn->batch_ops.end()) {
- bop = it->second;
+ it->second->forward(who);
+ dn->batch_ops.erase(it);
}
}
break;
default:
ceph_abort();
}
- if (bop) {
- dout(20) << __func__ << ": forward other batch ops(GETATTR/LOOKUP) to "
- << who << ":" << port <<", too. " << *mdr << dendl;
- bop->forward_requests(who);
- }
} else {
mds->forward_message_mds(mdr->release_client_request(), who);
}
class Batch_Getattr_Lookup : public BatchOp {
protected:
Server* server;
- MDRequestRef mdr;
+ ceph::ref_t<MDRequestImpl> mdr;
MDCache* mdcache;
int res = 0;
public:
- Batch_Getattr_Lookup(Server* s, MDRequestRef& r, MDCache* mdc) : server(s), mdr(r), mdcache(mdc) {}
- void add_request(const MDRequestRef& m) override {
+ Batch_Getattr_Lookup(Server* s, ceph::ref_t<MDRequestImpl> r, MDCache* mdc) : server(s), mdr(std::move(r)), mdcache(mdc) {}
+ void add_request(const ceph::ref_t<MDRequestImpl>& m) override {
mdr->batch_reqs.push_back(m);
}
- void set_request(const MDRequestRef& m) override {
+ void set_request(const ceph::ref_t<MDRequestImpl>& m) override {
mdr = m;
}
- void forward_all(mds_rank_t t) override {
+ void _forward(mds_rank_t t) override {
mdcache->mds->forward_message_mds(mdr->release_client_request(), t);
mdr->set_mds_stamp(ceph_clock_now());
for (auto& m : mdr->batch_reqs) {
}
mdr->batch_reqs.clear();
}
- void respond_all(int r) {
+ void _respond(int r) override {
mdr->set_mds_stamp(ceph_clock_now());
for (auto& m : mdr->batch_reqs) {
if (!m->killed) {
mdr->batch_reqs.clear();
server->reply_client_request(mdr, make_message<MClientReply>(*mdr->client_request, r));
}
+ void print(std::ostream& o) {
+ o << "[batch front=" << *mdr << "]";
+ }
};
class ServerLogContext : public MDSLogContextBase {
if (mdr->is_batch_op() && mdr->is_batch_head) {
int mask = mdr->client_request->head.args.getattr.mask;
- BatchOp *fin;
+ std::unique_ptr<BatchOp> bop;
if (mdr->client_request->get_op() == CEPH_MDS_OP_GETATTR) {
dout(20) << __func__ << ": respond other getattr ops. " << *mdr << dendl;
- fin = mdr->in[0]->batch_ops[mask];
+ auto it = mdr->in[0]->batch_ops.find(mask);
+ bop = std::move(it->second);
+ mdr->in[0]->batch_ops.erase(it);
} else {
dout(20) << __func__ << ": respond other lookup ops. " << *mdr << dendl;
- fin = mdr->dn[0].back()->batch_ops[mask];
+ auto it = mdr->dn[0].back()->batch_ops.find(mask);
+ bop = std::move(it->second);
+ mdr->dn[0].back()->batch_ops.erase(it);
}
- fin->finish(r);
-
- if (mdr->client_request->get_op() == CEPH_MDS_OP_GETATTR) {
- mdr->in[0]->batch_ops.erase(mask);
- } else {
- mdr->dn[0].back()->batch_ops.erase(mask);
- }
+ bop->respond(r);
} else {
reply_client_request(mdr, make_message<MClientReply>(*mdr->client_request, r));
}
{
int mask = mdr->client_request->head.args.getattr.mask;
if (mdr->client_request->get_op() == CEPH_MDS_OP_GETATTR && mdr->in[0]) {
- auto it = mdr->in[0]->batch_ops.find(mask);
- auto bocp = it->second;
- mdr->in[0]->batch_ops.erase(it);
- delete bocp;
+ mdr->in[0]->batch_ops.erase(mask);
} else if (mdr->client_request->get_op() == CEPH_MDS_OP_LOOKUP && mdr->dn[0].size()) {
- auto it = mdr->dn[0].back()->batch_ops.find(mask);
- auto bocp = it->second;
- mdr->dn[0].back()->batch_ops.erase(it);
- delete bocp;
+ mdr->dn[0].back()->batch_ops.erase(mask);
}
}
mdr->is_batch_head = true;
int mask = mdr->client_request->head.args.getattr.mask;
if (mdr->client_request->get_op() == CEPH_MDS_OP_GETATTR) {
- auto fin = mdr->in[0]->batch_ops[mask];
+ auto& fin = mdr->in[0]->batch_ops[mask];
fin->set_request(new_batch_head);
} else if (mdr->client_request->get_op() == CEPH_MDS_OP_LOOKUP) {
- auto fin = mdr->dn[0].back()->batch_ops[mask];
+ auto& fin = mdr->dn[0].back()->batch_ops[mask];
fin->set_request(new_batch_head);
}
} else {
if (!mdr->is_batch_head && mdr->is_batch_op()) {
if (!is_lookup) {
- if (ref->batch_ops.count(mask)) {
+ auto em = ref->batch_ops.emplace(std::piecewise_construct, std::forward_as_tuple(mask), std::forward_as_tuple());
+ if (em.second) {
+ em.first->second = std::make_unique<Batch_Getattr_Lookup>(this, mdr, mdcache);
+ } else {
dout(20) << __func__ << ": GETATTR op, wait for previous same getattr ops to respond. " << *mdr << dendl;
- ref->batch_ops[mask]->add_request(mdr);
+ em.first->second->add_request(mdr);
return;
- } else
- ref->batch_ops[mask] = new Batch_Getattr_Lookup(this, mdr, mdcache);
+ }
} else {
CDentry* dn = mdr->dn[0].back();
- if (dn->batch_ops.count(mask)) {
+ auto em = dn->batch_ops.emplace(std::piecewise_construct, std::forward_as_tuple(mask), std::forward_as_tuple());
+ if (em.second) {
+ em.first->second = std::make_unique<Batch_Getattr_Lookup>(this, mdr, mdcache);
+ } else {
dout(20) << __func__ << ": LOOKUP op, wait for previous same getattr ops to respond. " << *mdr << dendl;
- dn->batch_ops[mask]->add_request(mdr);
+ em.first->second->add_request(mdr);
return;
- } else
- dn->batch_ops[mask] = new Batch_Getattr_Lookup(this, mdr, mdcache);
+ }
}
}
mdr->is_batch_head = true;