From 2ad319be784edf1f79f9f76f85ad66ba66233fc0 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Thu, 13 Jun 2013 10:08:29 -0700 Subject: [PATCH] PGLog: only iterate over dirty portions of the log Signed-off-by: Samuel Just --- src/osd/PGLog.cc | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/osd/PGLog.cc b/src/osd/PGLog.cc index 17032473b96..53aee37cb6a 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; -- 2.47.3