]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mon/OSDMonitor: make {removed,purged}_snap storage more efficient
authorSage Weil <sage@redhat.com>
Fri, 7 Jun 2019 15:57:53 +0000 (10:57 -0500)
committerSage Weil <sage@redhat.com>
Tue, 2 Jul 2019 13:37:50 +0000 (08:37 -0500)
Merge adjacent extents to keep the database smaller and lookups more
efficient.

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

index 982b92acfc523e358d1c33790cb632d9c48475cc..ce60ac187ae4aac65b012efd4a13eda38137d216 100644 (file)
@@ -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()