]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: record purged_snaps for each epoch
authorSage Weil <sage@redhat.com>
Fri, 7 Jun 2019 20:03:28 +0000 (15:03 -0500)
committerSage Weil <sage@redhat.com>
Tue, 2 Jul 2019 13:37:50 +0000 (08:37 -0500)
Only do this if the mons are all running octopus (and thus there is also
a record for all the pre-octopus purged snaps).

Signed-off-by: Sage Weil <sage@redhat.com>
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index d89f37e156a3876a86afcc213ff26fd1dea06852..4cd7b9ab3b4765c6e32ecddb09934e4e32e9e069 100644 (file)
@@ -96,6 +96,8 @@ static const string OSD_SNAP_PREFIX("osd_snap");
   OSD snapshot metadata
   ---------------------
 
+  -- starting with mimic --
+
   "removed_epoch_%llu_%08lx" % (pool, epoch)
    -> interval_set<snapid_t>
 
@@ -110,6 +112,12 @@ static const string OSD_SNAP_PREFIX("osd_snap");
     interval.  e.g., to test if epoch N is removed/purged, we'll find a key
     >= N that either does or doesn't contain the given snap.
 
+
+  -- starting with octopus --
+
+  "purged_epoch_%08lx" % epoch
+  -> map<int64_t,interval_set<snapid_t>>
+
   */
 
 namespace {
@@ -1587,6 +1595,14 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t)
                         t);
     }
   }
+  if (tmp.require_osd_release >= ceph_release_t::octopus &&
+      !pending_inc.new_purged_snaps.empty()) {
+    // all snaps purged this epoch (across all pools)
+    string k = make_purged_snap_epoch_key(pending_inc.epoch);
+    bufferlist v;
+    encode(pending_inc.new_purged_snaps, v);
+    t->put(OSD_SNAP_PREFIX, k, v);
+  }
   for (auto& i : pending_inc.new_purged_snaps) {
     for (auto q = i.second.begin();
         q != i.second.end();
@@ -6211,6 +6227,13 @@ string OSDMonitor::make_removed_snap_epoch_key(int64_t pool, epoch_t epoch)
   return k;
 }
 
+string OSDMonitor::make_purged_snap_epoch_key(epoch_t epoch)
+{
+  char k[80];
+  snprintf(k, sizeof(k), "purged_epoch_%08lx", (unsigned long)epoch);
+  return k;
+}
+
 string OSDMonitor::_make_snap_key(bool purged, int64_t pool, snapid_t snap)
 {
   char k[80];
index 9feea941fe8b18e48b81b1b3e8167b3273285ee7..913965da49cb1cc46c4e83990173cbd75151dd5f 100644 (file)
@@ -505,6 +505,8 @@ private:
   bool _is_pending_removed_snap(int64_t pool_id, snapid_t snapid);
 
   string make_removed_snap_epoch_key(int64_t pool, epoch_t epoch);
+  string make_purged_snap_epoch_key(epoch_t epoch);
+
   string _make_snap_key(bool purged, int64_t pool, snapid_t snap);
   string _make_snap_key_value(bool purged,
                              int64_t pool, snapid_t snap, snapid_t num,