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 <sage@redhat.com>
opg_log->rebuilt_missing_with_deletes = true;
}
+ void merge_from(
+ const vector<PGLog*>& sources,
+ eversion_t last_update) {
+ unindex();
+ missing.clear();
+
+ vector<pg_log_t*> 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);
return divergent;
}
+ void merge_from(const vector<pg_log_t*>& slogs, eversion_t last_update) {
+ log.clear();
+
+ // sort and merge dups
+ multimap<eversion_t,pg_log_dup_t> 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();
}