mirror of
https://github.com/ceph/ceph
synced 2025-02-21 18:17:42 +00:00
osd: combine info and log writes into single omap_setkeys
This saves a surprising amount of CPU. Signed-off-by: Sage Weil <sage@redhat.com>
This commit is contained in:
parent
b486e58695
commit
34c7d2c527
@ -2864,11 +2864,11 @@ epoch_t PG::peek_map_epoch(ObjectStore *store,
|
||||
void PG::write_if_dirty(ObjectStore::Transaction& t)
|
||||
{
|
||||
map<string,bufferlist> 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()
|
||||
|
@ -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<string,bufferlist> *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<string,bufferlist> *km,
|
||||
pg_log_t &log,
|
||||
const coll_t& coll, const ghobject_t &log_oid,
|
||||
map<eversion_t, hobject_t> &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<eversion_t>(),
|
||||
true, true, 0);
|
||||
}
|
||||
|
||||
void PGLog::_write_log(
|
||||
ObjectStore::Transaction& t, pg_log_t &log,
|
||||
ObjectStore::Transaction& t,
|
||||
map<string,bufferlist> *km,
|
||||
pg_log_t &log,
|
||||
const coll_t& coll, const ghobject_t &log_oid,
|
||||
map<eversion_t, hobject_t> &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<string,bufferlist> keys;
|
||||
for (list<pg_log_entry_t>::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<pg_log_entry_t>::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<string, bufferlist>::iterator i = keys.begin();
|
||||
i != keys.end();
|
||||
for (map<string, bufferlist>::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,
|
||||
|
@ -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<string,bufferlist> *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<string,bufferlist>* km,
|
||||
pg_log_t &log,
|
||||
const coll_t& coll,
|
||||
const ghobject_t &log_oid, map<eversion_t, hobject_t> &divergent_priors);
|
||||
|
||||
static void _write_log(
|
||||
ObjectStore::Transaction& t, pg_log_t &log,
|
||||
ObjectStore::Transaction& t,
|
||||
map<string,bufferlist>* km,
|
||||
pg_log_t &log,
|
||||
const coll_t& coll, const ghobject_t &log_oid,
|
||||
map<eversion_t, hobject_t> &divergent_priors,
|
||||
eversion_t dirty_to,
|
||||
|
@ -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<string,bufferlist> 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<eversion_t, hobject_t> divergent_priors;
|
||||
coll_t coll(info.pgid);
|
||||
PGLog::write_log(t, log, coll, info.pgid.make_pgmeta_oid(), divergent_priors);
|
||||
map<string,bufferlist> 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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user