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:
Sage Weil 2015-03-04 15:51:20 -08:00
parent b486e58695
commit 34c7d2c527
4 changed files with 41 additions and 22 deletions

View File

@ -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()

View File

@ -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,

View File

@ -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,

View File

@ -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;
}