From 2a67fc5e4cf37912b568ad3046f290023d06eb90 Mon Sep 17 00:00:00 2001 From: Mykola Golub Date: Wed, 19 Aug 2020 11:16:12 +0100 Subject: [PATCH] os/kstore: fix collection_list properly set next if end reached 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 --- src/os/kstore/KStore.cc | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/os/kstore/KStore.cc b/src/os/kstore/KStore.cc index 9c701fdbd89..8f6b19bda38 100644 --- a/src/os/kstore/KStore.cc +++ b/src/os/kstore/KStore.cc @@ -1495,14 +1495,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; @@ -1515,15 +1517,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; -- 2.39.5