This is an automated email from the ASF dual-hosted git repository.

chenBright pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brpc.git


The following commit(s) were added to refs/heads/master by this push:
     new d1c3f7cc Fix sparse FlatMap swap thumbnail reset (#3619)
d1c3f7cc is described below

commit d1c3f7cc1c3546c04f472d675c92190e93055521
Author: nkysg <[email protected]>
AuthorDate: Sun Oct 18 10:47:27 2026 +0800

    Fix sparse FlatMap swap thumbnail reset (#3619)
---
 src/butil/containers/flat_map_inl.h |  2 +-
 test/flat_map_unittest.cpp          | 27 +++++++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/butil/containers/flat_map_inl.h 
b/src/butil/containers/flat_map_inl.h
index 0319fd78..6c280810 100644
--- a/src/butil/containers/flat_map_inl.h
+++ b/src/butil/containers/flat_map_inl.h
@@ -352,7 +352,7 @@ void FlatMap<_K, _T, _H, _E, _S, _A, _M>::swap(
             _buckets = rhs._buckets;
             _thumbnail = rhs._thumbnail;
             rhs._buckets = rhs._default_buckets;
-            rhs._thumbnail = rhs._thumbnail;
+            rhs._thumbnail = rhs._default_thumbnail;
         } // else both are default buckets which has been swapped, so no need 
to swap `_buckets'.
     }
 
diff --git a/test/flat_map_unittest.cpp b/test/flat_map_unittest.cpp
index 45702149..43b7e7eb 100644
--- a/test/flat_map_unittest.cpp
+++ b/test/flat_map_unittest.cpp
@@ -1637,4 +1637,31 @@ TEST_F(FlatMapTest, multi) {
     ASSERT_NE(nullptr, value);
     ASSERT_EQ(std::vector<char>(64, 'b'), *value);
 }
+
+TEST_F(FlatMapTest, sparse_swap_default_and_dynamic) {
+    butil::SparseFlatMap<int, int> default_map;
+    butil::SparseFlatMap<int, int> dynamic_map;
+    ASSERT_EQ(0, dynamic_map.init(32));
+    dynamic_map[1] = 1;
+
+    default_map.swap(dynamic_map);
+    dynamic_map[2] = 2;
+    dynamic_map.clear();
+
+    ASSERT_NE(default_map.begin(), default_map.end());
+    ASSERT_EQ(1, *default_map.seek(1));
+}
+
+TEST_F(FlatMapTest, sparse_swap_does_not_leave_dangling_thumbnail) {
+    butil::SparseFlatMap<int, int> dynamic_map;
+    ASSERT_EQ(0, dynamic_map.init(32));
+    dynamic_map[1] = 1;
+    {
+        butil::SparseFlatMap<int, int> default_map;
+        default_map.swap(dynamic_map);
+    }
+
+    dynamic_map[2] = 2;
+    ASSERT_EQ(2, *dynamic_map.seek(2));
+}
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to