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 ab905da8f346..71e1f6f2ed6a 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 b2a558fb1d12..b9cec21739eb 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(); }