summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Just <sam.just@inktank.com>2013-06-13 10:08:29 -0700
committerSamuel Just <sam.just@inktank.com>2013-06-17 14:50:53 -0700
commit2ad319be784edf1f79f9f76f85ad66ba66233fc0 (patch)
tree1bf04715449502dae3818e56e9090e4c7efd9d45
parent962b64a83037ff79855c5261325de0cd1541f582 (diff)
downloadceph-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.cc32
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;