diff options
author | Samuel Just <sam.just@inktank.com> | 2013-06-13 10:08:29 -0700 |
---|---|---|
committer | Samuel Just <sam.just@inktank.com> | 2013-06-17 14:50:53 -0700 |
commit | 2ad319be784edf1f79f9f76f85ad66ba66233fc0 (patch) | |
tree | 1bf04715449502dae3818e56e9090e4c7efd9d45 | |
parent | 962b64a83037ff79855c5261325de0cd1541f582 (diff) | |
download | ceph-2ad319be784edf1f79f9f76f85ad66ba66233fc0.tar.gz |
PGLog: only iterate over dirty portions of the log
Signed-off-by: Samuel Just <sam.just@inktank.com>
-rw-r--r-- | src/osd/PGLog.cc | 32 |
1 files 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<string,bufferlist> keys; for (list<pg_log_entry_t>::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<pg_log_entry_t>::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<string, bufferlist>::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; |