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 ab905da8f346b..71e1f6f2ed6a7 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 b2a558fb1d121..b9cec21739eb5 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