]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore: correct the exception condition when merging
authorXuehan Xu <xuxuehan@qianxin.com>
Wed, 11 Feb 2026 06:50:27 +0000 (14:50 +0800)
committerXuehan Xu <xuxuehan@qianxin.com>
Sat, 21 Feb 2026 12:24:01 +0000 (20:24 +0800)
rewritten fixed kv nodes

Fixes: https://tracker.ceph.com/issues/74798
Signed-off-by: Xuehan Xu <xuxuehan@qianxin.com>
src/crimson/os/seastore/btree/fixed_kv_node.h
src/crimson/os/seastore/lba/lba_btree_node.h

index fdd67e496561343faf8b93b6a263ebc6f0159273..22531d933a2e4a4173dccd0372aeab2aeeb29ecd 100644 (file)
@@ -526,8 +526,8 @@ struct FixedKVInternalNode
       auto it = pending_version.begin();
       while (it != pending_version.end() && iter != this->end()) {
         if (auto child = pending_version.children[it->get_offset()];
-            (is_valid_child_ptr(child) &&
-             (pending_version.is_pending() || child->_is_pending_io()))) {
+            is_valid_child_ptr(child) && child->_is_pending_io()) {
+          // skip the ones that the pending version is also modifying
           it++;
           continue;
         }
index 7944b8f6cec66ebee91c9db2b16effa38b48b6f6..c0faa45b880cfd8afa203dee31bb1005ed8a4610 100644 (file)
@@ -295,19 +295,25 @@ struct LBALeafNode
       auto &pending_version = static_cast<LBALeafNode&>(*copy_dest);
       auto it = pending_version.begin();
       while (it != pending_version.end() && iter != this->end()) {
-        if (iter->get_val().pladdr.is_laddr() ||
-            iter->get_val().pladdr.get_paddr().is_zero()) {
+        const auto &v1 = iter->get_val();
+        if (v1.pladdr.is_laddr() ||
+            v1.pladdr.get_paddr().is_zero()) {
           iter++;
           continue;
         }
+        if (const auto &v2 = it->get_val();
+            v2.pladdr.is_laddr() || v2.pladdr.get_paddr().is_zero()) {
+          it++;
+          continue;
+        }
         if (auto child = pending_version.children[it->get_offset()];
-            is_valid_child_ptr(child) &&
-            (pending_version.is_pending() || child->_is_pending_io())) {
+            is_valid_child_ptr(child) && child->_is_pending_io()) {
+          // skip the ones that the pending version is also modifying
           it++;
           continue;
         }
         if (it->get_key() == iter->get_key()) {
-          it->set_val(iter->get_val());
+          it->set_val(v1);
           it++;
           iter++;
         } else if (it->get_key() > iter->get_key()) {
@@ -330,7 +336,7 @@ struct LBALeafNode
 #ifndef NDEBUG
       for (auto &copy_dest : copy_dests.dests_by_key) {
         auto &pending_version = static_cast<LBALeafNode&>(*copy_dest);
-        ceph_assert(pending_version.is_pending());
+        assert(pending_version.is_pending());
       }
 #endif
       this->merge_content_to(t, copy_dests.dests_by_key);