From c165c5286a58975b81cb706b4d48d6600e399d0a Mon Sep 17 00:00:00 2001 From: xie xingguo Date: Mon, 26 Aug 2019 10:28:34 +0800 Subject: [PATCH] osd/osd_types: add_next_event - add special handler for lost_revert For unfound objects, we might append LOST_REVERT log entries, which shall allow these objects to be reverted to the newest available version later. However, we are currently lack of support to rewind the clean_regions portion too when marking unfound objects as lost with inc-recovery mode enabled. Hence we must mark these unfound-revert objects as fully dirty to make sure they can be correctly recovered. E.g.,: - primary is pulling object A from replica 1 - object A is corrupted on replica 1 - object A is now unfound - mark object A as lost, replica 1 will persist a wrong missing item for object A.. Signed-off-by: xie xingguo --- src/osd/osd_types.h | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index 85f3119dd60..f2b6ff3b7e1 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -4466,7 +4466,7 @@ public: if (e.prior_version == eversion_t() || e.is_clone()) { // new object. if (is_missing_divergent_item) { // use iterator - rmissing.erase((missing_it->second).need.version); + rmissing.erase(missing_it->second.need.version); // .have = nil missing_it->second = item(e.version, eversion_t(), e.is_delete()); missing_it->second.clean_regions.mark_fully_dirty(); @@ -4479,14 +4479,20 @@ public: } else if (is_missing_divergent_item) { // already missing (prior). rmissing.erase((missing_it->second).need.version); - (missing_it->second).need = e.version; // leave .have unchanged. - (missing_it->second).set_delete(e.is_delete()); - (missing_it->second).clean_regions.merge(e.clean_regions); + missing_it->second.need = e.version; // leave .have unchanged. + missing_it->second.set_delete(e.is_delete()); + if (e.is_lost_revert()) + missing_it->second.clean_regions.mark_fully_dirty(); + else + missing_it->second.clean_regions.merge(e.clean_regions); } else { // not missing, we must have prior_version (if any) ceph_assert(!is_missing_divergent_item); missing[e.soid] = item(e.version, e.prior_version, e.is_delete()); - missing[e.soid].clean_regions = e.clean_regions; + if (e.is_lost_revert()) + missing[e.soid].clean_regions.mark_fully_dirty(); + else + missing[e.soid].clean_regions = e.clean_regions; } rmissing[e.version.version] = e.soid; tracker.changed(e.soid); @@ -4496,9 +4502,9 @@ public: auto p = missing.find(oid); if (p != missing.end()) { rmissing.erase((p->second).need.version); - (p->second).need = need; // no not adjust .have - (p->second).set_delete(is_delete); - (p->second).clean_regions.mark_fully_dirty(); + p->second.need = need; // do not adjust .have + p->second.set_delete(is_delete); + p->second.clean_regions.mark_fully_dirty(); } else { missing[oid] = item(need, eversion_t(), is_delete); missing[oid].clean_regions.mark_fully_dirty(); -- 2.39.5