From: Sage Weil Date: Fri, 13 Apr 2018 22:16:41 +0000 (-0500) Subject: osd/PGLog: merge_from helper X-Git-Tag: v14.0.1~371^2~48 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=7074ad4a56550f4d146308e1532fbfa7d2d26f0b;p=ceph.git 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 --- 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(); }