]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/PGLog: merge_from helper
authorSage Weil <sage@redhat.com>
Fri, 13 Apr 2018 22:16:41 +0000 (17:16 -0500)
committerSage Weil <sage@redhat.com>
Fri, 7 Sep 2018 17:08:40 +0000 (12:08 -0500)
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>
src/osd/PGLog.h
src/osd/osd_types.h

index ab905da8f346bb105c3e8b3dc58a50502c9d24c2..71e1f6f2ed6a7c53b30d156f30e744212d09917d 100644 (file)
@@ -750,6 +750,23 @@ public:
       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);
index b2a558fb1d1213c87d121544f630a49a387eac03..b9cec21739eb595f6af18e4b1aa9e3dd756122da 100644 (file)
@@ -3675,6 +3675,30 @@ public:
     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();
   }