From acd7e903d3eb7745e92dbcbf2b851a77d0dc1929 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 7 Jun 2019 10:57:53 -0500 Subject: [PATCH] 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 --- src/mon/OSDMonitor.cc | 52 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 4 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 982b92acfc5..ce60ac187ae 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() -- 2.39.5