From 5b3cfc0890d36d8b2b8ef6742e71f6afb4aef444 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 6 Jun 2017 16:49:11 -0400 Subject: [PATCH 1/4] osd: move pglog to osd_pglog mempool This actually everything in the osd mempool, so it's basically a rename. Signed-off-by: Sage Weil --- src/include/mempool.h | 1 + src/messages/MOSDPGUpdateLogMissing.h | 4 ++-- src/osd/PG.cc | 4 ++-- src/osd/PG.h | 4 ++-- src/osd/PGLog.cc | 2 +- src/osd/PGLog.h | 24 ++++++++++++------------ src/osd/PrimaryLogPG.cc | 6 +++--- src/osd/PrimaryLogPG.h | 2 +- src/osd/osd_types.h | 12 ++++++------ 9 files changed, 30 insertions(+), 29 deletions(-) diff --git a/src/include/mempool.h b/src/include/mempool.h index 6ae5740c2caf2..b0f29baa00bcc 100644 --- a/src/include/mempool.h +++ b/src/include/mempool.h @@ -150,6 +150,7 @@ namespace mempool { f(buffer_meta) \ f(osd) \ f(osd_mapbl) \ + f(osd_pglog) \ f(osdmap) \ f(osdmap_mapping) \ f(pgmap) \ diff --git a/src/messages/MOSDPGUpdateLogMissing.h b/src/messages/MOSDPGUpdateLogMissing.h index facb65bc854fd..7823fd08f7343 100644 --- a/src/messages/MOSDPGUpdateLogMissing.h +++ b/src/messages/MOSDPGUpdateLogMissing.h @@ -29,7 +29,7 @@ class MOSDPGUpdateLogMissing : public MOSDFastDispatchOp { spg_t pgid; shard_id_t from; ceph_tid_t rep_tid; - mempool::osd::list entries; + mempool::osd_pglog::list entries; epoch_t get_epoch() const { return map_epoch; } spg_t get_pgid() const { return pgid; } @@ -50,7 +50,7 @@ class MOSDPGUpdateLogMissing : public MOSDFastDispatchOp { : MOSDFastDispatchOp(MSG_OSD_PG_UPDATE_LOG_MISSING, HEAD_VERSION, COMPAT_VERSION) { } MOSDPGUpdateLogMissing( - const mempool::osd::list &entries, + const mempool::osd_pglog::list &entries, spg_t pgid, shard_id_t from, epoch_t epoch, diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 994cb9095ff26..c186548a6c69b 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -4928,7 +4928,7 @@ void PG::share_pg_info() } bool PG::append_log_entries_update_missing( - const mempool::osd::list &entries, + const mempool::osd_pglog::list &entries, ObjectStore::Transaction &t) { assert(!entries.empty()); @@ -4955,7 +4955,7 @@ bool PG::append_log_entries_update_missing( void PG::merge_new_log_entries( - const mempool::osd::list &entries, + const mempool::osd_pglog::list &entries, ObjectStore::Transaction &t) { dout(10) << __func__ << " " << entries << dendl; diff --git a/src/osd/PG.h b/src/osd/PG.h index c452fbb0c9539..f40b9aa4df225 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -2382,7 +2382,7 @@ class PG : public DoutPrefixProvider { bool append_log_entries_update_missing( - const mempool::osd::list &entries, + const mempool::osd_pglog::list &entries, ObjectStore::Transaction &t); /** @@ -2390,7 +2390,7 @@ class PG : public DoutPrefixProvider { * actingbackfill logs and missings (also missing_loc) */ void merge_new_log_entries( - const mempool::osd::list &entries, + const mempool::osd_pglog::list &entries, ObjectStore::Transaction &t); void reset_interval_flush(); diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index 63e1cdfc02629..e85c6cc3333a3 100644 --- a/src/osd/PGLog.cc +++ b/src/osd/PGLog.cc @@ -368,7 +368,7 @@ void PGLog::merge_log(pg_info_t &oinfo, pg_log_t &olog, pg_shard_t fromosd, } log.roll_forward_to(log.head, rollbacker); - mempool::osd::list new_entries; + mempool::osd_pglog::list new_entries; new_entries.splice(new_entries.end(), olog.log, from, to); append_log_entries_update_missing( info.last_backfill, diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index d4dfc450a42bf..490bd28797a2b 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -97,7 +97,7 @@ struct PGLog : DoutPrefixProvider { * It's a reverse_iterator because rend() is a natural representation for * tail, and rbegin() works nicely for head. */ - mempool::osd::list::reverse_iterator + mempool::osd_pglog::list::reverse_iterator rollback_info_trimmed_to_riter; template @@ -179,7 +179,7 @@ struct PGLog : DoutPrefixProvider { advance_can_rollback_to(head, [&](const pg_log_entry_t &entry) {}); } - mempool::osd::list rewind_from_head(eversion_t newhead) { + mempool::osd_pglog::list rewind_from_head(eversion_t newhead) { auto divergent = pg_log_t::rewind_from_head(newhead); index(); reset_rollback_info_trimmed_to_riter(); @@ -712,10 +712,10 @@ struct PGLog : DoutPrefixProvider { protected: static void split_by_object( - mempool::osd::list &entries, - map> *out_entries) { + mempool::osd_pglog::list &entries, + map> *out_entries) { while (!entries.empty()) { - mempool::osd::list &out_list = (*out_entries)[entries.front().soid]; + auto &out_list = (*out_entries)[entries.front().soid]; out_list.splice(out_list.end(), entries, entries.begin()); } } @@ -744,7 +744,7 @@ struct PGLog : DoutPrefixProvider { static void _merge_object_divergent_entries( const IndexedLog &log, ///< [in] log to merge against const hobject_t &hoid, ///< [in] object we are merging - const mempool::osd::list &entries, ///< [in] entries for hoid to merge + const mempool::osd_pglog::list &entries, ///< [in] entries for hoid to merge const pg_info_t &info, ///< [in] info for merging entries eversion_t olog_can_rollback_to, ///< [in] rollback boundary missing_type &missing, ///< [in,out] missing to adjust, use @@ -926,16 +926,16 @@ struct PGLog : DoutPrefixProvider { template static void _merge_divergent_entries( const IndexedLog &log, ///< [in] log to merge against - mempool::osd::list &entries, ///< [in] entries to merge + mempool::osd_pglog::list &entries, ///< [in] entries to merge const pg_info_t &oinfo, ///< [in] info for merging entries eversion_t olog_can_rollback_to, ///< [in] rollback boundary missing_type &omissing, ///< [in,out] missing to adjust, use LogEntryHandler *rollbacker, ///< [in] optional rollbacker object const DoutPrefixProvider *dpp ///< [in] logging provider ) { - map > split; + map > split; split_by_object(entries, &split); - for (map>::iterator i = split.begin(); + for (map>::iterator i = split.begin(); i != split.end(); ++i) { _merge_object_divergent_entries( @@ -959,7 +959,7 @@ struct PGLog : DoutPrefixProvider { const pg_log_entry_t& oe, const pg_info_t& info, LogEntryHandler *rollbacker) { - mempool::osd::list entries; + mempool::osd_pglog::list entries; entries.push_back(oe); _merge_object_divergent_entries( log, @@ -988,7 +988,7 @@ struct PGLog : DoutPrefixProvider { static bool append_log_entries_update_missing( const hobject_t &last_backfill, bool last_backfill_bitwise, - const mempool::osd::list &entries, + const mempool::osd_pglog::list &entries, bool maintain_rollback, IndexedLog *log, missing_type &missing, @@ -1024,7 +1024,7 @@ struct PGLog : DoutPrefixProvider { bool append_new_log_entries( const hobject_t &last_backfill, bool last_backfill_bitwise, - const mempool::osd::list &entries, + const mempool::osd_pglog::list &entries, LogEntryHandler *rollbacker) { bool invalidate_stats = append_log_entries_update_missing( last_backfill, diff --git a/src/osd/PrimaryLogPG.cc b/src/osd/PrimaryLogPG.cc index 87616ae48a706..a097782ab5bad 100644 --- a/src/osd/PrimaryLogPG.cc +++ b/src/osd/PrimaryLogPG.cc @@ -2358,7 +2358,7 @@ void PrimaryLogPG::record_write_error(OpRequestRef op, const hobject_t &soid, assert(op->may_write()); const osd_reqid_t &reqid = static_cast(op->get_req())->get_reqid(); ObjectContextRef obc; - mempool::osd::list entries; + mempool::osd_pglog::list entries; entries.push_back(pg_log_entry_t(pg_log_entry_t::ERROR, soid, get_next_version(), eversion_t(), 0, reqid, utime_t(), r)); @@ -9212,7 +9212,7 @@ void PrimaryLogPG::simple_opc_submit(OpContextUPtr ctx) void PrimaryLogPG::submit_log_entries( - const mempool::osd::list &entries, + const mempool::osd_pglog::list &entries, ObcLockManager &&manager, boost::optional > &&_on_complete, OpRequestRef op, @@ -10382,7 +10382,7 @@ void PrimaryLogPG::mark_all_unfound_lost( pg_log.get_log().print(*_dout); *_dout << dendl; - mempool::osd::list log_entries; + mempool::osd_pglog::list log_entries; utime_t mtime = ceph_clock_now(); map::const_iterator m = diff --git a/src/osd/PrimaryLogPG.h b/src/osd/PrimaryLogPG.h index cb2127bc76055..16ea3922079fa 100644 --- a/src/osd/PrimaryLogPG.h +++ b/src/osd/PrimaryLogPG.h @@ -864,7 +864,7 @@ class PrimaryLogPG : public PG, public PGBackend::Listener { * Also used to store error log entries for dup detection. */ void submit_log_entries( - const mempool::osd::list &entries, + const mempool::osd_pglog::list &entries, ObcLockManager &&manager, boost::optional > &&on_complete, OpRequestRef op = OpRequestRef(), diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 4c4f98c705e00..2dfe6d5592e3a 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -3412,14 +3412,14 @@ struct pg_log_t { eversion_t rollback_info_trimmed_to; public: - mempool::osd::list log; // the actual log. + mempool::osd_pglog::list log; // the actual log. pg_log_t() = default; pg_log_t(const eversion_t &last_update, const eversion_t &log_tail, const eversion_t &can_rollback_to, const eversion_t &rollback_info_trimmed_to, - mempool::osd::list &&entries) + mempool::osd_pglog::list &&entries) : head(last_update), tail(log_tail), can_rollback_to(can_rollback_to), rollback_info_trimmed_to(rollback_info_trimmed_to), log(std::move(entries)) {} @@ -3450,7 +3450,7 @@ struct pg_log_t { pg_log_t split_out_child(pg_t child_pgid, unsigned split_bits) { - mempool::osd::list oldlog, childlog; + mempool::osd_pglog::list oldlog, childlog; oldlog.swap(log); eversion_t old_tail; @@ -3474,11 +3474,11 @@ struct pg_log_t { std::move(childlog)); } - mempool::osd::list rewind_from_head(eversion_t newhead) { + mempool::osd_pglog::list rewind_from_head(eversion_t newhead) { assert(newhead >= tail); - mempool::osd::list::iterator p = log.end(); - mempool::osd::list divergent; + mempool::osd_pglog::list::iterator p = log.end(); + mempool::osd_pglog::list divergent; while (true) { if (p == log.begin()) { // yikes, the whole thing is divergent! From b7f52618308220df4219fcfbbac61a0f31f416d0 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 6 Jun 2017 16:50:22 -0400 Subject: [PATCH 2/4] osd: map ObjectModDesc to osd_pglog pool This can consume significant space for EC pools. Signed-off-by: Sage Weil --- src/osd/osd_types.cc | 1 + src/osd/osd_types.h | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index e1d7d34ea1c3b..c0ec1f8fc3c82 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -3878,6 +3878,7 @@ void ObjectModDesc::decode(bufferlist::iterator &_bl) ::decode(bl, _bl); // ensure bl does not pin a larger buffer in memory bl.rebuild(); + bl.reassign_to_mempool(mempool::mempool_osd_pglog); DECODE_FINISH(_bl); } diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 2dfe6d5592e3a..c2cd5612d9b6e 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -3126,7 +3126,9 @@ class ObjectModDesc { TRY_DELETE = 6, ROLLBACK_EXTENTS = 7 }; - ObjectModDesc() : can_local_rollback(true), rollback_info_completed(false) {} + ObjectModDesc() : can_local_rollback(true), rollback_info_completed(false) { + bl.reassign_to_mempool(mempool::mempool_osd_pglog); + } void claim(ObjectModDesc &other) { bl.clear(); bl.claim(other.bl); From b322be3be5eaffe693920e4c7c3585e4b07861ff Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 6 Jun 2017 16:55:23 -0400 Subject: [PATCH 3/4] osd: put pg_log_entry_t::snaps in osd_pglog mempool Signed-off-by: Sage Weil --- src/osd/ECTransaction.cc | 1 + src/osd/ReplicatedBackend.cc | 1 + src/osd/osd_types.cc | 1 + src/osd/osd_types.h | 9 ++++++--- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/osd/ECTransaction.cc b/src/osd/ECTransaction.cc index 91fbf5a58d9c0..b23174f67fdf6 100644 --- a/src/osd/ECTransaction.cc +++ b/src/osd/ECTransaction.cc @@ -169,6 +169,7 @@ void ECTransaction::generate_transactions( bufferlist bl(op.updated_snaps->second.size() * 8 + 8); ::encode(op.updated_snaps->second, bl); entry->snaps.swap(bl); + entry->snaps.reassign_to_mempool(mempool::mempool_osd_pglog); } ldpp_dout(dpp, 20) << "generate_transactions: " diff --git a/src/osd/ReplicatedBackend.cc b/src/osd/ReplicatedBackend.cc index e092ca630108a..07c0d316cf6d1 100644 --- a/src/osd/ReplicatedBackend.cc +++ b/src/osd/ReplicatedBackend.cc @@ -361,6 +361,7 @@ void generate_transaction( bufferlist bl(oiter->second.updated_snaps->second.size() * 8 + 8); ::encode(oiter->second.updated_snaps->second, bl); le.snaps.swap(bl); + le.snaps.reassign_to_mempool(mempool::mempool_osd_pglog); } } diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index c0ec1f8fc3c82..7f450005c5bdf 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -3982,6 +3982,7 @@ void pg_log_entry_t::decode(bufferlist::iterator &bl) ::decode(snaps, bl); // ensure snaps does not pin a larger buffer in memory snaps.rebuild(); + snaps.reassign_to_mempool(mempool::mempool_osd_pglog); } if (struct_v >= 8) diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index c2cd5612d9b6e..cc00d2a75d163 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -3319,7 +3319,9 @@ struct pg_log_entry_t { pg_log_entry_t() : user_version(0), return_code(0), op(0), - invalid_hash(false), invalid_pool(false) {} + invalid_hash(false), invalid_pool(false) { + snaps.reassign_to_mempool(mempool::mempool_osd_pglog); + } pg_log_entry_t(int _op, const hobject_t& _soid, const eversion_t& v, const eversion_t& pv, version_t uv, @@ -3327,8 +3329,9 @@ struct pg_log_entry_t { int return_code) : soid(_soid), reqid(rid), version(v), prior_version(pv), user_version(uv), mtime(mt), return_code(return_code), op(_op), - invalid_hash(false), invalid_pool(false) - {} + invalid_hash(false), invalid_pool(false) { + snaps.reassign_to_mempool(mempool::mempool_osd_pglog); + } bool is_clone() const { return op == CLONE; } bool is_modify() const { return op == MODIFY; } From 85887a7a0a40d338ce537d3323d914bcb90cec91 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 6 Jun 2017 21:57:04 -0400 Subject: [PATCH 4/4] osd/osd_types: put pg_log_entry_t::extra_reqids in osd_pglog mempool Signed-off-by: Sage Weil --- src/osd/PGLog.h | 17 ++++++----------- src/osd/PrimaryLogPG.h | 4 ++-- src/osd/osd_types.cc | 5 ++--- src/osd/osd_types.h | 4 ++-- src/osdc/Objecter.h | 6 +++--- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index 490bd28797a2b..176a682b6a4e8 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -284,8 +284,7 @@ struct PGLog : DoutPrefixProvider { } p = extra_caller_ops.find(r); if (p != extra_caller_ops.end()) { - for (vector >::const_iterator i = - p->second->extra_reqids.begin(); + for (auto i = p->second->extra_reqids.begin(); i != p->second->extra_reqids.end(); ++i) { if (i->first == r) { @@ -302,7 +301,7 @@ struct PGLog : DoutPrefixProvider { /// get a (bounded) list of recent reqids for the given object void get_object_reqids(const hobject_t& oid, unsigned max, - vector > *pls) const { + mempool::osd_pglog::vector > *pls) const { // make sure object is present at least once before we do an // O(n) search. if (!(indexed_data & PGLOG_INDEXED_OBJECTS)) { @@ -351,8 +350,7 @@ struct PGLog : DoutPrefixProvider { } if (to_index & PGLOG_INDEXED_EXTRA_CALLER_OPS) { - for (vector >::const_iterator j = - i->extra_reqids.begin(); + for (auto j = i->extra_reqids.begin(); j != i->extra_reqids.end(); ++j) { extra_caller_ops.insert( @@ -389,8 +387,7 @@ struct PGLog : DoutPrefixProvider { } } if (indexed_data & PGLOG_INDEXED_EXTRA_CALLER_OPS) { - for (vector >::const_iterator j = - e.extra_reqids.begin(); + for (auto j = e.extra_reqids.begin(); j != e.extra_reqids.end(); ++j) { extra_caller_ops.insert(make_pair(j->first, &e)); @@ -417,8 +414,7 @@ struct PGLog : DoutPrefixProvider { } } if (indexed_data & PGLOG_INDEXED_EXTRA_CALLER_OPS) { - for (vector >::const_iterator j = - e.extra_reqids.begin(); + for (auto j = e.extra_reqids.begin(); j != e.extra_reqids.end(); ++j) { for (ceph::unordered_multimap::iterator k = @@ -465,8 +461,7 @@ struct PGLog : DoutPrefixProvider { } if (indexed_data & PGLOG_INDEXED_EXTRA_CALLER_OPS) { - for (vector >::const_iterator j = - e.extra_reqids.begin(); + for (auto j = e.extra_reqids.begin(); j != e.extra_reqids.end(); ++j) { extra_caller_ops.insert(make_pair(j->first, &(log.back()))); diff --git a/src/osd/PrimaryLogPG.h b/src/osd/PrimaryLogPG.h index 16ea3922079fa..f6c1b97d8a361 100644 --- a/src/osd/PrimaryLogPG.h +++ b/src/osd/PrimaryLogPG.h @@ -91,7 +91,7 @@ class PrimaryLogPG : public PG, public PGBackend::Listener { uint32_t flags; // object_copy_data_t::FLAG_* uint32_t source_data_digest, source_omap_digest; uint32_t data_digest, omap_digest; - vector > reqids; // [(reqid, user_version)] + mempool::osd_pglog::vector > reqids; // [(reqid, user_version)] map attrs; // xattrs uint64_t truncate_seq; uint64_t truncate_size; @@ -530,7 +530,7 @@ class PrimaryLogPG : public PG, public PGBackend::Listener { int num_read; ///< count read ops int num_write; ///< count update ops - vector > extra_reqids; + mempool::osd_pglog::vector > extra_reqids; CopyFromCallback *copy_cb; diff --git a/src/osd/osd_types.cc b/src/osd/osd_types.cc index 7f450005c5bdf..dcfe790567ffd 100644 --- a/src/osd/osd_types.cc +++ b/src/osd/osd_types.cc @@ -4009,8 +4009,7 @@ void pg_log_entry_t::dump(Formatter *f) const f->dump_stream("prior_version") << prior_version; f->dump_stream("reqid") << reqid; f->open_array_section("extra_reqids"); - for (vector >::const_iterator p = - extra_reqids.begin(); + for (auto p = extra_reqids.begin(); p != extra_reqids.end(); ++p) { f->open_object_section("extra_reqid"); @@ -4444,7 +4443,7 @@ void object_copy_data_t::dump(Formatter *f) const f->dump_unsigned("snap", *p); f->close_section(); f->open_array_section("reqids"); - for (vector >::const_iterator p = reqids.begin(); + for (auto p = reqids.begin(); p != reqids.end(); ++p) { f->open_object_section("extra_reqid"); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index cc00d2a75d163..3e2128e414ed8 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -3307,7 +3307,7 @@ struct pg_log_entry_t { bufferlist snaps; // only for clone entries hobject_t soid; osd_reqid_t reqid; // caller+tid to uniquely identify request - vector > extra_reqids; + mempool::osd_pglog::vector > extra_reqids; eversion_t version, prior_version, reverting_to; version_t user_version; // the user version for this entry utime_t mtime; // this is the _user_ mtime, mind you @@ -4157,7 +4157,7 @@ struct object_copy_data_t { snapid_t snap_seq; ///< recent reqids on this object - vector > reqids; + mempool::osd_pglog::vector > reqids; uint64_t truncate_seq; uint64_t truncate_size; diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 2c9ee772431be..11319aa0f0b2f 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -727,7 +727,7 @@ struct ObjectOperation { uint32_t *out_flags; uint32_t *out_data_digest; uint32_t *out_omap_digest; - vector > *out_reqids; + mempool::osd_pglog::vector > *out_reqids; uint64_t *out_truncate_seq; uint64_t *out_truncate_size; int *prval; @@ -742,7 +742,7 @@ struct ObjectOperation { uint32_t *flags, uint32_t *dd, uint32_t *od, - vector > *oreqids, + mempool::osd_pglog::vector > *oreqids, uint64_t *otseq, uint64_t *otsize, int *r) @@ -817,7 +817,7 @@ struct ObjectOperation { uint32_t *out_flags, uint32_t *out_data_digest, uint32_t *out_omap_digest, - vector > *out_reqids, + mempool::osd_pglog::vector > *out_reqids, uint64_t *truncate_seq, uint64_t *truncate_size, int *prval) {