osd: make assemble_backlog more tolerant of races

The assemble_backlog is merging data generated while racing with online
updates.  It needs to tolerate races with things like delete.  For example,
- generate_backlog identifies object A
- client deletes+logs A
- assemble_backlog sees A deletion entry.
We may want to merge the backlog entry in this case.
This commit is contained in:
Sage Weil 2010-07-23 12:57:52 -07:00
parent 9520917de4
commit b2194357d8

View File

@ -615,6 +615,8 @@ void PG::assemble_backlog(map<eversion_t,Log::Entry>& omap)
while (i != omap.end()) {
Log::Entry& be = i->second;
dout(15) << " " << be << dendl;
/*
* we can skip an object if
* - is already in the log AND
@ -625,11 +627,9 @@ void PG::assemble_backlog(map<eversion_t,Log::Entry>& omap)
if (log.objects.count(be.soid)) {
Log::Entry *le = log.objects[be.soid];
assert(!le->is_delete()); // if it's a deletion, we are corrupt..
// note the prior version
if (le->prior_version == eversion_t() || // either new object, or
le->prior_version >= log.tail) { // prior_version also already in log
le->prior_version >= log.tail) { // prior_version also already in log
dout(15) << " skipping " << be << " (have " << *le << ")" << dendl;
} else {
be.version = le->prior_version;