]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: add and utilize OSD_FIXED_COLLECTION_LIST feature
authorMykola Golub <mgolub@suse.com>
Thu, 30 Jul 2020 14:21:28 +0000 (15:21 +0100)
committerMykola Golub <mgolub@suse.com>
Wed, 9 Sep 2020 09:13:51 +0000 (12:13 +0300)
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

src/include/ceph_features.h
src/os/bluestore/BlueStore.cc
src/osd/PGBackend.cc
src/osd/PGBackend.h
src/osd/PrimaryLogPG.h

index ac51eb246d5be64f5e6145f54cf416593b50f823..c2d7e8e1262528683bd01460999901b613bf49ee 100755 (executable)
@@ -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
index dc9af555256b3c74c4987a4be522a44ee5ddbae6..684227a360ce8a90e2e80b1004db2e1d5d0b3324 100644 (file)
@@ -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)));
index e0a498b9de451bf36380d9630472fb906fd6ca3f..799828ec143c3b6f2fe14b80d441e3acd7a7c9d9 100644 (file)
@@ -350,13 +350,24 @@ int PGBackend::objects_list_partial(
 
   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;
@@ -386,13 +397,25 @@ int PGBackend::objects_list_range(
 {
   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();
index 6a249c1b4931e58e85c39317e9ff00f7400e139f..08c9625d19cfcebf8ee5d1a247f3a88980798b7e 100644 (file)
@@ -265,6 +265,7 @@ typedef ceph::shared_ptr<const OSDMap> 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;
index ea211a537c1976814bcf2d4f9eefcd86af040121..384f3f19adb4e7fe8b52cbf63c7f92d368beab21 100644 (file)
@@ -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;