From aa4bba4cd24bce5ba96e3640800eeaf212f24d90 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Fri, 27 Mar 2020 19:06:14 +0800 Subject: [PATCH] mds: move MDRequestImpl::batch_reqs into Batch_Getattr_Lookup Signed-off-by: "Yan, Zheng" (cherry picked from commit 7e59369230e71a541a0a9927513c8ab1c39cf853) --- src/mds/BatchOp.h | 2 +- src/mds/Mutation.h | 1 - src/mds/Server.cc | 53 ++++++++++++++++++++-------------------------- 3 files changed, 24 insertions(+), 32 deletions(-) diff --git a/src/mds/BatchOp.h b/src/mds/BatchOp.h index b54ad969969..bc4e21bcea9 100644 --- a/src/mds/BatchOp.h +++ b/src/mds/BatchOp.h @@ -25,7 +25,7 @@ public: virtual ~BatchOp() {} virtual void add_request(const ceph::ref_t& mdr) = 0; - virtual void set_request(const ceph::ref_t& mdr) = 0; + virtual ceph::ref_t find_new_head() = 0; virtual void print(std::ostream&) = 0; diff --git a/src/mds/Mutation.h b/src/mds/Mutation.h index b80aef2866f..44f901380c3 100644 --- a/src/mds/Mutation.h +++ b/src/mds/Mutation.h @@ -446,7 +446,6 @@ struct MDRequestImpl : public MutationImpl { // indicator for vxattr osdmap update bool waited_for_osdmap = false; - std::vector batch_reqs; protected: void _dump(Formatter *f) const override; void _dump_op_descriptor_unlocked(ostream& stream) const override; diff --git a/src/mds/Server.cc b/src/mds/Server.cc index d2895f0238e..b27b42f03bb 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -82,6 +82,7 @@ class Batch_Getattr_Lookup : public BatchOp { protected: Server* server; ceph::ref_t mdr; + std::vector> batch_reqs; int res = 0; public: Batch_Getattr_Lookup(Server* s, const ceph::ref_t& r) @@ -91,32 +92,43 @@ public: else mdr->batch_op_map = &mdr->in[0]->batch_ops; } - void add_request(const ceph::ref_t& m) override { - mdr->batch_reqs.push_back(m); + void add_request(const ceph::ref_t& r) override { + batch_reqs.push_back(r); } - void set_request(const ceph::ref_t& m) override { - mdr = m; + ceph::ref_t find_new_head() override { + while (!batch_reqs.empty()) { + auto r = std::move(batch_reqs.back()); + batch_reqs.pop_back(); + if (r->killed) + continue; + + r->batch_op_map = mdr->batch_op_map; + mdr->batch_op_map = nullptr; + mdr = r; + return mdr; + } + return nullptr; } void _forward(mds_rank_t t) override { MDCache* mdcache = server->mdcache; mdcache->mds->forward_message_mds(mdr->release_client_request(), t); mdr->set_mds_stamp(ceph_clock_now()); - for (auto& m : mdr->batch_reqs) { + for (auto& m : batch_reqs) { if (!m->killed) mdcache->request_forward(m, t); } - mdr->batch_reqs.clear(); + batch_reqs.clear(); } void _respond(int r) override { mdr->set_mds_stamp(ceph_clock_now()); - for (auto& m : mdr->batch_reqs) { + for (auto& m : batch_reqs) { if (!m->killed) { m->tracei = mdr->tracei; m->tracedn = mdr->tracedn; server->respond_to_request(m, r); } } - mdr->batch_reqs.clear(); + batch_reqs.clear(); server->reply_client_request(mdr, make_message(*mdr->client_request, r)); } void print(std::ostream& o) { @@ -2406,31 +2418,12 @@ void Server::dispatch_client_request(MDRequestRef& mdr) if (mdr->is_batch_head()) { int mask = mdr->client_request->head.args.getattr.mask; auto it = mdr->batch_op_map->find(mask); - - if (!mdr->batch_reqs.empty()) { - MDRequestRef new_batch_head; - for (auto itr = mdr->batch_reqs.cbegin(); itr != mdr->batch_reqs.cend();) { - auto req = *itr; - itr = mdr->batch_reqs.erase(itr); - if (!req->killed) { - new_batch_head = req; - break; - } - } - if (!new_batch_head) { - mdr->batch_op_map->erase(it); - return; - } - - new_batch_head->batch_reqs = std::move(mdr->batch_reqs); - new_batch_head->batch_op_map = mdr->batch_op_map; - mdr->batch_op_map = nullptr; - it->second->set_request(new_batch_head); - mdr = new_batch_head; - } else { + auto new_batch_head = it->second->find_new_head(); + if (!new_batch_head) { mdr->batch_op_map->erase(it); return; } + mdr = std::move(new_batch_head); } else { return; } -- 2.47.3