From: Samuel Just Date: Thu, 13 Jun 2013 17:08:29 +0000 (-0700) Subject: PGLog: only iterate over dirty portions of the log X-Git-Tag: v0.66~50^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=2ad319be784edf1f79f9f76f85ad66ba66233fc0;p=ceph.git PGLog: only iterate over dirty portions of the log Signed-off-by: Samuel Just --- diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index 17032473b962..53aee37cb6af 100644 --- a/src/osd/PGLog.cc +++ b/src/osd/PGLog.cc @@ -586,20 +586,30 @@ void PGLog::_write_log( map keys; for (list::iterator p = log.log.begin(); - p != log.log.end(); + p != log.log.end() && p->version < dirty_to; ++p) { - if ((p->version < dirty_to) || (p->version >= dirty_from)) { - bufferlist bl(sizeof(*p) * 2); - p->encode_with_checksum(bl); - keys[p->get_key_name()].claim(bl); - - if (log_keys_debug) { - assert(!log_keys_debug->count(p->get_key_name())); - log_keys_debug->insert(p->get_key_name()); - } + bufferlist bl(sizeof(*p) * 2); + p->encode_with_checksum(bl); + keys[p->get_key_name()].claim(bl); + } + + for (list::reverse_iterator p = log.log.rbegin(); + p != log.log.rend() && p->version >= dirty_from && + p->version >= dirty_to; + ++p) { + bufferlist bl(sizeof(*p) * 2); + p->encode_with_checksum(bl); + keys[p->get_key_name()].claim(bl); + } + + if (log_keys_debug) { + for (map::iterator i = keys.begin(); + i != keys.end(); + ++i) { + assert(!log_keys_debug->count(i->first)); + log_keys_debug->insert(i->first); } } -//dout(10) << "write_log " << keys.size() << " keys" << dendl; if (dirty_divergent_priors) { //dout(10) << "write_log: writing divergent_priors" << dendl;