From: Sage Weil Date: Fri, 7 Jun 2019 21:08:27 +0000 (-0500) Subject: mon/OSDMonitor: record pre-octopus purged snaps with first octopus map X-Git-Tag: v15.1.0~2308^2~22 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4e5093cee357c79672991d1899d30dcbe22810ac;p=ceph.git mon/OSDMonitor: record pre-octopus purged snaps with first octopus map 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 --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 4cd7b9ab3b47..1811139fad50 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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 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; + } } }