From 24dd3ee903e521b65657c4c2d421bc59e19bc51e Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 9 Jun 2009 10:36:03 -0700 Subject: [PATCH] osd: repair out of order logs in read_log Works around bug fixed in f1ff93. --- src/osd/PG.cc | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/osd/PG.cc b/src/osd/PG.cc index 6178dac76b03b..1ca3a4f42d589 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -1800,12 +1800,24 @@ void PG::read_log(ObjectStore *store) PG::Log::Entry e; bufferlist::iterator p = bl.begin(); assert(log.log.empty()); + eversion_t last; + bool reorder = false; while (!p.end()) { loff_t opos = ondisklog.bottom + p.get_off(); ::decode(e, p); loff_t pos = ondisklog.bottom + p.get_off(); dout(10) << "read_log " << pos << " " << e << dendl; + // [repair] in order? + if (e.version < last) { + dout(0) << "read_log " << pos << " out of order entry " << e << " follows " << last << dendl; + stringstream ss; + ss << info.pgid << " log has out of order entry " << e << " following " << last; + osd->get_logclient()->log(LOG_ERROR, ss); + reorder = true; + } + last = e.version; + if (e.version > log.bottom || log.backlog) { // ignore items below log.bottom if (opos % 4096 < pos % 4096) ondisklog.block_map[opos] = e.version; @@ -1813,8 +1825,30 @@ void PG::read_log(ObjectStore *store) } else { dout(10) << "read_log ignoring entry at " << pos << dendl; } + + // [repair] at end of log? + if (!p.end() && e.version == info.last_update) { + stringstream ss; + ss << info.pgid << " log has extra data at " << pos << "~" << (ondisklog.top-pos) + << " after " << info.last_update; + osd->get_logclient()->log(LOG_ERROR, ss); + dout(0) << "read_log " << pos << " *** extra gunk at end of log, adjusting ondisklog.top" << dendl; + ondisklog.top = opos; + break; + } + } + + if (reorder) { + dout(0) << "read_log reordering log" << dendl; + map m; + for (list::iterator p = log.log.begin(); p != log.log.end(); p++) + m[p->version] = *p; + log.log.clear(); + for (map::iterator p = m.begin(); p != m.end(); p++) + log.log.push_back(p->second); } } + log.top = info.last_update; log.index(); -- 2.39.5