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 <mgolub@suse.com>
(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
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)
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
<< " 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)));
while (!_next.is_max() && ls->size() < (unsigned)min) {
vector<ghobject_t> 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;
{
assert(ls);
vector<ghobject_t> 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<ghobject_t>::iterator i = objects.begin();
i != objects.end();
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;
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;