From 65b7143cd431ae251540560540b0ec2f53fd9fc7 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 3 Jul 2019 13:29:15 -0500 Subject: [PATCH] osd: store purged_snaps history under separate object 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 --- src/osd/OSD.cc | 15 ++++++++++++--- src/osd/OSD.h | 6 ++++++ src/osd/SnapMapper.cc | 4 ++-- src/osd/SnapMapper.h | 13 ++++++++----- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 650adc9ca26..92c96a213d5 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -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 { diff --git a/src/osd/OSD.h b/src/osd/OSD.h index a64f7e25ceb..431404453a8 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -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; diff --git a/src/osd/SnapMapper.cc b/src/osd/SnapMapper.cc index 65a8dac0264..2e23f1e9375 100644 --- a/src/osd/SnapMapper.cc +++ b/src/osd/SnapMapper.cc @@ -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()) { diff --git a/src/osd/SnapMapper.h b/src/osd/SnapMapper.h index 3228feb1b22..552f6a35b9a 100644 --- a/src/osd/SnapMapper.h +++ b/src/osd/SnapMapper.h @@ -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( -- 2.39.5