Fix BS_OP_ROLLBACK removing an incorrect version

Instead of only removing versions with oid == X and version > Y it was
also removing the previous version in list (with the previous oid or
with version == Y)
trace-sqes
Vitaliy Filippov 2020-05-23 22:34:40 +03:00
parent 7df384031a
commit d1602b50b3
2 changed files with 5 additions and 6 deletions

View File

@ -171,16 +171,16 @@ resume_5:
rm_start--; rm_start--;
while (1) while (1)
{ {
if (rm_start->first.oid != v->oid) if (rm_start->first.oid != v->oid || rm_start->first.version <= v->version)
break; {
else if (rm_start->first.version <= v->version) rm_start++;
break; break;
}
if (rm_start == dirty_db.begin()) if (rm_start == dirty_db.begin())
break; break;
rm_start--; rm_start--;
} }
if (rm_end != rm_start) erase_dirty(rm_start, rm_end, UINT64_MAX);
erase_dirty(rm_start, rm_end, UINT64_MAX);
} }
journal.trim(); journal.trim();
inflight_writes--; inflight_writes--;

View File

@ -247,7 +247,6 @@ void osd_t::handle_primary_subop(uint64_t opcode, osd_op_t *cur_op, int retval,
{ {
if (op_data->fact_ver != 0 && op_data->fact_ver != version) if (op_data->fact_ver != 0 && op_data->fact_ver != version)
{ {
// FIXME There is still a bug that leads to this exception sometimes :-((
throw std::runtime_error( throw std::runtime_error(
"different fact_versions returned from "+std::string(osd_op_names[opcode])+ "different fact_versions returned from "+std::string(osd_op_names[opcode])+
" subops: "+std::to_string(version)+" vs "+std::to_string(op_data->fact_ver) " subops: "+std::to_string(version)+" vs "+std::to_string(op_data->fact_ver)