]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
osd: store purged_snaps history under separate object
authorSage Weil <sage@redhat.com>
Wed, 3 Jul 2019 18:29:15 +0000 (13:29 -0500)
committerSage Weil <sage@redhat.com>
Wed, 3 Jul 2019 18:29:15 +0000 (13:29 -0500)
We can't put this in the snapmapper object because filestore does not
allow multiple concurrent omap iterators on the same object.  (This is a
limitation that could be fixed with some read/write locking, but not
without some significant changes to DBObjectMap; since that is old crufty
legacy code let's avoid touching it!)

Signed-off-by: Sage Weil <sage@redhat.com>
src/osd/OSD.cc
src/osd/OSD.h
src/osd/SnapMapper.cc
src/osd/SnapMapper.h

index 650adc9ca264dbbe589998b1e204c45840367e22..92c96a213d5dbcba6beba5ac101f39539d04f15d 100644 (file)
@@ -2883,6 +2883,14 @@ int OSD::init()
     if (r < 0)
       goto out;
   }
+  if (!store->exists(service.meta_ch, OSD::make_purged_snaps_oid())) {
+    dout(10) << "init creating/touching purged_snaps object" << dendl;
+    ObjectStore::Transaction t;
+    t.touch(coll_t::meta(), OSD::make_purged_snaps_oid());
+    r = store->queue_transaction(service.meta_ch, std::move(t));
+    if (r < 0)
+      goto out;
+  }
 
   class_handler = new ClassHandler(cct);
   cls_initialize(class_handler);
@@ -5529,7 +5537,7 @@ void OSD::handle_get_purged_snaps_reply(MMonGetPurgedSnapsReply *m)
     goto out;
   }
   SnapMapper::record_purged_snaps(cct, store, service.meta_ch,
-                                 make_snapmapper_oid(), &t,
+                                 make_purged_snaps_oid(), &t,
                                  m->purged_snaps);
   superblock.purged_snaps_last = m->last;
   write_superblock(t);
@@ -6633,7 +6641,8 @@ void OSD::scrub_purged_snaps()
   dout(10) << __func__ << dendl;
   ceph_assert(ceph_mutex_is_locked(osd_lock));
   SnapMapper::Scrubber s(cct, store, service.meta_ch,
-                        make_snapmapper_oid());
+                        make_snapmapper_oid(),
+                        make_purged_snaps_oid());
   clog->debug() << "purged_snaps scrub starts";
   osd_lock.unlock();
   s.run();
@@ -7812,7 +7821,7 @@ void OSD::handle_osd_map(MOSDMap *m)
   // record new purged_snaps
   if (superblock.purged_snaps_last == start - 1) {
     SnapMapper::record_purged_snaps(cct, store, service.meta_ch,
-                                   make_snapmapper_oid(), &t,
+                                   make_purged_snaps_oid(), &t,
                                    purged_snaps);
     superblock.purged_snaps_last = last;
   } else {
index a64f7e25ceb0d4d06dcdbe96c945b5b2fb1e7d8d..431404453a87c40267c5863da97a6008aa3ed15e 100644 (file)
@@ -1184,6 +1184,12 @@ public:
        object_t("snapmapper"),
        0)));
   }
+  static ghobject_t make_purged_snaps_oid() {
+    return ghobject_t(hobject_t(
+      sobject_t(
+       object_t("purged_snaps"),
+       0)));
+  }
 
   static ghobject_t make_pg_log_oid(spg_t pg) {
     stringstream ss;
index 65a8dac0264d6b3fb4628e7f544a92ab5c9b8082..2e23f1e93758d7193284d36deed02166bf1d3a56 100644 (file)
@@ -586,11 +586,11 @@ void SnapMapper::Scrubber::run()
 
   _init();
 
-  psit = store->get_omap_iterator(ch, hoid);
+  psit = store->get_omap_iterator(ch, purged_snaps_hoid);
   psit->upper_bound(PURGED_SNAP_PREFIX);
   _parse_p();
 
-  mapit = store->get_omap_iterator(ch, hoid);
+  mapit = store->get_omap_iterator(ch, mapping_hoid);
   mapit->upper_bound(MAPPING_PREFIX);
 
   while (_parse_m()) {
index 3228feb1b22e1c62d4d318bd3b7e2ac322bc47e6..552f6a35b9ad40722965056d25a6e705b1c467c4 100644 (file)
@@ -142,7 +142,8 @@ public:
     CephContext *cct;
     ObjectStore *store;
     ObjectStore::CollectionHandle ch;
-    ghobject_t hoid;
+    ghobject_t mapping_hoid;
+    ghobject_t purged_snaps_hoid;
 
     ObjectMap::ObjectMapIterator psit;
     int64_t pool;
@@ -162,12 +163,13 @@ public:
       CephContext *cct,
       ObjectStore *store,
       ObjectStore::CollectionHandle& ch,
-      ghobject_t hoid)
+      ghobject_t mapping_hoid,
+      ghobject_t purged_snaps_hoid)
       : cct(cct),
        store(store),
        ch(ch),
-       hoid(hoid) {}
-
+       mapping_hoid(mapping_hoid),
+       purged_snaps_hoid(purged_snaps_hoid) {}
 
     void _init();
     void run();
@@ -191,7 +193,8 @@ public:
     CephContext *cct,
     ObjectStore *store,
     ObjectStore::CollectionHandle& ch,
-    ghobject_t hoid);
+    ghobject_t mapper_hoid,
+    ghobject_t purged_snaps_hoid);
 
 private:
   static int _lookup_purged_snap(