]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/kstore: fix collection_list properly set next if end reached
authorMykola Golub <mgolub@suse.com>
Wed, 19 Aug 2020 10:16:12 +0000 (11:16 +0100)
committerMykola Golub <mgolub@suse.com>
Tue, 8 Sep 2020 15:19:35 +0000 (18:19 +0300)
Previously it was setting it to GMAX (happened when one had end
set to not GMAX and max set to INT_MAX).

Signed-off-by: Mykola Golub <mgolub@suse.com>
(cherry picked from commit 2a67fc5e4cf37912b568ad3046f290023d06eb90)

src/os/kstore/KStore.cc

index 2772d523310aa9e99ed2c51d3791061d79579525..00cce936f1ecfc7292b37c7b6520ecf7fc550634 100644 (file)
@@ -1531,14 +1531,16 @@ int KStore::_collection_list(
   if (end.hobj.is_max()) {
     pend = temp ? temp_end_key : end_key;
   } else {
-    get_object_key(cct, end, &end_key);
     if (end.hobj.is_temp()) {
       if (temp)
-       pend = end_key;
+        get_object_key(cct, end, &pend);
       else
        goto out;
     } else {
-      pend = temp ? temp_end_key : end_key;
+      if (temp)
+        pend = temp_end_key;
+      else
+        get_object_key(cct, end, &pend);
     }
   }
   dout(20) << __func__ << " pend " << pretty_binary_string(pend) << dendl;
@@ -1551,15 +1553,28 @@ int KStore::_collection_list(
                 << " > " << end << dendl;
       if (temp) {
        if (end.hobj.is_temp()) {
+          if (it->valid() && it->key() < temp_end_key) {
+            int r = get_key_object(it->key(), pnext);
+            ceph_assert(r == 0);
+            set_next = true;
+          }
          break;
        }
        dout(30) << __func__ << " switch to non-temp namespace" << dendl;
        temp = false;
        it->upper_bound(start_key);
-       pend = end_key;
+        if (end.hobj.is_max())
+          pend = end_key;
+        else
+          get_object_key(cct, end, &pend);
        dout(30) << __func__ << " pend " << pretty_binary_string(pend) << dendl;
        continue;
       }
+      if (it->valid() && it->key() < end_key) {
+        int r = get_key_object(it->key(), pnext);
+        ceph_assert(r == 0);
+        set_next = true;
+      }
       break;
     }
     dout(20) << __func__ << " key " << pretty_binary_string(it->key()) << dendl;