From 8edc2f294cab738b336e5e708268eed778357c4d Mon Sep 17 00:00:00 2001 From: Gavin Chou Date: Sun, 14 Dec 2025 15:31:35 +0800 Subject: [PATCH 1/2] [Fix](recycler) Fix possible null pointer when first txn->get() failed --- cloud/src/recycler/recycler.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/cloud/src/recycler/recycler.cpp b/cloud/src/recycler/recycler.cpp index 7527b3b3b0879d..13fc11644a78e0 100644 --- a/cloud/src/recycler/recycler.cpp +++ b/cloud/src/recycler/recycler.cpp @@ -2967,11 +2967,11 @@ int InstanceRecycler::scan_and_recycle( }; std::unique_ptr it; - do { + while (it == nullptr /* may be not init */ || (it->more() && !stopped())) { if (get_range_retried > 1000) { - err = "txn_get exceeds max retry, may not scan all keys"; - ret = -1; - return -1; + err = "txn_get exceeds max retry(1000), may not scan all keys"; + ret = -2; + return ret; } int get_ret = txn_get(txn_kv_.get(), begin, end, it); if (get_ret != 0) { // txn kv may complain "Request for future version" @@ -2995,18 +2995,24 @@ int InstanceRecycler::scan_and_recycle( VLOG_DEBUG << "iterator has no more kvs. key=" << hex(k); } // if we want to continue scanning, the recycle_func should not return non-zero - if (recycle_func(k, v) != 0) { - err = "recycle_func error"; + int recycle_func_ret = recycle_func(k, v); + if (recycle_func_ret != 0) { + err = "recycle_func error, ret=" + std::to_string(recycle_func_ret); ret = -1; + return ret; } } begin.push_back('\x00'); // Update to next smallest key for iteration - // if we want to continue scanning, the recycle_func should not return non-zero - if (loop_done && loop_done() != 0) { - err = "loop_done error"; - ret = -1; + // if we want to continue scanning, the loop_done should not return non-zero + if (loop_done) { + int loop_done_ret = loop_done(); + if (loop_done_ret != 0) { + err = "loop_done error, ret=" + std::to_string(loop_done_ret); + ret = -1; + return ret; + } } - } while (it->more() && !stopped()); + } return ret; } From ed9e8149daa970b2e1961d1853aca48eca1b116e Mon Sep 17 00:00:00 2001 From: Gavin Chou Date: Sun, 14 Dec 2025 20:48:59 +0800 Subject: [PATCH 2/2] Fix UT --- cloud/src/recycler/recycler.cpp | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/cloud/src/recycler/recycler.cpp b/cloud/src/recycler/recycler.cpp index 13fc11644a78e0..4a7b7b499135ff 100644 --- a/cloud/src/recycler/recycler.cpp +++ b/cloud/src/recycler/recycler.cpp @@ -2969,9 +2969,9 @@ int InstanceRecycler::scan_and_recycle( std::unique_ptr it; while (it == nullptr /* may be not init */ || (it->more() && !stopped())) { if (get_range_retried > 1000) { - err = "txn_get exceeds max retry(1000), may not scan all keys"; - ret = -2; - return ret; + err = "txn_get exceeds max retry, may not scan all keys"; + ret = -1; + return -1; } int get_ret = txn_get(txn_kv_.get(), begin, end, it); if (get_ret != 0) { // txn kv may complain "Request for future version" @@ -2995,22 +2995,16 @@ int InstanceRecycler::scan_and_recycle( VLOG_DEBUG << "iterator has no more kvs. key=" << hex(k); } // if we want to continue scanning, the recycle_func should not return non-zero - int recycle_func_ret = recycle_func(k, v); - if (recycle_func_ret != 0) { - err = "recycle_func error, ret=" + std::to_string(recycle_func_ret); + if (recycle_func(k, v) != 0) { + err = "recycle_func error"; ret = -1; - return ret; } } begin.push_back('\x00'); // Update to next smallest key for iteration - // if we want to continue scanning, the loop_done should not return non-zero - if (loop_done) { - int loop_done_ret = loop_done(); - if (loop_done_ret != 0) { - err = "loop_done error, ret=" + std::to_string(loop_done_ret); - ret = -1; - return ret; - } + // if we want to continue scanning, the recycle_func should not return non-zero + if (loop_done && loop_done() != 0) { + err = "loop_done error"; + ret = -1; } } return ret;