From 844fb7ee28a989b5a19c5d91cd10f9d4e50cbcb3 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 (cherry picked from commit 2a67fc5e4cf37912b568ad3046f290023d06eb90) --- 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 ed7b92e2ea8a..de752d45ed55 100755 --- a/src/os/kstore/KStore.cc +++ b/src/os/kstore/KStore.cc @@ -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; -- 2.47.3