From: Sage Weil Date: Fri, 7 Jun 2019 15:57:53 +0000 (-0500) Subject: mon/OSDMonitor: make {removed,purged}_snap storage more efficient X-Git-Tag: v15.1.0~2308^2~27 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=acd7e903d3eb7745e92dbcbf2b851a77d0dc1929;p=ceph.git mon/OSDMonitor: make {removed,purged}_snap storage more efficient Merge adjacent extents to keep the database smaller and lookups more efficient. Signed-off-by: Sage Weil --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 982b92acfc52..ce60ac187ae4 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -6275,10 +6275,54 @@ void OSDMonitor::insert_snap_update( epoch_t epoch, MonitorDBStore::TransactionRef t) { - bufferlist v; - string k = _make_snap_key_value(purged, pool, start, end - start, - pending_inc.epoch, &v); - t->put(OSD_SNAP_PREFIX, k, v); + snapid_t before_begin, before_end; + snapid_t after_begin, after_end; + int b = _lookup_snap(purged, pool, start - 1, + &before_begin, &before_end); + int a = _lookup_snap(purged, pool, end, + &after_begin, &after_end); + if (!b && !a) { + dout(10) << __func__ << (purged ? " (purged)" : " (removed)") + << " [" << start << "," << end << ") - joins [" + << before_begin << "," << before_end << ") and [" + << after_begin << "," << after_end << ")" << dendl; + // erase only the begin record; we'll overwrite the end one. + t->erase(OSD_SNAP_PREFIX, _make_snap_key(purged, pool, before_end - 1)); + bufferlist v; + string k = _make_snap_key_value(purged, pool, + before_begin, after_end - before_begin, + pending_inc.epoch, &v); + t->put(OSD_SNAP_PREFIX, k, v); + } else if (!b) { + dout(10) << __func__ << (purged ? " (purged)" : " (removed)") + << " [" << start << "," << end << ") - join with earlier [" + << before_begin << "," << before_end << ")" << dendl; + t->erase(OSD_SNAP_PREFIX, _make_snap_key(purged, pool, before_end - 1)); + bufferlist v; + string k = _make_snap_key_value(purged, pool, + before_begin, end - before_begin, + pending_inc.epoch, &v); + t->put(OSD_SNAP_PREFIX, k, v); + } else if (!a) { + dout(10) << __func__ << (purged ? " (purged)" : " (removed)") + << " [" << start << "," << end << ") - join with later [" + << after_begin << "," << after_end << ")" << dendl; + // overwrite after record + bufferlist v; + string k = _make_snap_key_value(purged, pool, + start, after_end - start, + pending_inc.epoch, &v); + t->put(OSD_SNAP_PREFIX, k, v); + } else { + dout(10) << __func__ << (purged ? " (purged)" : " (removed)") + << " [" << start << "," << end << ") - new" + << dendl; + bufferlist v; + string k = _make_snap_key_value(purged, pool, + start, end - start, + pending_inc.epoch, &v); + t->put(OSD_SNAP_PREFIX, k, v); + } } bool OSDMonitor::try_prune_purged_snaps()