]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: record pre-octopus purged snaps with first octopus map
authorSage Weil <sage@redhat.com>
Fri, 7 Jun 2019 21:08:27 +0000 (16:08 -0500)
committerSage Weil <sage@redhat.com>
Tue, 2 Jul 2019 13:37:50 +0000 (08:37 -0500)
When we public our first require_osd_release >= octopus osdmap, record
all prior purged snaps in a key linked to the previous osdmap.  We assume
this will encode and fit into a single key and transaction because the
even larger set of removed_snaps is already a member of pg_pool_t, which
is included in every osdmap.

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

index 4cd7b9ab3b4765c6e32ecddb09934e4e32e9e069..1811139fad50c30a691b293e41bc8741bb00e83d 100644 (file)
@@ -1495,6 +1495,45 @@ void OSDMonitor::encode_pending(MonitorDBStore::TransactionRef t)
                 << dendl;
        pending_inc.new_pools[poolid].removed_snaps.clear();
       }
+
+      // create a combined purged snap epoch key for all purged snaps
+      // prior to this epoch, and store it in the current epoch (i.e.,
+      // the last pre-octopus epoch, just prior to the one we're
+      // encoding now).
+      auto it = mon->store->get_iterator(OSD_SNAP_PREFIX);
+      it->lower_bound("purged_snap_");
+      map<int64_t,snap_interval_set_t> combined;
+      while (it->valid()) {
+       if (it->key().find("purged_snap_") != 0) {
+         break;
+       }
+       string k = it->key();
+       long long unsigned pool;
+       int n = sscanf(k.c_str(), "purged_snap_%llu_", &pool);
+       if (n != 1) {
+         derr << __func__ << " invalid purged_snaps key '" << k << "'" << dendl;
+       } else {
+         bufferlist v = it->value();
+         auto p = v.cbegin();
+         snapid_t begin, end;
+         ceph::decode(begin, p);
+         ceph::decode(end, p);
+         combined[pool].insert(begin, end - begin);
+       }
+       it->next();
+      }
+      if (!combined.empty()) {
+       string k = make_purged_snap_epoch_key(pending_inc.epoch - 1);
+       bufferlist v;
+       ceph::encode(combined, v);
+       t->put(OSD_SNAP_PREFIX, k, v);
+       dout(10) << __func__ << " recording pre-octopus purged_snaps in epoch "
+                << (pending_inc.epoch - 1) << ", " << v.length() << " bytes"
+                << dendl;
+      } else {
+       dout(10) << __func__ << " there were no pre-octopus purged snaps"
+                << dendl;
+      }
     }
   }