From: Mykola Golub Date: Thu, 30 Jul 2020 14:21:28 +0000 (+0100) Subject: osd: add and utilize OSD_FIXED_COLLECTION_LIST feature X-Git-Tag: v12.2.14~2^2~5 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=1f906dbee8028e23adb3af4fba06dc46a0471a3e;p=ceph.git osd: add and utilize OSD_FIXED_COLLECTION_LIST feature If all osds from upacting set have this feature set the backend can use the new "fixed" collection_list method, otherwise it fallbacks to the legacy method. Signed-off-by: Mykola Golub (cherry picked from commit 8f9d335bc7cccb221ca7316ee0c8f22198d0f9ef) Conflicts: src/include/ceph_features.h: trivial src/osd/PGBackend.h: trivial src/osd/PrimaryLogPG.h: PG::get_min_upacting_features instead of PeeringState::get_min_upacting_features --- diff --git a/src/include/ceph_features.h b/src/include/ceph_features.h index ac51eb246d5..c2d7e8e1262 100755 --- a/src/include/ceph_features.h +++ b/src/include/ceph_features.h @@ -104,7 +104,7 @@ DEFINE_CEPH_FEATURE(21, 2, RADOS_BACKOFF) // overlap DEFINE_CEPH_FEATURE(21, 2, OSDMAP_PG_UPMAP) // overlap DEFINE_CEPH_FEATURE(21, 2, CRUSH_CHOOSE_ARGS) // overlap DEFINE_CEPH_FEATURE_RETIRED(22, 1, BACKFILL_RESERVATION, JEWEL, LUMINOUS) - +DEFINE_CEPH_FEATURE(22, 2, OSD_FIXED_COLLECTION_LIST) DEFINE_CEPH_FEATURE(23, 1, MSG_AUTH) DEFINE_CEPH_FEATURE_RETIRED(24, 1, RECOVERY_RESERVATION, JEWEL, LUNINOUS) @@ -233,6 +233,7 @@ DEFINE_CEPH_FEATURE_DEPRECATED(63, 1, RESERVED_BROKEN, LUMINOUS) // client-facin CEPH_FEATURE_OSD_RECOVERY_DELETES | \ CEPH_FEATURE_CEPHX_V2 | \ CEPH_FEATURE_OSD_PGLOG_HARDLIMIT | \ + CEPH_FEATURE_OSD_FIXED_COLLECTION_LIST | \ 0ULL) #define CEPH_FEATURES_SUPPORTED_DEFAULT CEPH_FEATURES_ALL diff --git a/src/os/bluestore/BlueStore.cc b/src/os/bluestore/BlueStore.cc index dc9af555256..684227a360c 100644 --- a/src/os/bluestore/BlueStore.cc +++ b/src/os/bluestore/BlueStore.cc @@ -7953,7 +7953,7 @@ int BlueStore::_collection_list( << " start " << start << dendl; if (legacy) { it.reset(new SimpleCollectionListIterator( - cct, db->get_iterator(PREFIX_OBJ))); + db->get_iterator(PREFIX_OBJ))); } else { it.reset(new SortedCollectionListIterator( db->get_iterator(PREFIX_OBJ))); diff --git a/src/osd/PGBackend.cc b/src/osd/PGBackend.cc index e0a498b9de4..799828ec143 100644 --- a/src/osd/PGBackend.cc +++ b/src/osd/PGBackend.cc @@ -350,13 +350,24 @@ int PGBackend::objects_list_partial( while (!_next.is_max() && ls->size() < (unsigned)min) { vector objects; - r = store->collection_list( - ch, - _next, - ghobject_t::get_max(), - max - ls->size(), - &objects, - &_next); + if (HAVE_FEATURE(parent->min_upacting_features(), + OSD_FIXED_COLLECTION_LIST)) { + r = store->collection_list( + ch, + _next, + ghobject_t::get_max(), + max - ls->size(), + &objects, + &_next); + } else { + r = store->collection_list_legacy( + ch, + _next, + ghobject_t::get_max(), + max - ls->size(), + &objects, + &_next); + } if (r != 0) { derr << __func__ << " list collection " << ch << " got: " << cpp_strerror(r) << dendl; break; @@ -386,13 +397,25 @@ int PGBackend::objects_list_range( { assert(ls); vector objects; - int r = store->collection_list( - ch, - ghobject_t(start, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard), - ghobject_t(end, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard), - INT_MAX, - &objects, - NULL); + int r; + if (HAVE_FEATURE(parent->min_upacting_features(), + OSD_FIXED_COLLECTION_LIST)) { + r = store->collection_list( + ch, + ghobject_t(start, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard), + ghobject_t(end, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard), + INT_MAX, + &objects, + NULL); + } else { + r = store->collection_list_legacy( + ch, + ghobject_t(start, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard), + ghobject_t(end, ghobject_t::NO_GEN, get_parent()->whoami_shard().shard), + INT_MAX, + &objects, + NULL); + } ls->reserve(objects.size()); for (vector::iterator i = objects.begin(); i != objects.end(); diff --git a/src/osd/PGBackend.h b/src/osd/PGBackend.h index 6a249c1b493..08c9625d19c 100644 --- a/src/osd/PGBackend.h +++ b/src/osd/PGBackend.h @@ -265,6 +265,7 @@ typedef ceph::shared_ptr OSDMapRef; virtual pg_shard_t primary_shard() const = 0; virtual uint64_t min_peer_features() const = 0; + virtual uint64_t min_upacting_features() const = 0; virtual hobject_t get_temp_recovery_object(const hobject_t& target, eversion_t version) = 0; diff --git a/src/osd/PrimaryLogPG.h b/src/osd/PrimaryLogPG.h index ea211a537c1..384f3f19adb 100644 --- a/src/osd/PrimaryLogPG.h +++ b/src/osd/PrimaryLogPG.h @@ -446,6 +446,9 @@ public: uint64_t min_peer_features() const override { return get_min_peer_features(); } + uint64_t min_upacting_features() const override { + return get_min_upacting_features(); + } void send_message_osd_cluster( int peer, Message *m, epoch_t from_epoch) override;