From: Matan Breizman Date: Tue, 18 Jul 2023 16:08:23 +0000 (+0000) Subject: osd/OSD: remove `skip_maps` X-Git-Tag: v19.0.0~199^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9897164265726895eeee2348ee679aed03e75ea1;p=ceph.git osd/OSD: remove `skip_maps` the superblock now stores an interval_set which supports non-contiguous osdmap history. Signed-off-by: Matan Breizman --- diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index ccb7435332b3..157881ccbe40 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -940,7 +940,6 @@ seastar::future<> OSD::_handle_osd_map(Ref m) return seastar::now(); } // missing some? - bool skip_maps = false; epoch_t start = superblock.get_newest_map() + 1; if (first > start) { logger().info("handle_osd_map message skips epochs {}..{}", @@ -956,8 +955,6 @@ seastar::future<> OSD::_handle_osd_map(Ref m) return get_shard_services().osdmap_subscribe( m->cluster_osdmap_trim_lower_bound - 1, true); } - skip_maps = true; - start = first; } return seastar::do_with(ceph::os::Transaction{}, diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 2c1d2441b769..1fd6b8eec3a8 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -7930,40 +7930,30 @@ void OSD::osdmap_subscribe(version_t epoch, bool force_request) } } -void OSD::trim_maps(epoch_t oldest, bool skip_maps) +void OSD::trim_maps(epoch_t oldest) { epoch_t min = std::min(oldest, service.map_cache.cached_key_lower_bound()); dout(20) << __func__ << ": min=" << min << " oldest_map=" - << superblock.get_oldest_map() << " skip_maps=" << skip_maps - << dendl; + << superblock.get_oldest_map() << dendl; if (min <= superblock.get_oldest_map()) return; // Trim from the superblock's oldest_map up to `min`. // Break if we have exceeded the txn target size. - // If skip_maps is true, we will trim up `min` unconditionally. ObjectStore::Transaction t; - while (superblock.superblock.get_oldest_map() < min) { - dout(20) << " removing old osdmap epoch " << superblock.superblock.get_oldest_map() << dendl; - t.remove(coll_t::meta(), get_osdmap_pobject_name(superblock.superblock.get_oldest_map())); - t.remove(coll_t::meta(), get_inc_osdmap_pobject_name(superblock.superblock.get_oldest_map())); + while (superblock.get_oldest_map() < min && + t.get_num_ops() < cct->_conf->osd_target_transaction_size) { + dout(20) << " removing old osdmap epoch " << superblock.get_oldest_map() << dendl; + t.remove(coll_t::meta(), get_osdmap_pobject_name(superblock.get_oldest_map())); + t.remove(coll_t::meta(), get_inc_osdmap_pobject_name(superblock.get_oldest_map())); superblock.maps.erase(superblock.get_oldest_map()); - if (t.get_num_ops() > cct->_conf->osd_target_transaction_size) { - service.publish_superblock(superblock); - write_superblock(cct, superblock, t); - int tr = store->queue_transaction(service.meta_ch, t.claim_and_reset(), nullptr); - ceph_assert(tr == 0); - if (skip_maps == false) { - break; - } - } - } - if (t.get_num_ops() > 0) { - service.publish_superblock(superblock); - write_superblock(cct, superblock, t); - int tr = store->queue_transaction(service.meta_ch, std::move(t), nullptr); - ceph_assert(tr == 0); } + + service.publish_superblock(superblock); + write_superblock(cct, superblock, t); + int tr = store->queue_transaction(service.meta_ch, std::move(t), nullptr); + ceph_assert(tr == 0); + // we should not trim past service.map_cache.cached_key_lower_bound() // as there may still be PGs with those map epochs recorded. ceph_assert(min <= service.map_cache.cached_key_lower_bound()); @@ -8068,8 +8058,6 @@ void OSD::handle_osd_map(MOSDMap *m) return; } - // missing some? - bool skip_maps = false; if (first > superblock.get_newest_map() + 1) { dout(10) << "handle_osd_map message skips epochs " << superblock.get_newest_map() + 1 << ".." << (first-1) << dendl; @@ -8087,10 +8075,6 @@ void OSD::handle_osd_map(MOSDMap *m) m->put(); return; } - // The superblock's oldest_map should be moved forward (skipped) - // to the `first` osdmap of the incoming MOSDMap message. - // Trim all of the skipped osdmaps before updating the oldest_map. - skip_maps = true; } ObjectStore::Transaction t; @@ -8211,7 +8195,7 @@ void OSD::handle_osd_map(MOSDMap *m) } if (!superblock.maps.empty()) { - trim_maps(m->cluster_osdmap_trim_lower_bound, skip_maps); + trim_maps(m->cluster_osdmap_trim_lower_bound); pg_num_history.prune(superblock.get_oldest_map()); } superblock.insert_osdmap_epochs(first, last); diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 8ed960d96055..231050d8cc2f 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1685,7 +1685,7 @@ protected: void handle_osd_map(class MOSDMap *m); void _committed_osd_maps(epoch_t first, epoch_t last, class MOSDMap *m); - void trim_maps(epoch_t oldest, bool skip_maps); + void trim_maps(epoch_t oldest); void note_down_osd(int osd); void note_up_osd(int osd); friend struct C_OnMapCommit;