From 7074ad4a56550f4d146308e1532fbfa7d2d26f0b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 13 Apr 2018 17:16:41 -0500 Subject: [PATCH] osd/PGLog: merge_from helper When merging two logs, we throw out all of the actual log entries. However, we need to convert them to dup ops as appropriate, and merge those together. Reuse the trim code to do this. Signed-off-by: Sage Weil --- src/osd/PGLog.h | 17 +++++++++++++++++ src/osd/osd_types.h | 24 ++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/src/osd/PGLog.h b/src/osd/PGLog.h index ab905da8f34..71e1f6f2ed6 100644 --- a/src/osd/PGLog.h +++ b/src/osd/PGLog.h @@ -750,6 +750,23 @@ public: opg_log->rebuilt_missing_with_deletes = true; } + void merge_from( + const vector& sources, + eversion_t last_update) { + unindex(); + missing.clear(); + + vector slogs; + for (auto s : sources) { + slogs.push_back(&s->log); + } + log.merge_from(slogs, last_update); + + index(); + + mark_log_for_rewrite(); + } + void recover_got(hobject_t oid, eversion_t v, pg_info_t &info) { if (missing.is_missing(oid, v)) { missing.got(oid, v); diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index b2a558fb1d1..b9cec21739e 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -3675,6 +3675,30 @@ public: return divergent; } + void merge_from(const vector& slogs, eversion_t last_update) { + log.clear(); + + // sort and merge dups + multimap sorted; + for (auto& d : dups) { + sorted.emplace(d.version, d); + } + for (auto l : slogs) { + for (auto& d : l->dups) { + sorted.emplace(d.version, d); + } + } + dups.clear(); + for (auto& i : sorted) { + dups.push_back(i.second); + } + + head = last_update; + tail = last_update; + can_rollback_to = last_update; + rollback_info_trimmed_to = last_update; + } + bool empty() const { return log.empty(); } -- 2.39.5