From 46c5eaf69e68815abbcad8cecbc743aef28b27f0 Mon Sep 17 00:00:00 2001 From: Jianpeng Ma Date: Sat, 3 Feb 2018 00:35:15 +0800 Subject: [PATCH] osd/ReplicatedBackend: only do once encode log_entries for multi MOSDRepOp Encode log_entries is the same work for multi MOSDRepOp and encode is heavy load. Signed-off-by: Jianpeng Ma --- src/osd/ReplicatedBackend.cc | 66 ++++++++++++++++++------------------ src/osd/ReplicatedBackend.h | 2 +- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index 10a7aadaf692f..6f0fcf4f5ca3a 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -961,7 +961,7 @@ Message * ReplicatedBackend::generate_subop( eversion_t pg_roll_forward_to, hobject_t new_temp_oid, hobject_t discard_temp_oid, - const vector &log_entries, + const bufferlist &log_entries, boost::optional &hset_hist, ObjectStore::Transaction &op_t, pg_shard_t peer, @@ -991,7 +991,7 @@ Message * ReplicatedBackend::generate_subop( wr->get_header().data_off = op_t.get_data_alignment(); } - encode(log_entries, wr->logbl); + wr->logbl = log_entries; if (pinfo.is_incomplete()) wr->pg_stats = pinfo.stats; // reflects backfill progress @@ -1021,44 +1021,44 @@ void ReplicatedBackend::issue_op( InProgressOp *op, ObjectStore::Transaction &op_t) { - if (op->op) { - op->op->pg_trace.event("issue replication ops"); - if (parent->get_actingbackfill_shards().size() > 1) { + if (parent->get_actingbackfill_shards().size() > 1) { + if (op->op) { + op->op->pg_trace.event("issue replication ops"); ostringstream ss; set replicas = parent->get_actingbackfill_shards(); replicas.erase(parent->whoami_shard()); ss << "waiting for subops from " << replicas; op->op->mark_sub_op_sent(ss.str()); } - } - for (set::const_iterator i = - parent->get_actingbackfill_shards().begin(); - i != parent->get_actingbackfill_shards().end(); - ++i) { - if (*i == parent->whoami_shard()) continue; - pg_shard_t peer = *i; - const pg_info_t &pinfo = parent->get_shard_info().find(peer)->second; - - Message *wr; - wr = generate_subop( - soid, - at_version, - tid, - reqid, - pg_trim_to, - pg_roll_forward_to, - new_temp_oid, - discard_temp_oid, - log_entries, - hset_hist, - op_t, - peer, - pinfo); - if (op->op && op->op->pg_trace) - wr->trace.init("replicated op", nullptr, &op->op->pg_trace); - get_parent()->send_message_osd_cluster( - peer.osd, wr, get_osdmap()->get_epoch()); + // avoid doing the same work in generate_subop + bufferlist logs; + encode(log_entries, logs); + + for (const auto& shard : get_parent()->get_actingbackfill_shards()) { + if (shard == parent->whoami_shard()) continue; + const pg_info_t &pinfo = parent->get_shard_info().find(shard)->second; + + Message *wr; + wr = generate_subop( + soid, + at_version, + tid, + reqid, + pg_trim_to, + pg_roll_forward_to, + new_temp_oid, + discard_temp_oid, + logs, + hset_hist, + op_t, + shard, + pinfo); + if (op->op && op->op->pg_trace) + wr->trace.init("replicated op", nullptr, &op->op->pg_trace); + get_parent()->send_message_osd_cluster( + shard.osd, wr, get_osdmap()->get_epoch()); + } } } diff --git a/src/osd/ReplicatedBackend.h b/src/osd/ReplicatedBackend.h index 7c29bba725d1d..f2a648793273d 100644 --- a/src/osd/ReplicatedBackend.h +++ b/src/osd/ReplicatedBackend.h @@ -383,7 +383,7 @@ private: eversion_t pg_roll_forward_to, hobject_t new_temp_oid, hobject_t discard_temp_oid, - const vector &log_entries, + const bufferlist &log_entries, boost::optional &hset_history, ObjectStore::Transaction &op_t, pg_shard_t peer, -- 2.39.5