]> git.apps.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>
Wed, 9 Sep 2020 09:13:51 +0000 (12:13 +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 ed7b92e2ea8a8e494d636f47b5bf95a145971004..de752d45ed55a324df0b9b1c2faa88a7858f422e 100755 (executable)
@@ -1505,14 +1505,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;
@@ -1525,15 +1527,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;