From: Sage Weil Date: Wed, 4 Mar 2015 23:51:20 +0000 (-0800) Subject: osd: combine info and log writes into single omap_setkeys X-Git-Tag: v9.0.0~67^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=34c7d2c527714443553c8d66c9331ebd9a7ebac6;p=ceph.git osd: combine info and log writes into single omap_setkeys This saves a surprising amount of CPU. Signed-off-by: Sage Weil --- diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 3118db191792..064ffaea9d53 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -2864,11 +2864,11 @@ epoch_t PG::peek_map_epoch(ObjectStore *store, void PG::write_if_dirty(ObjectStore::Transaction& t) { map km; - if (dirty_big_info || dirty_info) { + if (dirty_big_info || dirty_info) prepare_write_info(&km); + pg_log.write_log(t, &km, coll, pgmeta_oid); + if (!km.empty()) t.omap_setkeys(coll, pgmeta_oid, km); - } - pg_log.write_log(t, coll, pgmeta_oid); } void PG::trim_peers() diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index f7cdf6ae6bd0..2f85f1ff0c7a 100644 --- a/src/osd/PGLog.cc +++ b/src/osd/PGLog.cc @@ -711,7 +711,9 @@ void PGLog::check() { } void PGLog::write_log( - ObjectStore::Transaction& t, const coll_t& coll, const ghobject_t &log_oid) + ObjectStore::Transaction& t, + map *km, + const coll_t& coll, const ghobject_t &log_oid) { if (is_dirty()) { dout(10) << "write_log with: " @@ -722,7 +724,7 @@ void PGLog::write_log( << ", trimmed: " << trimmed << dendl; _write_log( - t, log, coll, log_oid, divergent_priors, + t, km, log, coll, log_oid, divergent_priors, dirty_to, dirty_from, writeout_from, @@ -736,19 +738,24 @@ void PGLog::write_log( } } -void PGLog::write_log(ObjectStore::Transaction& t, pg_log_t &log, +void PGLog::write_log( + ObjectStore::Transaction& t, + map *km, + pg_log_t &log, const coll_t& coll, const ghobject_t &log_oid, map &divergent_priors) { _write_log( - t, log, coll, log_oid, + t, km, log, coll, log_oid, divergent_priors, eversion_t::max(), eversion_t(), eversion_t(), set(), true, true, 0); } void PGLog::_write_log( - ObjectStore::Transaction& t, pg_log_t &log, + ObjectStore::Transaction& t, + map *km, + pg_log_t &log, const coll_t& coll, const ghobject_t &log_oid, map &divergent_priors, eversion_t dirty_to, @@ -788,13 +795,12 @@ void PGLog::_write_log( clear_after(log_keys_debug, dirty_from.get_key_name()); } - map keys; for (list::iterator p = log.log.begin(); p != log.log.end() && p->version < dirty_to; ++p) { bufferlist bl(sizeof(*p) * 2); p->encode_with_checksum(bl); - keys[p->get_key_name()].claim(bl); + (*km)[p->get_key_name()].claim(bl); } for (list::reverse_iterator p = log.log.rbegin(); @@ -804,13 +810,15 @@ void PGLog::_write_log( ++p) { bufferlist bl(sizeof(*p) * 2); p->encode_with_checksum(bl); - keys[p->get_key_name()].claim(bl); + (*km)[p->get_key_name()].claim(bl); } if (log_keys_debug) { - for (map::iterator i = keys.begin(); - i != keys.end(); + for (map::iterator i = (*km).begin(); + i != (*km).end(); ++i) { + if (i->first[0] == '_') + continue; assert(!log_keys_debug->count(i->first)); log_keys_debug->insert(i->first); } @@ -818,14 +826,13 @@ void PGLog::_write_log( if (dirty_divergent_priors) { //dout(10) << "write_log: writing divergent_priors" << dendl; - ::encode(divergent_priors, keys["divergent_priors"]); + ::encode(divergent_priors, (*km)["divergent_priors"]); } - ::encode(log.can_rollback_to, keys["can_rollback_to"]); - ::encode(log.rollback_info_trimmed_to, keys["rollback_info_trimmed_to"]); + ::encode(log.can_rollback_to, (*km)["can_rollback_to"]); + ::encode(log.rollback_info_trimmed_to, (*km)["rollback_info_trimmed_to"]); if (!to_remove.empty()) t.omap_rmkeys(coll, log_oid, to_remove); - t.omap_setkeys(coll, log_oid, keys); } void PGLog::read_log(ObjectStore *store, coll_t pg_coll, diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index ecfd1a1a3717..c23eabc6fea3 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -638,15 +638,22 @@ public: pg_info_t &info, LogEntryHandler *rollbacker, bool &dirty_info, bool &dirty_big_info); - void write_log(ObjectStore::Transaction& t, const coll_t& coll, + void write_log(ObjectStore::Transaction& t, + map *km, + const coll_t& coll, const ghobject_t &log_oid); - static void write_log(ObjectStore::Transaction& t, pg_log_t &log, + static void write_log( + ObjectStore::Transaction& t, + map* km, + pg_log_t &log, const coll_t& coll, const ghobject_t &log_oid, map &divergent_priors); static void _write_log( - ObjectStore::Transaction& t, pg_log_t &log, + ObjectStore::Transaction& t, + map* km, + pg_log_t &log, const coll_t& coll, const ghobject_t &log_oid, map &divergent_priors, eversion_t dirty_to, diff --git a/src/tools/ceph_objectstore_tool.cc b/src/tools/ceph_objectstore_tool.cc index f40b724cce13..dc07d0252b3b 100644 --- a/src/tools/ceph_objectstore_tool.cc +++ b/src/tools/ceph_objectstore_tool.cc @@ -830,13 +830,16 @@ int write_info(ObjectStore::Transaction &t, epoch_t epoch, pg_info_t &info, //Empty for this coll_t coll(info.pgid); ghobject_t pgmeta_oid(info.pgid.make_pgmeta_oid()); - int ret = PG::_write_info(t, epoch, + map km; + int ret = PG::_prepare_write_info( + &km, epoch, info, coll, past_intervals, pgmeta_oid, true); if (ret < 0) ret = -ret; if (ret) cerr << "Failed to write info" << std::endl; + t.omap_setkeys(coll, pgmeta_oid, km); return ret; } @@ -848,7 +851,9 @@ int write_pg(ObjectStore::Transaction &t, epoch_t epoch, pg_info_t &info, return ret; map divergent_priors; coll_t coll(info.pgid); - PGLog::write_log(t, log, coll, info.pgid.make_pgmeta_oid(), divergent_priors); + map km; + PGLog::write_log(t, &km, log, coll, info.pgid.make_pgmeta_oid(), divergent_priors); + t.omap_setkeys(coll, info.pgid.make_pgmeta_oid(), km); return 0; }